DPDK (2) - 编译过程
本文使用dpdk-20.08版本作为示例。关键字RTE:runtime environmentEAL:environment abstraction layer方法一:Make编译make config T=x86_64-native-linuxapp-gccmake编译报错:/root/work/dpdk-20.08/lib/librte_eal/linux/eal_memory.c:32:18
本文使用dpdk-20.08版本作为示例。
关键字
- RTE:runtime environment
- EAL:environment abstraction layer
方法一:Make编译
make config T=x86_64-native-linuxapp-gcc
make
编译报错:
/root/work/dpdk-20.08/lib/librte_eal/linux/eal_memory.c:32:18: fatal error: numa.h: No such file or directory
#include <numa.h>
^
compilation terminated.
make[4]: *** [eal_memory.o] Error 1
make[3]: *** [linux] Error 2
make[2]: *** [librte_eal] Error 2
make[1]: *** [lib] Error 2
make: *** [all] Error 2
需要安装numactl-devel rpm包:
yum -y install numactl-devel
然后重新执行编译命令,等待编译完成。
需要注意的是,当我们使用make进行编译时会发现有如下的warning信息,意思就是说DPDK新版本的编译建议使用meson+ninja编译工具了,make可能会在以后的版本中弃用。
=========================== WARNING ============================
It is recommended to build DPDK using 'meson' and 'ninja'
See https://doc.dpdk.org/guides/linux_gsg/build_dpdk.html
Building DPDK with 'make' will be deprecated in a future release
================================================================
编译helloworld示例程序:
cd examples/helloworld
make
直接执行make会报错:
[root@localhost helloworld]# make
Makefile:44: *** "Please define RTE_SDK environment variable". Stop.
提示需要设置环境变量,搜索了一下发现它的含义是:
export RTE_SDK=/root/dpdk-20.08
export RTE_TARGET=x86_64-native-linuxapp-gcc
RTE_SDK指向DPDK开发包SDK主目录,RTE_TARGET指向DPDK目标环境目录。
设置了以上两个环境变量以后,编译正常。生成的可执行文件在examples/helloworld/build
目录中。想要运行该示例还需要配置一下大页内存:
mkdir -p /dev/hugepages
mountpoint -q /dev/hugepages || mount -t hugetlbfs nodev /dev/hugepages
echo 64 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
运行结果:
[root@localhost build]# ./helloworld
EAL: Detected 4 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: Probing VFIO support...
EAL: Invalid NUMA socket, default to 0
EAL: No legacy callbacks, legacy socket not created
hello from core 1
hello from core 2
hello from core 3
hello from core 0
方法二:meson编译(DPDK推荐)
最新版本的DPDK都是建议使用meson+ninja的方式来编译,关于meson和ninja的编译环境请参考我的另一篇博文:
https://blog.csdn.net/rikeyone/article/details/108706974
使用meson编译DPDK的方法如下:
meson build
ninja -C build
如果要编译examples示例程序,需要把第一个命令改为:
meson -Dexamples=all build
对应的示例编译出来的可执行文件会生成到如下目录:
dpdk-20.08/build/examples/
运行环境
要启动dpdk网络功能,需要两个必备的要求:
- 1.预留大页
- 2.PMD驱动加载和网卡绑定
驱动未编译问题
前面步骤编译出来的helloworld并不依赖于网络,所以它在运行前只是预留了大页,并没有加载内核驱动以及绑定网卡设备。那么对于基于dpdk实现的网络功能,就必须要做驱动的加载和网卡绑定。
当我执行前面的编译步骤时,发现最后并没有生成对应的内核驱动 igb_uio.ko
。网上搜了一下找到一个答案:https://www.mail-archive.com/users@dpdk.org/msg04817.html
新版版的DPDK已经把默认编译UIO驱动的选项修改了,主要是由于DPDK已经建议使用vfio-pci,这里仅仅是为了演示igb_uio驱动,因此我们可以修改对应的build/.config
修改如下配置选项:
CONFIG_RTE_EAL_IGB_UIO=y
CONFIG_RTE_KNI_KMOD=y
修改完成后就会发现在 build/kmod
中已经生成了对应的驱动了。
网卡绑定
查看当前网卡状态,记录网卡对应的PCI设备节点号:
[root@localhost dpdk-20.08]# usertools/dpdk-devbind.py --status
WARNING: Python 2 is deprecated for use in DPDK, and will not work in future releases.
Please use Python 3 instead
Network devices using kernel driver
===================================
0000:00:03.0 '82540EM Gigabit Ethernet Controller 100e' if=enp0s3 drv=e1000 unused=igb_uio,vfio-pci *Active*
加载uio驱动:
modprobe uio
insmod kmod/igb_uio.ko
绑定对应的驱动:
ifconfig enp0s3 down
usertools/dpdk-devbind.py --bind=igb_uio 0000:00:03.0
注意这里必须先要把网卡down掉然后才能重新绑定bind驱动。
使用VFIO注意事项
1.硬件上支持支持VT-x、VT-d,BIOS中需要打开相关特性
2.对于物理机的内核中需要支持IOMMU特性(在启动参数添加 iommu=pt, intel_iommu=on)
快速脚本
DPDK提供了脚本usertools/dpdk-setup.sh
用于编译、初始化环境以及网卡绑定和解绑操作。可以直接执行:
source usertools/dpdk-setup.sh
更多推荐
所有评论(0)