[①FlexRan]: fhi_lib编译以及运行sample-app记录

本篇博客是对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。

  1. 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
  1. 安装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:
在这里插入图片描述

  1. 在运行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的头文件。

  1. 在fhi_lib的build.sh中默认是不编译sample-app程序的,需要在运行build.sh的时候加入SAMPLEAPP参数,例如:
sh ./build.sh SAMPLEAPP
  1. 在运行编译出来的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
  1. 关于编译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      
  1. 后续发现在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
  1. 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" \
  1. 运行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:
在这里插入图片描述

S29GL01GS10FHI010是一款闪存芯,以下是它的使用教程: 1 引脚连接:将S29GL01GSFHI的引脚与目标设备进行连接。根据芯片的数据手册,将VCC引连接到电源正极,将GND脚连接到电源地,将地址线和数据线连接目标设备的对应引脚。 2. 供电:为S29GLGS10FHI010提供适当的电源电压。根据芯片的规格书,确定所需的电源电压范围,并将电源连接到VCC引脚。 3. 控制信号:根据芯片的规格书,确定所需的控制信号,并将其连接到相应的引脚。这些控制信号可能包括读取使能信号、写入使能信号、擦除使能信号等。 4. 数据传输:根据芯片的规格书,确定数据传输的方式。可以使用并行接口或串行接口进行数据传输。根据接口类型,将数据线连接到相应的引脚。 5. 操作流程:根据芯片的规格书,了解S29GL01GS10FHI010的操作流程。这包括读取数据、写入数据和擦除数据等操作。根据需要,编写相应的代码或使用相应的命令来执行这些操作。 6. 软件支持:根据芯片的规格书,了解S29GL01GS10FHI010的软件支持。这可能包括提供的驱动程序、API或库等。根据需要,使用相应的软件工具来编程和控制S29GL01GS10FHI010。 请注意,以上是一个简要的使用教程,具体的操作步骤和细节可能因芯片型号和应用场景而有所不同。建议您参考S29GL01GS10FHI010的数据手册和应用指南,以获取更详细和准确的信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李71~李先森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值