本篇博客是对Intel FlexRan中前传库fhi_lib编译过程的记录,记录下遇到的几个问题。编译流程可以参照https://docs.o-ran-sc.org/projects/o-ran-sc-o-du-phy/en/latest/build_prerequisite.html和
https://docs.o-ran-sc.org/projects/o-ran-sc-o-du-phy/en/latest/run_l1.html#build-fh。编译fhi_lib的主要前提有:安装intel compiler,安装 DPDK和安装google test。
- fhi_lib的build.sh文件里默认使用的compiler是intel的icc或者icx,对应需要安装的软件是:
- Intel® oneAPI - x86_64-native-linuxapp-icx
- Intel® System Studio - x86_64-native-linuxapp-icc
首先尝试下安装System Studio,但是使用Build Prerequisite参考文档中提供的community license貌似不可用了。不使用 slient.cfg直接用./install.sh命令启动安装程序,在license中使用提供的serial number CG7X-J7B6G8WS也不支持。所以尝试安装oneAPI。
FlexRan中默认的是用wget命令下载2022版本的oneAPI:
wget https://registrationcenter-download.intel.com/akdlm/irc_nas/18673/l_BaseKit_p_2022.2.0.262_offline.sh
但是尝试了几次,下载都不成功,所以通过官方网站:https://www.intel.com/content/www/us/en/developer/tools/oneapi/base-toolkit-download.html?operatingsystem=linux&distributions=webdownload&options=offline下载了最新的2024版本然后安装:
wget https://registrationcenter-download.intel.com/akdlm/IRC_NAS/163da6e4-56eb-4948-aba3-debcec61c064/l_BaseKit_p_2024.0.1.46_offline.sh
sudo sh ./l_BaseKit_p_2024.0.1.46_offline.sh
安装时有很多组件可供选择,为了支持FlexRan以下组件是必要的:
Intel® Math Kernel Library,Intel® Integrated Performance Primitives和Intel® C++ Compiler。安装完成后需要更新环境变量,运行:
source /opt/intel/oneapi/setvars.sh
- 安装DPDK,FlexRan默认使用的版本是20.11.3,首先需要设置些环境变量,如果使用icx的话:
export RTE_TARGET=x86_64-native-linuxapp-icx
export WIRELESS_SDK_TOOLCHAIN=icx
source /opt/intel/oneapi/setvars.sh
export PATH=$PATH:/opt/intel/oneapi/compiler/2024.0/bin
因为之前系统里有gcc,根据参考流程,并没有将DPDK的默认compiler改为intel的icx。在网上查了下,因为DPDK 20.11.3是用meson构建的,网上一些基于DPDK旧版本的makefile老方法并不适用,最后在这里找到了解决方法:https://www.intel.com/content/www/us/en/developer/articles/training/how-to-build-dpdk-with-intel-compilers.html。在配置build文件夹时使用命令:
CC=icx CXX=icpx FC=ifx meson -Dexamples=all build
根据配置信息的输出,确认使用的是icx:
- 在运行fhi_lib的build.sh中使用的Makefile文件的时候,它是通过pkgconfig的方法引入DPDK的头文件和库文件,在build.sh中默认写的是:
RTE_INC := $(shell PKG_CONFIG_PATH=/usr/lib64/pkgconfig:$(RTE_SDK)/build/meson-uninstalled pkgconf --cflags-only-I libdpdk)
RTE_LIBS = $(shell PKG_CONFIG_PATH=/usr/lib64/pkgconfig:$(RTE_SDK)/build/meson-uninstalled pkgconf --static --libs libdpdk)
可能因为FlexRan默认使用的是CentOS的系统,但是博主是在Ubuntu中进行尝试,所以需要将这段改成:
RTE_INC := $(shell PKG_CONFIG_PATH=/usr/lib/pkgconfig:$(RTE_SDK)/build/meson-uninstalled pkg-config --cflags-only-I libdpdk)
RTE_LIBS = $(shell PKG_CONFIG_PATH=/usr/lib/pkgconfig:$(RTE_SDK)/build/meson-uninstalled pkg-config --static --libs libdpdk)
这样才能在编译fhi_lib时找到DPDK的头文件。
- 在fhi_lib的build.sh中默认是不编译sample-app程序的,需要在运行build.sh的时候加入SAMPLEAPP参数,例如:
sh ./build.sh SAMPLEAPP
- 在运行编译出来的sample-app时可能会遇到缺少动态库的问题,需要设置下LD_LIBRARY_PATH:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DIR_ROOT/fhi_lib/lib/build # libxran.so
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/intel/oneapi/2024.0/lib # libsvml.so
- 关于编译fhi_lib可能需要设置的环境变量汇总:
export DIR_ROOT=/home/ # user self defined
export RTE_TARGET=x86_64-native-linuxapp-icx
export WIRELESS_SDK_TOOLCHAIN=icx
source /opt/intel/oneapi/setvars.sh
export PATH=$PATH:/opt/intel/oneapi/compiler/2024.0/bin
export RTE_SDK=$DIR_ROOT/dpdk-stable-20.11.3
export DESTDIR=$DIR_ROOT/dpdk-stable-20.11.3
export DIR_ROOT_DPDK=$DIR_ROOT/dpdk-stable-20.11.3
#export PKG_CONFIG_PATH=/usr/lib/pkgconfig:$DIR_ROOT/dpdk-stable-20.11.3/build/meson-uninstalled
export XRAN_DIR=$DIR_ROOT/fhi_lib
export XRAN_LIB_SO=true
export GTEST_DIR=$DIR_ROOT/gtest-1.7.0
export GTEST_ROOT=$GTEST_DIR
export DIR_ROOT_GTEST=$DIR_ROOT/gtest-1.7.0
export DEBUG_MODE=true
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DIR_ROOT/fhi_lib/lib/build
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/intel/oneapi/2024.0/lib
- 后续发现在sample-app里在初始化DPDK的时候(xran_ethdi_init_dpdk_io())需要sudo权限,用sudo运行的话,之前配的动态库路径就不认了。可以将动态库拷贝到/usr/lib下,例如:
sudo cp ../lib/build/libxran.so /usr/lib
sudo ldconfig
或者:
sudo ldconfig /opt/intel/oneapi/compiler/2024.0/lib
- DPDK在收发包前要设置大页内存,可以使用DPDK项目usertools下的dpdk-hugepages.py文件:
# 查看大页内存配置信息
sudo ./dpdk-hugepages.py -s
# 例如配置1G类型大页, 总共8G
sudo ./dpdk-hugepages.py -p 1G --setup 8G
下面主要是关于运行编译出来的sample-app的记录:
10. 因为需要用到DPDK,所以要采购支持VFs功能的intel网卡,官方推荐的是:
采购了XL710-QDA2网卡,查看基本信息,确定PCI bus地址:
sudo apt install ethtool # optional
ethtool -i enp23s0f0
接下来配置VFs,因为只买了一块XL710-QDA2(官网是用两块),如果测试du和ru的话,可以各虚拟6个端口,运行下面类似的脚本:
! /bin/bash
echo 0 > /sys/bus/pci/devices/0000\:17\:00.0/sriov_numvfs
echo 0 > /sys/bus/pci/devices/0000\:17\:00.1/sriov_numvfs
modprobe -r iavf
modprobe iavf
echo 6 > /sys/bus/pci/devices/0000\:17\:00.0/sriov_numvfs
echo 6 > /sys/bus/pci/devices/0000\:17\:00.1/sriov_numvfs
a=8
if [ -z "$1" ]
then
b=0
elif [ $1 -lt $a ]
then
b=$1
else
echo " Usage $0 qos with 0<= qos <= 7 with 0 as a default if no qos is provided"
exit 1
fi
#O-DU
ip link set enp23s0f0 vf 0 mac 00:11:22:33:00:00 vlan 1 qos $b
ip link set enp23s0f1 vf 0 mac 00:11:22:33:00:10 vlan 1 qos $b
ip link set enp23s0f0 vf 1 mac 00:11:22:33:01:00 vlan 2 qos $b
ip link set enp23s0f1 vf 1 mac 00:11:22:33:01:10 vlan 2 qos $b
ip link set enp23s0f0 vf 2 mac 00:11:22:33:02:00 vlan 3 qos $b
ip link set enp23s0f1 vf 2 mac 00:11:22:33:02:10 vlan 3 qos $b
#O-RU
ip link set enp23s0f0 vf 3 mac 00:11:22:33:00:01 vlan 1 qos $b
ip link set enp23s0f1 vf 3 mac 00:11:22:33:00:11 vlan 1 qos $b
ip link set enp23s0f0 vf 4 mac 00:11:22:33:01:01 vlan 2 qos $b
ip link set enp23s0f1 vf 4 mac 00:11:22:33:01:11 vlan 2 qos $b
ip link set enp23s0f0 vf 5 mac 00:11:22:33:02:01 vlan 3 qos $b
ip link set enp23s0f1 vf 5 mac 00:11:22:33:02:11 vlan 3 qos $b
查看配置VFs是否成功 :
lspci | grep Eth
ip link show
然后可以运行fhi_lib里的ru_o_du.sh和ru_o_ru.sh脚本,需修改如下:
ru_o_du.sh:
#! /bin/bash
ulimit -c unlimited
echo 1 > /proc/sys/kernel/core_uses_pid
./build/sample-app --usecasefile ./usecase/cat_a/mu0_5mhz/usecase_du.cfg --num_eth_vfs 6 \
--vf_addr_o_xu_a "0000:17:02.0,0000:17:0a.0" \
--vf_addr_o_xu_b "0000:17:02.1,0000:17:0a.1" \
--vf_addr_o_xu_c "0000:17:02.2,0000:17:0a.2" \
ru_o_ru.sh:
ulimit -c unlimited
echo 1 > /proc/sys/kernel/core_uses_pid
./build/sample-app --usecasefile ./usecase/cat_a/mu0_5mhz/usecase_ru.cfg --num_eth_vfs 6 \
--vf_addr_o_xu_a "0000:17:02.3,0000:17:0a.3" \
--vf_addr_o_xu_b "0000:17:02.4,0000:17:0a.4" \
--vf_addr_o_xu_c "0000:17:02.5,0000:17:0a.5" \
- 运行ru_o_du.sh脚本的时候出现如下问题:
后来查资料应该需要挂载dpdk驱动(igb_uio或者vfio-pci驱动),并且使用dpdk项目里usertools下的dpdk-devbind.py将网卡绑定到指定驱动中。关于驱动的挂载在fhi_lib/app/dpdk.sh脚本里有参考,截取一段如下:
load_vfio_module()
{
remove_vfio_module
echo "Loading VFIO module"
/sbin/lsmod | grep -s vfio_pci > /dev/null
if [ $? -ne 0 ] ; then
sudo /sbin/modprobe -v vfio-pci
fi
# make sure regular users can read /dev/vfio
echo "chmod /dev/vfio"
sudo chmod a+x /dev/vfio
if [ $? -ne 0 ] ; then
echo "FAIL"
quit
fi
echo "OK"
# check if /dev/vfio/vfio exists - that way we
# know we either loaded the module, or it was
# compiled into the kernel
if [ ! -e /dev/vfio/vfio ] ; then
echo "## ERROR: VFIO not found!"
fi
}
驱动挂载完成后运行(其实改下dpdk.sh脚本里对应的pci地址后,直接运行脚本也行):
$RTE_SDK/usertools/dpdk-devbind.py --bind=vfio-pci 0000:17:02.0
$RTE_SDK/usertools/dpdk-devbind.py --bind=vfio-pci 0000:17:0a.0
如果使用vfio-pci绑定不上可以参考:https://community.intel.com/t5/Ethernet-Products/Intel-x553-vfio-pci-support/m-p/1298821?profile.language=zh-CN 中的:
sudo echo Y | sudo tee /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
然后前传程序就能暂时跑下去了,实际功能性和完整性还待验证:
du:
ru: