从零到一:基于OAI开源平台构建端到端5G SA实验网络

从零到一:基于OAI开源平台构建端到端5G SA实验网络 1. 环境准备搭建5G实验网络的基础条件想要亲手搭建一套完整的5G SA实验网络首先得准备好合适的硬件和软件环境。我去年在实验室折腾这套系统时光是环境准备就花了整整三天时间踩了不少坑。这里把我的经验都分享给你帮你少走弯路。硬件配置是第一个门槛。建议使用至少16核32线程的CPU比如Intel i9或至强银牌系列32GB以上内存以及支持PCIe 3.0以上的网卡。特别要注意的是最好准备两块物理网卡一块用于核心网和基站的通信另一块用于连接外网。我当时用了一台退役的戴尔R740服务器性能完全够用。操作系统推荐Ubuntu 18.04 LTS或20.04 LTS这是OAI官方测试最充分的版本。安装时有个关键步骤很多人会忽略——选择低延时内核。执行以下命令安装sudo apt-get install linux-image-uname -r | cut -d- -f1-2-lowlatency sudo apt-get install linux-headers-uname -r | cut -d- -f1-2-lowlatency安装完成后一定要重启系统。我曾经遇到过因为没装低延时内核导致基站时延过高的问题排查了好久才发现是这个原因。接下来要优化CPU性能。5G信号处理对时钟精度要求极高需要关闭CPU的节能功能。具体要做四件事禁用Intel P-state驱动限制CPU最大C-state状态关闭睿频加速设置performance模式对应的配置命令如下# 修改grub配置 sudo sed -i s/GRUB_CMDLINE_LINUX_DEFAULTquiet splash/GRUB_CMDLINE_LINUX_DEFAULTquiet processor.max_cstate1 intel_idle.max_cstate0 idlepoll/g /etc/default/grub sudo update-grub # 关闭睿频 echo GOVERNOR\performance\ | sudo tee /etc/default/cpufrequtils sudo systemctl disable ondemand sudo systemctl restart cpufrequtils最后检查GTP内核模块是否加载这是5G核心网必需的功能sudo modprobe gtp dmesg | tail -n 5如果看到GTP module loaded的输出就说明成功了。我建议把这些配置写成脚本保存因为每次系统升级后都可能需要重新配置。2. 部署5G核心网OAI 5GC实战核心网是整个5G网络的大脑OAI提供了完整的5GC开源实现。部署方式有两种使用预编译的Docker镜像或者从源码编译。对于新手我强烈推荐Docker方式能省去大量依赖问题。首先安装Docker和docker-composesudo apt-get install docker.io docker-compose sudo usermod -aG docker $USER newgrp docker然后下载OAI 5GC的部署包git clone https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-fed.git cd oai-cn5g-fed/docker-compose这里有个小技巧修改docker-compose-mini-nrf.yaml文件中的MCC和MNC参数。这两个值相当于移动网络的国家代码和运营商代码可以随便设置但要记住后面基站和终端配置要用相同的值。我一般用001和01好记。environment: - MCC001 - MNC01 - TAC1启动核心网服务docker-compose -f docker-compose-mini-nrf.yaml up -d等待几分钟后用docker ps查看所有容器是否正常运行。常见的故障是MySQL容器启动失败通常是因为磁盘空间不足或内存不够。我第一次部署时就因为没给MySQL分配足够内存导致AMF服务一直起不来。核心网正常运行后需要配置网络转发规则sudo sysctl net.ipv4.conf.all.forwarding1 sudo iptables -P FORWARD ACCEPT这些配置重启后会失效如果想持久化可以写入/etc/rc.local。核心网默认会创建一个docker网桥(oai-public)IP段是192.168.70.128/26这个信息后面基站配置要用到。3. 构建5G基站gNB配置详解基站(gNB)是连接终端和核心网的桥梁也是整个系统中最复杂的部分。OAI的gNB支持两种硬件平台USRP和模拟器。我建议先用模拟器模式熟悉流程再尝试USRP实机。首先下载OAI代码git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git cd openairinterface5g git checkout develop安装编译依赖是个大工程OAI提供了自动化脚本cd cmake_targets ./build_oai -I这个过程可能会遇到各种依赖问题。我总结了几点经验确保Ubuntu的universe和multiverse源已启用如果卡在某个包可以手动安装后再继续国内用户可能需要更换apt源编译gNB软件./build_oai --gNB -w SIMU关键步骤是配置gNB参数。复制示例配置文件并修改cd targets/PROJECTS/GENERIC-NR-5GC/CONF cp gnb.sa.band78.fr1.106PRB.usrpb210.conf my-gnb.conf需要修改的主要参数包括tracking_area_code与核心网设置的TAC一致mcc和mnc必须与核心网相同amf_ip_address核心网主机的IPNETWORK_INTERFACES设置正确的网卡名称和IP启动gNB前必须添加路由规则sudo ip route add 192.168.70.128/26 via 核心网IP dev 网卡名然后就可以启动gNB了./nr-softmodem -O my-gnb.conf --gNBs.[0].min_rxtxtime 6 --sa -E --continuous-tx看到NFAPI THREAD STARTED就说明基站启动成功了。如果遇到同步问题可以尝试调整--continuous-tx参数。4. 终端模拟UE配置与联网测试最后一个环节是终端(UE)。OAI提供了nrUE模拟器可以模拟5G手机的行为。虽然不能完全替代真实终端但对学习和测试已经足够。编译UE软件./build_oai --nrUE -w SIMUUE的配置文件需要与gNB匹配cd targets/PROJECTS/GENERIC-NR-5GC/CONF cp ue.conf my-ue.conf重点检查以下参数mcc和mnckey和opc认证密钥需要与核心网数据库一致nssai网络切片配置gnb_ip_addrgNB的IP地址启动UE./nr-uesoftmodem -r 106 --band 78 -C 3619200000 --ue-fo-compensation --sa -E -O my-ue.conf --nokrnmod 1成功连接后会看到类似RRC_CONNECTED的日志。此时ifconfig应该会多出一个oaitun_ue1接口这就是UE获得的虚拟网卡。测试网络连通性ping -I oaitun_ue1 8.8.8.8如果ping不通建议按以下步骤排查检查核心网AMF是否收到注册请求确认gNB和UE的频段配置一致查看路由规则是否正确检查防火墙设置我在第一次测试时就因为UE的频点设置错误折腾了一整天。后来发现是配置文件中的频点单位搞混了OAI有的地方用Hz有的地方用kHz这个细节要特别注意。5. 常见问题排查与优化建议搭建完整链路后你可能会遇到各种奇怪的问题。这里分享几个我遇到的典型案例和解决方法。案例1UE无法注册症状UE日志显示Authentication Rejected 解决方法检查核心网MySQL数据库中的ue_data表确认UE配置中的key/opc与数据库一致重启AMF容器重新加载配置案例2gNB与AMF连接失败症状gNB日志显示SCTP连接失败 解决方法确认核心网IP和端口正确检查路由规则是否生效尝试关闭防火墙临时测试案例3高时延和丢包症状ping测试时延100ms 解决方法确认使用了低延时内核检查CPU频率是否锁定在最高减少其他进程的资源占用性能优化方面我有几个实用建议为OAI进程设置CPU亲和性减少上下文切换使用性能监控工具如top、htop观察资源使用情况调整gNB的调度参数如--scheduler.nr_tti_per_sch最后提醒一点这套实验环境对时钟同步要求极高如果使用多台物理机分别运行核心网和基站建议配置PTP精确时间协议。我实验室后来买了台二手GPS时钟源同步问题就再没出现过。