这篇文章的目的很简单,如何在一天之内搭好EPC。之所以重写一遍是因为之前参考的中文社区的帖子发现有一些必要的技巧的操作没有提,还是走了一些弯路。在更换内核失败后,我重装电脑,在一天时间内还原重建了EPC。因此觉得有必要分享一下快速搭建的心得。命令都是可以一键复制的。过程有参考中文社区的帖子:
https://blog.csdn.net/u013429928/article/details/75110371
如果有阅读英文的习惯,强烈推荐直接关掉中文页面,参考OAI官网的指导:
https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/HowToConnectCOTSUEwithOAIeNBNew
和我一样的初学者,请务必加入邮件列表(mailing list),可以在邮件列表问大佬问题和查找自己遇到的问题。至少subscribe 邮件列表中的openair5g for user 和openair-cn for user。由于OAI的讨论效率比较低,如果身边的同学/同事没有熟悉OAI的,大多问题我们只能求助于邮件列表了。如何加入邮件列表:
https://blog.csdn.net/qq_42030961/article/details/82983264
0、实际布局
我的搭建是EPC和eNB分开的,用的是USRP B210,这也是官方强烈推荐的入门配置。另外,请注意带有All in one的指南都是eNB和EPC装在一台机器上的,谨慎参考。
我的实际搭建模型是通过交换机相连的,如下文:
https://blog.csdn.net/qq_42030961/article/details/82751991
言归正传,接下来是搭建正文。
1、系统准备
EPC的系统可以直接用Ubuntu 16.04,内核一般是4.15-generic,不用更换。笔者的电脑是Ubuntu 16.04.2,内核是自带的4.15.0-34,可以成功编译EPC。EPC其实对内核非常敏感,很多怎么查都查不出来的错误都是由内核不适应导致的。有一篇教程推荐的4.7.7 oaiepc 内核,在这里不推荐,因为笔者用这款内核出现了MME编译不过的问题。报如下错:
\OPENAIRCN_DIR = /home/nano/openair-cn
Initializing OAI Logging
Initializing MSC logs
Initializing MSC logs Done
Function s6a_init (&mme_config) has failed
returning 22
(2018-10-12)更新。以下也是可以成功的版本:
Ubuntu 16.04
内核版本:4.13.0-39- low latency kernel
对你没有看错,是lowlatency 内核,尽管EPC不需要。
2、获取openair-cn源码
首先安装git :
sudo apt-get update
sudo apt-get install subversion git
git安装好之后,克隆源码:
git clone https://gitlab.eurecom.fr/oai/openair-cn.git
这里说一句,VPN访问速度不好的同学可能会克隆不下来,遇到EOF,很烦躁。这种情况,如果是挂VPN下载的,可以做
sudo gedit ~/.gitconfig
在打开的窗口输入
[http]
proxy = http://127.0.0.1:1080
[https]
proxy = https://127.0.0.1:1080
上述操作是在挂VPN的条件下修改GIT配置,如果没有挂VPN就不要执行上述操作了。作者也是IT小白,看不懂命令是干嘛的,但是确实管用。同时,我觉得我是初学者,喜欢用图形化界面,比如像记事本一样的gedit。萌新用vi会觉得痛苦异常。如果操作完依然克隆不下来,换个好的VPN重新克隆吧。点开网址下载的操作是不行的,下载无法得到git仓库,后面会出错(我试过了)。这个操作同样适用于克隆openairinterface5g的时候克隆不下来的情况。如果自己确实克隆不了,请求助会玩VPN的同学让他帮你克隆然后完整的发给你。按上面的代码执行克隆后,openair-cn应该在Home目录了。
3. 额外必要安装和配置FQDN
克隆完成源码后,执行
git checkout -b v0.5.0
这个操作意思是把版本换为tag 0.5.0(OAI社区强烈推荐),但是我看到中文社区居然都没有提及这个。
切换完以后,先查询主机名
hostname
这里就以方丈之名“wty”为例吧,请记住你的主机名。其实主机名叫什么名字并不关键,不需要特地改成官方的案例“nano”。查询完成后编辑host信息,执行:
sudo gedit /etc/hosts
打开后更改和加入你的信息:
127.0.0.1 localhost
127.0.1.1 wty.openair4G.eur wty
127.0.1.1 hss.openair4G.eur hss
编辑完之后执行
hostname -f
看到输出为 wty.openair4G.eur ,说明更改成功。接下来需要额外安装一些东西,以下安装为基本引用中文社区的教程,我删去了必要的文字,跟着安装就好了。更详细的可以查看之前引用的那篇教程。
(1)安装mysql-server
sudo apt-get install mysql-server
密码自己设置,但是要记住,偷懒就和Linux的root密码一样就完事了。
(2)安装apache2:
sudo apt-get install apache2
测试apache2:
浏览器访问 localhost或者127.0.0.1 会出现apache2主页 (注:不可开VPN,否则不会出现)
(3) 安装php
sudo apt-get install php7.0
sudo apt-get install libapache2-mod-php7.0
sudo service apache2 restart
测试php
sudo gedit /var/www/html/info.php
在该文件里添加php语句:
Hello World! "?>
保存退出,然后浏览器访问 localhost/info.php,浏览器会显示hello world页面(不可挂VPN!)
(3) 安装mysql
sudo apt-get install mysql-server mysql-client
测试mysql
输入 mysql –uroot –p 输入安装mysql时设置的root密码,会出现mysql操作界面(我的好像不要输密码,也不会出来,不碍事)
(4) 安装 phpmyadmin
sudo apt-get install phpmyadmin
sudo ln -s /usr/share/phpmyadmin /var/www/html
测试phpmyadmin:
浏览器访问localhost/phpmyadmin或者127.0.0.1/phpmyadmin 浏览器会显示数据库登录页面
如果报错:mbstringextension is missing.Please check your PHP configuration. (我是每次装都报这个错)
解决办法:
sudo gedit /etc/php/7.0/mods-available/json.ini
把文件里第二行的分号去掉,保存退出,重启网络:
sudo service apache2 restart
4.编译EPC
cd openair-cn
git checkout develop
git pull
cd scripts
./build_mme -i
./build_hss -i
./build_spgw -i
无红色报错说明安装成功,一般来说比较容易,不是出错的地方。
注1:以上命令只需跑一次就行了,命令的意思是补充未安装到的包(Need to run only once to install missing packages)
注2:build的时候请不要挂机。如果网速很差,中间很可能遇到EOF(因为安装freeDiameter的时候好像要从外网clone东西)
5.配置EPC
(1)文件拷贝
执行:
sudo mkdir -p /usr/local/etc/oai/freeDiameter
sudo cp ~/openair-cn/etc/mme.conf /usr/local/etc/oai
sudo cp ~/openair-cn/etc/hss.conf /usr/local/etc/oai
sudo cp ~/openair-cn/etc/spgw.conf /usr/local/etc/oai
sudo cp ~/openair-cn/etc/acl.conf /usr/local/etc/oai/freeDiameter
sudo cp ~/openair-cn/etc/mme_fd.conf /usr/local/etc/oai/freeDiameter
sudo cp ~/openair-cn/etc/hss_fd.conf /usr/local/etc/oai/freeDiameter
(2)MME配置
执行ifconfig查询自己的网卡名、IP地址和掩码,记下来。
ifconfig
例:图中网卡名是“eno16777736”,ip地址是“10.10.60.63” (图片取自百度)
sudo gedit /usr/local/etc/oai/mme.conf
核对和修改成以下信息,其中
MME_INTERFACE_NAME_FOR_S1_MME = “eth0”;
MME_IPV4_ADDRESS_FOR_S1_MME = “192.168.12.62/24”;
需要改成刚刚查到的电脑的网卡名的ip地址。ip后面跟着的“/24”指的是掩码长度,如 255.255.255.0 就是24(255化成二进制是8个1,3个255就是24了,其他依此类推)。主要是上面两个,其他信息确认一下就好:
REALM = "openair4G.eur";
S6A :
{
S6A_CONF = "/usr/local/etc/oai/freeDiameter/mme_fd.conf"; # YOUR MME freeDiameter config file path
HSS_HOSTNAME = "hss"; # THE HSS HOSTNAME
};
GUMMEI_LIST = (
{MCC="208" ; MNC="93"; MME_GID="4" ; MME_CODE="1"; } # YOUR GUMMEI CONFIG HERE
);
TAI_LIST = (
{MCC="208" ; MNC="93"; TAC = "1"; } # YOUR PLMN CONFIG HERE
);
NETWORK_INTERFACES :
{
# MME binded interface for S1-C or S1-MME communication (S1AP), can be ethernet interface, virtual ethernet interface, we don't advise wireless interfaces
MME_INTERFACE_NAME_FOR_S1_MME = "eth0"; # YOUR NETWORK CONFIG HERE
MME_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.62/24"; # YOUR NETWORK CONFIG HERE
# MME binded interface for S11 communication (GTPV2-C)
MME_INTERFACE_NAME_FOR_S11_MME = "lo"; # YOUR NETWORK CONFIG HERE
MME_IPV4_ADDRESS_FOR_S11_MME = "127.0.11.1/8"; # YOUR NETWORK CONFIG HERE
MME_PORT_FOR_S11_MME = 2123; # YOUR NETWORK CONFIG HERE
};
S-GW :
{
# S-GW binded interface for S11 communication (GTPV2-C), if none selected the ITTI message interface is used
SGW_IPV4_ADDRESS_FOR_S11 = "127.0.11.2/8"; # YOUR NETWORK CONFIG HERE
};
(3)SPGW配置
sudo gedit /usr/local/etc/oai/spgw.conf
标准配置如下,请一项一项对着认真修改,下同,不赘述。重点来了,请在
PGW_INTERFACE_NAME_FOR_SGI = “eth0”;
这行代码之后添加以下代码(在我底下的代码块里也加了,但是这行代码源码是没有的!)。
PGW_IPV4_ADDRESS_FOR_SGI = “192.168.1.113/24”
IP改成自己的。官方的notes说了要加这行,但是大部分中文社区都没有注意到。剩下的就请自己核对了:
S-GW :
{
NETWORK_INTERFACES :
{
# S-GW binded interface for S11 communication (GTPV2-C), if none selected the ITTI message interface is used
SGW_INTERFACE_NAME_FOR_S11 = "lo"; # YOUR NETWORK CONFIG HERE
SGW_IPV4_ADDRESS_FOR_S11 = "127.0.11.2/8"; # YOUR NETWORK CONFIG HERE
# S-GW binded interface for S1-U communication (GTPV1-U) can be ethernet interface, virtual ethernet interface, we don't advise wireless interfaces
SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP = "eth0"; # YOUR NETWORK CONFIG HERE, USE "lo" if S-GW run on eNB host
SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP = "192.168.12.62/24"; # YOUR NETWORK CONFIG HERE
SGW_IPV4_PORT_FOR_S1U_S12_S4_UP = 2152; # PREFER NOT CHANGE UNLESS YOU KNOW WHAT YOU ARE DOING
# S-GW binded interface for S5 or S8 communication, not implemented, so leave it to none
SGW_INTERFACE_NAME_FOR_S5_S8_UP = "none"; # DO NOT CHANGE (NOT IMPLEMENTED YET)
SGW_IPV4_ADDRESS_FOR_S5_S8_UP = "0.0.0.0/24"; # DO NOT CHANGE (NOT IMPLEMENTED YET)
};
...
}
P-GW =
{
NETWORK_INTERFACES :
{
# P-GW binded interface for S5 or S8 communication, not implemented, so leave it to none
PGW_INTERFACE_NAME_FOR_S5_S8 = "none"; # DO NOT CHANGE (NOT IMPLEMENTED YET)
PGW_IPV4_ADDRESS_FOR_S5_S8 = "0.0.0.0/24"; # DO NOT CHANGE (NOT IMPLEMENTED YET)
# P-GW binded interface for SGI (egress/ingress internet traffic)
PGW_INTERFACE_NAME_FOR_SGI = "eth0"; # YOUR NETWORK CONFIG HERE
PGW_IPV4_ADDRESS_FOR_SGI = "192.168.1.113/24" #Add this yourself
PGW_MASQUERADE_SGI = "yes"; # YOUR NETWORK CONFIG HERE
UE_TCP_MSS_CLAMPING = "no"; # STRING, {"yes", "no"}.
};
...
# DNS address communicated to UEs
DEFAULT_DNS_IPV4_ADDRESS = "8.8.8.8"; # YOUR NETWORK CONFIG HERE
DEFAULT_DNS_SEC_IPV4_ADDRESS = "8.8.4.4"; # YOUR NETWORK CONFIG HERE
...
}
(4)HSS freediameter 配置
sudo gedit /usr/local/etc/oai/freeDiameter/hss_fd.conf
确认信息如下:
Identity = "hss.openair4G.eur";
Realm = "openair4G.eur";
(5)MME freediameter配置
sudo gedit /usr/local/etc/oai/freeDiameter/mme_fd.conf
确认信息如下:
Identity = "wty.openair4G.eur";
Realm = "openair4G.eur";
ConnectPeer= "hss.openair4G.eur" { ConnectTo = "127.0.0.1"; No_SCTP ; No_IPv6; Prefer_TCP; No_TLS; port = 3868; realm = "openair4G.eur";};
这里确认Identity就行。identity就是hostname -f显示的名字,上面也修改过了。
(6)HSS配置
sudo gedit /usr/local/etc/oai/hss.conf
确认信息如下:
MYSQL_user = "root";
MYSQL_pass = "123"; #Put here the root password of mysql database that was provided during installation
OPERATOR_key = "1006020f0a478bf6b699f15c062e42b3"; # OP key for oai_db.sql, Must match to that of UE Sim card, OP_Key
其中OPERATOR_key可以先不管,用这个默认的就可以,是后面SIM卡相关信息。password 自己设置一个喜欢的就好,用户名是root千万不要修改。
6.运行EPC
请注意运行的顺序,先HSS,再MME,再SPGW。其实只要保证HSS最先运行就行。
(1)注册证书:
cd ~/openair-cn/scripts
./check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ hss.openair4G.eur
./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter/ wty.openair4G.eur
上面的wty是要替换的。
(2)编译HSS
第一次运行:
cd ~/openair-cn/scripts
sudo ./build_hss -c
./run_hss -i ~/openair-cn/src/oai_hss/db/oai_db.sql
注:./run_hss -i ~/openair-cn/src/oai_hss/db/oai_db.sql 只需要第一次运行的时候注册数据库,后面不需要运行这个了。
注册以后如果需要运行HSS,使用的操作为:
cd ~/openair-cn/scripts
./run_hss
MME和SPGW也是一样的,下面就不写了。
(3)编译MME
新开一个终端
cd ~/openair-cn/scripts
sudo ./build_mme
./run_mme
注:之前MME一直报错S6A接口未通,其实是因为内核不对引起的。一个字,换!
https://blog.csdn.net/qq_42030961/article/details/82740315
(4)编译SPGW
新开一个终端
cd ~/openair-cn/scripts
sudo ./build_spgw
./run_spgw
无报错你就能看到三个终端都编译成功了。如下:
7、其他
在浏览器中输入:
localhost/phpmyadmin
用5(6)中的账号和密码登录,依次进入database-oai_db-mmeidentity,查看一下里面是否有wty.openair4G.eur的账户,如果没有,里面有edit,可以把yang.openair4G.eur 改成你的机名。很关键!不然HSS会把你当做僵尸用户。
就算没有搞定eNB的编译,EPC三个窗口是可以不需要ENB的接通来完成编译和运行的。总的来说,EPC的搭建比较简单,大部分的时间都花在了克隆和下载文件。
如果有什么问题我遗漏了,欢迎在评论区和我讨论。