本文说明了在ubuntu18.04虚拟机中,使用rfsimulator代替usrp进行仿真,搭建OAI的具体过程
1、 使用VMware安装虚拟机,选择ubuntu18.04
2、 安装完系统之后先调整屏幕大小(安装vmware tools)
3、 安装完成后,在Linux系统中打开终端,输入命令
apt-get update
apt-get upgrade
4、 安装git并配置git
sudo apt install git
git config --global user.name "Laurent"
git config --global user.email "[email protected]"
5、将OAI存储库添加为授权的远程系统
echo -n | openssl s_client -showcerts -connect gitlab.eurecom.fr:443 2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-certificates.crt
在不换源的情况下,使用apt下载包或者依赖时可能会失败,因为原来的软件源的服务器在国外,换成国内的之后使用apt-get install会畅通无阻:
sudo apt-get install libboost-all-dev libusb-1.0-0-dev python-mako doxygen python-docutils python-requests python3-pip cmake build-essential
pip3 install mako numpy
git clone git://github.com/EttusResearch/uhd.git
(若出错可往下翻)
cd uhd; mkdir host/build; cd host/build
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make -j4
(若出错可往下翻)
sudo make install
sudo ldconfig
sudo /usr/lib/uhd/utils/uhd_images_downloader.py
(若出错可往下翻)
上述安装过程中遇到的问题:
git config --global http.proxy 'socks5://127.0.0.1:1080'
git config --global https.proxy 'socks5://127.0.0.1:1080'
其中1080是端口号,根据自己配置的端口号设置(我是1088)
取消http代理:
git config --global --unset http.proxy
git config --global --unset https.proxy
错误信息:g++ internal compiler error:Killed(program cc1plus),同时系统会很卡
原因:内存分配不够,在虚拟机里我给ubuntu分配的2g内存,还是太卡了,改成分配3g内存(有条件的可以分配的更多一些)之后就可以正常make
cd ~
wget https://open-cells.com/opencells-mods-20190923.tgz
tar xf opencells-mods-20190923.tgz
git clone https://gitlab.eurecom.fr/oai/openair-cn.git
执行这一步的时候,由于需要在gitlab上下载项目,且需要登录账户;
但gitlab目前只允许中科大学生注册,只能用之前注册过的账号
cd openair-cn
git checkout develop
终端输入git log之后可以看到:
第一个版本号的(应该是哈希值)和期望值是一样的,说明epc安装无误。
按q退出日志
git apply ~/opencells-mods/EPC.patch
本行语句只运行一遍即可,没有成功的显示,如果运行两次或以上,则会显示打补丁失败
cd openair-cn; source oaienv; cd scripts
./build_hss -i
Answer yes to install: freeDiameter 1.2.0;
在运行完成之后显示未编译完成(暂时先不用管):
sudo mysql -u root << END
USE mysql;
UPDATE user SET plugin='mysql_native_password' WHERE User='root';
FLUSH PRIVILEGES;
END
sudo systemctl restart mysql.service
sudo mysql_secure_installation
从官网教程中摘录的安装时的注意事项:
The last command will ask a few questions(最后一个命令):
./build_mme -i
同样,在运行完成之后显示未编译完成(暂时先不用管)
./build_spgw -i
Do you want to install libgtpnl ?
同样,在运行完成之后显示未编译完成(暂时先不用管)
cd openair-cn; source oaienv; cd scripts
./build_hss
./build_mme
./build_spgw
之前编译未完成的在此处全部编译完成
git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git
cd openairinterface5g
git checkout develop
We tested with commit edb74831dabf79686eb5a92fbf8fc06e6b267d35:
此时执行
git log
会发现此时所处的递交版本和官方测试过的版本不一样,所以此处需要执行:
git checkout edb74831dabf79686eb5a92fbf8fc06e6b267d35
再进行 git log 就可以看到该哈希值完全一样
source oaienv
./cmake_targets/build_oai -I
执行该命令时,可能遇到 build have failed 的错误,一般来说是因为访问外网比较困难,会出现下载失败。
若是在Installing ASN1时出现 build 错误,可以多尝试几次,或者换个时间段(网上有说法是 找到 /cmake target/tools/build helper 文件,将里面涉及gist.github 的这一行代码注释掉):
如图选中的两行,用#注释
我用的就是这种方法,注释之后可以继续编译,暂时也没问题。
若是在 Installing google Protobuf from sources时出现build错误:
sudo gedit build_helper
./cmake_targets/build_oai -w USRP --eNB --UE
(此条命令编译的是4G的基站和终端)
./cmake_targets/build_oai -w USRP --gNB --nrUE
(此条命令编译的是5G的基站和终端)
重新执行:
sudo git checkout develop
若出现:
是因为之前修改了build_helper文件,执行:
sudo git reset --hard
用远程代码库的文件完全覆盖本地的版本
sudo git checkout develop
./cmake_targets/build_oai -w USRP --gNB --nrUE
此时重新执行就可以编译gNB
打开enb配置文件:
sudo gedit ~/opencells-mods/enb.10MHz.b200
查看配置文件是否为:
////////// MME parameters:
mme_ip_address = ( { ipv4 = "127.0.0.20";
ipv6 = "192:168:30::17";
active = "yes";
preference = "ipv4";
}
);
NETWORK_INTERFACES :
{
ENB_INTERFACE_NAME_FOR_S1_MME = "lo";
ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.10/8";
ENB_INTERFACE_NAME_FOR_S1U = "lo";
ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.10/8";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
};
另外,还需要设置:
tracking_area_code = “1”;
mobile_country_code = “208”;
mobile_network_code = “92”;
sudo mkdir -p /usr/local/etc/oai
sudo cp -rp ~/opencells-mods/config_epc/ /usr/local/etc/oai
cd openair-cn; source oaienv; cd scripts
./check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter hss.OpenAir5G.Alliance
./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter mme.OpenAir5G.Alliance
查看网卡名字和IP地址
ifconfig
图中网卡名是“ens33”
sudo gedit /usr/local/etc/oai/spgw.conf
打开spgw配置文件,查看修改参数,改成如下所示(ens33改成自己网卡名):
PGW_INTERFACE_NAME_FOR_SGI = "ens33";
PGW_MASQUERADE_SGI = "yes";
sudo gedit /usr/local/etc/oai/mme.conf
打开mme配置文件,查看修改参数,改成如下所示:
GUMMEI_LIST = ( MCC="208" ; MNC="92"; MME_GID="4" ; MME_CODE="1"; } );
TAI_LIST = ({MCC="208" ; MNC="92"; TAC = "1"; } );
sudo gedit /usr/local/etc/oai/hss.conf
打开hss配置文件,查看修改参数
根据之前设置的mysql的密码,将标黄该行右边的密码换成自己的密码(我的是123456)
~/opencells-mods/hss_import 127.0.0.1 root 123456 oai_db ~/opencells-mods/opencells_db.sql
执行这一步的时候注意把root后面的123456换成自己的密码
开四个终端,分别执行:
cd openair-cn; source oaienv; cd scripts; ./run_hss
cd openair-cn; source oaienv; cd scripts; ./run_mme
cd openair-cn; source oaienv; cd scripts; sudo -E ./run_spgw
sudo bash
cd ~/openairinterface5g; source oaienv
cd cmake_targets/lte_build_oai/build
sudo RFSIMULATOR=enb ./lte-softmodem -O ~/opencells-mods/enb.10MHz.b200 --rfsim
由于我没有usrp,使用的是rfsimulator代替usrp,最后一步执行时和官网教程有所不同
../../nas_sim_tools/build/conf2uedata -c ~/opencells-mods/sim.conf -o .
如果曾经创建过,先删除之前的网络名称空间,再重新创建:
ip netns delete ueNameSpace
ip link delete v-eth1
ip netns add ueNameSpace
ip link add v-eth1 type veth peer name v-ue1
创建一个虚拟网卡对:v-eth1和v-ue1
ip link list
此时可以看到这一虚拟网卡对,如图
ip link set v-ue1 netns ueNameSpace
把v-ue1转移到ueNameSpace空间中去,再执行:
ip link list
发现没用v-ue1这个网卡了,执行
ip link set veth1 netns ueNameSpace
v-ue1已经再ueNameSpace空间中,如图
ip addr add 10.200.1.1/24 dev v-eth1
给v-eth1分配IP地址
ip link set v-eth1 up
启动v-eth1网卡
iptables -t nat -A POSTROUTING -s 10.200.1.0/255.255.255.0 -o ens33 -j MASQUERADE
启动IP伪装,添加了一条规则到NAT表的POSTROUTING链中,对于源IP地址为10.200.1.0网段的数据包,用ens33网口的IP地址替换并发送
iptables -A FORWARD -i ens33 -o v-eth1 -j ACCEPT
iptables -A FORWARD -o ens33 -i v-eth1 -j ACCEPT
iptables -A FORWARD这两条语句使能物理网口ens33和v-eth1之间的数据转发
ip netns exec ueNameSpace ip link set dev lo up
ip netns exec ueNameSpace ip addr add 10.200.1.2/24 dev v-ue1
ip netns exec ueNameSpace ip link set v-ue1 up
给v-ue1设置IP地址,并启动v-ue1
将窗口(终端)设置到新的网络名称空间中
ip netns exec ueNameSpace bash
在该终端中运行UE,注意在运行UE之前必须先运行上一个命令
./lte-uesoftmodem -C 2685000000 -r 50 --rfsim --rfsimulator.serveraddr 10.200.1.1
可以看到该UE可以连接到 eNB 以及 EPC ,在MME中可以看到连接以及附着的UE由0增加到1
[RRC] Synched with a cell, but PLMN doesn’t match our SIM, the message PHY_FIND_NEXT_CELL_REQ is sent but lost in current UE implementation!
说明生成的virtual SIM匹配失败,此时,先检查virtual SIM卡生成的MCC和MNC是否和eNB config 文件中所配置的相同,MCC=288,MNC=92:
在询问项目作者之后,发现在生成virtual SIM时所处的文件夹错误,在运行UE时没有用之前生成的SIM卡,应该在lte-uesoftmodem所在文件目录下执行生成SIM的命令,重新生成之后就可以成功运行。
若使用rfsimulator代替USRP,由于该项目使用的是develop分支,在5g方面只开发了nrUE和gNB的功能,还不能连接核心网
sudo bash
cd ~/openairinterface5g
source oaienv
cd cmake_targets/ran_build/build
sudo RFSIMULATOR=server ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf --parallel-config PARALLEL_SINGLE_THREAD --rfsim --phy-test
sudo bash
cd ~/openairinterface5g
source oaienv
cd cmake_targets/ran_build/build
sudo RFSIMULATOR=127.0.0.1 ./nr-uesoftmodem --rfsim --phy-test -d
下图为5G版运行结果: