CentOS 编译运行 DPDK 19.11 流程
文章仅供参考,如遇问题详见官方网站 http://core.dpdk.org/doc/quick-start/
1、下载DPDK 19.11源码压缩包
#从github 中下载源码压缩包
wget https://github.com/DPDK/dpdk/archive/v19.11.zip
unzip v19.11.zip
cd dpdk-19.11
2、编译依赖环境
官方网站给出依赖如图,DPDK 20.xx以后的版本推荐使用meson ninja进行构建,本文还是以makefile 的方式进行编译构建。
#我们尽量多安装一些,避免出现意外
yum install -y gcc
yum install -y glibc
yum install -y stdc
yum install –y gfortran
yum install –y m4
yum install -y numactl*
yum install -y automake
yum install -y python3
yum install -y kernel-devel
yum install -y libpcap-devel kernel*
yum update
3、编译环境及编译
#配置环境变量指定源码路径,若果编译驱动模块需要指定内核源码文件路径
export RTE_KERNELDIR="/lib/modules/3.10.0-1160.6.1.el7.x86_64/build/"
export RTE_SDK="/root/dpdk/dpdk-19.11/"
export RTE_TARGET=“x86_64-native-linuxapp-gcc”#修改 config/common_base 编译igb_uio驱动
CONFIG_RTE_EAL_IGB_UIO=y#使用gcc编译
make install T=x86_64-native-linuxapp-gcc
make config T=x86_64-native-linuxapp-gcc
make -j4
4、绑定网卡
UIO(Userspace I/O)是运行在用户空间的I/O技术,Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用程序调用即可,而UIO则是将驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能!使用UIO可以避免设备的驱动程序需要随着内核的更新而更新的问题。
modprobe uio
insmod build/kmod/igb_uio.ko#查询网卡物理地址
lspci | grep Ethernet
ifconfig ens38 down
./usertools/dpdk-devbind.py -b igb_uio ens38#或者
ifconfig ens38 down
./usertools/dpdk-devbind.py -b igb_uio 0000:02:01.0#查看网卡信息:
./usertools/dpdk-devbind.py --status
#如修改回普通网卡模式,则使用如下命令
./usertools/dpdk-devbind.py -b e1000 0000:02:05.0
ifconfig ens38 up
5、运行配置
#分配巨页1024*2M=2G
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
#若没有这个文件,这样也会合理的
echo 2 > /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages#查看大页分配数目
$ cat /proc/meminfo| grep Huge
6、环境变量
运行DPDK测试实例时,一定要设置环境变量RTE_SDK和RTE_TARGET,用于编译以及索引,无论是采用进入目录直接编译,还是采用usertools/dpdk-setup.sh脚本中的测试实例。
这里我们已经在前面编译的时候设置
# export EXTRA_CFLAGS="-O0 -g"
export RTE_TARGET=“x86_64-native-linuxapp-gcc”
export RTE_SDK="/root/dpdk/dpdk-19.11/"
编译运行测试程序helloworld,详见官方文档http://doc.dpdk.org/guides-19.11/linux_gsg/build_sample_apps.html
[root@localhost dpdk-19.11]# cd examples/helloworld/
[root@localhost helloworld]# make
CC main.o
LD helloworld
INSTALL-APP helloworld
INSTALL-MAP helloworld.map[root@localhost helloworld]# ./build/helloworld -l 0-3 -n 4
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: PCI device 0000:02:01.0 on NUMA socket -1
EAL: Invalid NUMA socket, default to 0
EAL: probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:02:06.0 on NUMA socket -1
EAL: Invalid NUMA socket, default to 0
EAL: probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:02:07.0 on NUMA socket -1
EAL: Invalid NUMA socket, default to 0
EAL: probe driver: 8086:100f net_e1000_em
hello from core 1
hello from core 2
hello from core 3
hello from core 0
附 虚拟机环境中的错误Input/output error处理
APP: HPET is not enabled, using TSC as default timer
RTE>>EAL: Error reading from file descriptor 22: Input/output error
如果出现如上问题,是因为虚拟机添加的网卡,dpdk不支持导致的,需要在编译igb_uio驱动代码的时候,修改一行代码,跳过dpdk pci 检查。在dpdk/kernel/linux/igb_uio/igb_uio.c文件中,找到if (pci_intx_mask_supported(udev->pdev)
这行代码(dpdkv20.02),
然后修改为if (pci_intx_mask_supported(udev->pdev)|| 1)
。
然后重新编译驱动,并重新加载igb_uio,即可解决该问题。