DPDK (2) - 编译过程

本文使用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
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值