之前dpdk的安装遇到了一些坑,pktgen安装也是一样。他们都在一定程度上依赖内核版本。

个人感觉,linux内核版本3.x比较合适,至少不会有和内核冲突的情况,很多其他错误都是依赖项没有满足,可以针对性安装相关库解决。

我的版本是 Ubuntu 14.04.5 LTS (GNU/Linux 3.19.0-25-generic x86_64) + DPDK 17.11.5 + pktgen3.4.5

之前试过pktgen3.3.0/3.0.0/3.6.0编译均会出错。

安装环境前转换为root用户,会解决所有的权限不足问题。

(一)dpdk环境搭建,建议利用dpdk文件夹下 usertools/dpdk-setup.sh ,这样会免去一些坑(已安装的忽略)。

(1)在dpdk主文件夹下创建空文件 dpdk.rc, 加上如下两句话并保存:

export RTE_SDK='pwd'
export RTE_TARGET=x86_64-native-linuxapp-gcc

(2)终端 cd 到dpdk主目录,运行:

source dpdk.rc

(3)终端输入:

./usertools/dpdk-setup.sh

会得到如下语句:

------------------------------------------------------------------------------
 RTE_SDK exported as /home/lyh/dpdk-stable-17.11.5
------------------------------------------------------------------------------
----------------------------------------------------------
 Step 1: Select the DPDK environment to build
----------------------------------------------------------
[1] arm64-armv8a-linuxapp-clang
[2] arm64-armv8a-linuxapp-gcc
[3] arm64-dpaa2-linuxapp-gcc
[4] arm64-dpaa-linuxapp-gcc
[5] arm64-thunderx-linuxapp-gcc
[6] arm64-xgene1-linuxapp-gcc
[7] arm-armv7a-linuxapp-gcc
[8] i686-native-linuxapp-gcc
[9] i686-native-linuxapp-icc
[10] ppc_64-power8-linuxapp-gcc
[11] x86_64-native-bsdapp-clang
[12] x86_64-native-bsdapp-gcc
[13] x86_64-native-linuxapp-clang
[14] x86_64-native-linuxapp-gcc
[15] x86_64-native-linuxapp-icc
[16] x86_x32-native-linuxapp-gcc

----------------------------------------------------------
 Step 2: Setup linuxapp environment
----------------------------------------------------------
[17] Insert IGB UIO module
[18] Insert VFIO module
[19] Insert KNI module
[20] Setup hugepage mappings for non-NUMA systems
[21] Setup hugepage mappings for NUMA systems
[22] Display current Ethernet/Crypto device settings
[23] Bind Ethernet/Crypto device to IGB UIO module
[24] Bind Ethernet/Crypto device to VFIO module
[25] Setup VFIO permissions

----------------------------------------------------------
 Step 3: Run test application for linuxapp environment
----------------------------------------------------------
[26] Run test application ($RTE_TARGET/app/test)
[27] Run testpmd application in interactive mode ($RTE_TARGET/app/testpmd)

----------------------------------------------------------
 Step 4: Other tools
----------------------------------------------------------
[28] List hugepage info from /proc/meminfo

----------------------------------------------------------
 Step 5: Uninstall and system cleanup
----------------------------------------------------------
[29] Unbind devices from IGB UIO or VFIO driver
[30] Remove IGB UIO module
[31] Remove VFIO module
[32] Remove KNI module
[33] Remove hugepage mappings

[34] Exit Script

Option: 

(4)根据需求选择对应环境,我的选择是14.不出错的话不会看到error,出错的话根据error进行对应处理。

(5)选择应用场景,我需要的是igb uio模式,选择17。

(6)选择 numa/non-numa系统,我的是numa系统,选择21(似乎目前都为numa系统,这个选错关系不大,稍微影响性能)。之后会要求填node0/1的大页数量,要求64的整数倍,随意,为了之后测试不报错,可以稍微大一点,例如256.

(7)为uio模式绑定网卡,可以先选择22查看网卡情况。

选择23,之后会要求输入:

Enter PCI address of device to bind to IGB UIO driver:

这个根据上方要绑定网卡的编号确定,例如我要绑定的两个网卡的是82:00.0和82:00.1,则先输入前者,然后再次选择23,输入后者。

需要注意的是,如果要绑定的网卡显示为“Active”,需要先在终端输入 ifconfig eth0 down,关掉网卡。其中eth0换成你希望关掉的网卡名。

两张网卡绑定成功后,选择22可以看到如上图所示,有drv=igb_uio字样。

(8)绑定网卡后,则dpdk环境搭建成功, 可以运行其示例进行测试。卸载dpdk也可以根据29-33选项进行操作。

(9)输入34,退出程序。

(二)pktgen安装

将pktgen解压后,终端cd到pktgen主目录下,直接输入 make 。安装过程可能需要联网自动下载lua。不出现error则编译成功。

(三)pktgen发包测试

我是利用pktgen打开pcap文件进行发包,在某个路径下存好想要发送的pcap包之后,输入如下指令(必须在pktgen主目录下!):


./app/x86_64-native-linuxapp-gcc/pktgen -l 0-2 -n 3 -- -P -m "[1].0, [2].1" -s 1:/home/test.pcap

其中的-l -n -P -m均属于pktgen的指令,可以参考博文进行自定义设置:

https://www.jianshu.com/p/fa7d9f2c0f55
之后,在Pktgen:/> 指令下,输入start 0 或start 1就可以开始发包(0/1对应于dpdk绑定的两个网卡)。

pktgen会不断循环的读取pcap文件,按照网卡最大速度进行发包,可以在start之前输入下列语句控制速度和包数量:

set all rate 10        # 在pktgen中设置速率为10%,更具体的速率设置可以通过tx_cycles设置

set 1 count 1000       # 每次start,1端口发1000个包

停止发包,输入 stop 0 或stop 1。

最后附上发包时,pktgen的打印结果:

出现找不到rte_bus_pci.h的错误时,解决方案查看: http://mowblog.com/dpdkpktgen环境安装/ 还是因为dpdk版本过高导致的,解决方案如下:

欢迎交流。

Logo

更多推荐