一、首先我们需要准备一个物理机或者一个虚拟机。
物理机:
需要一个高性能的网卡跑dpdk和一个普通网卡进行网络通信,机器安装Ubuntu16.04.
虚拟机:
使用vnware安装Ubuntu16.04,配置一个多队列网卡和一个普通网卡。

二、虚拟机配置

如果使用物理机,我们不需要做任何配置,只需要安装Ubuntu16.04即可。如果没有物理机,我们就需要使用vmware安装Ubuntu 16.04,并且进行下面的配置。

1.添加一个多队列网卡

dpdk testpmd设置 dpdk配置_dpdk testpmd设置


2.修改新增的网卡类型

修改虚拟机所在的目录中的vmx文件。

修改下面的参数:

ethernet1.virtualDev = "e1000"

改为

ethernet1.virtualDev = "vmxnet3"

使得这个网卡为高性能的网卡。

3.修改虚拟机网卡名字
我们要修改ens33网卡名为eth0,需要修改/etc/default/grub文件,在GRUB_CMDLINE_LINUX参数后面添加net.ifnames=0 biosdevname=0:

GRUB_CMDLINE_LINUX="find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US net.ifnames=0 biosdevname=0"

然后执行下面的命令:

sudo grub-mkconfig -o /boot/grub/grub.cfg

4.重启

5.查看网卡信息:

dpdk testpmd设置 dpdk配置_linux_02


我们可以看到有两个网卡了,一个普通网卡eth1和一个多队列网卡eth0,我们可以看到多队列网卡eth0有8个接受队列。

三、dpdk配置内存巨型页
Ubuntu16.04支持内存巨型页,但是还是要我们修改启动参数,设置巨型页大小和数量,设置方法是修改linux启动参数,我们需要修改/etc/default/grub文件的GRUB_CMDLINE_LINUX参数,添加default_hugepages=1G hugepagesz=2M hugepages=1024

GRUB_CMDLINE_LINUX="find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US net.ifnames=0 biosdevname=0 default_hugepages=1G hugepagesz=2M hugepages=1024"

然后执行下面的命令:

sudo grub-mkconfig -o /boot/grub/grub.cfg

再重启就可以了。

四、dpkg源代码下载和编译。
1.下载源代码
我们dpdk官方网站上下载dpdk源代码,链接在这里,随便挑选版本,不同版本直接子系统接口会有差异,建议选择 dpdk 19.08.2。

2.解压源代码
我们把压缩包放到/home/jian/share/目录中,解压后得到/home/jian/share/dpdk-stable-19.08.2的源代码。

3.安装编译环境

sudo apt-get install libnuma-dev

4.编译工具链
dpdk的源代码中自带的脚本来编译工具链,我们在/home/jian/share/dpdk-stable-19.08.2目录中执行下面的脚本:

./usertools/dpdk-setup.sh

然后选择39,具体log看下面:

jian@ubuntu:~/share/dpdk-stable-19.08.2$ ./usertools/dpdk-setup.sh 
------------------------------------------------------------------------------
 RTE_SDK exported as /home/jian/share/dpdk-stable-19.08.2
------------------------------------------------------------------------------
----------------------------------------------------------
 Step 1: Select the DPDK environment to build
----------------------------------------------------------
[1] arm64-armada-linuxapp-gcc
[2] arm64-armada-linux-gcc
[3] arm64-armv8a-linuxapp-clang
[4] arm64-armv8a-linuxapp-gcc
[5] arm64-armv8a-linux-clang
[6] arm64-armv8a-linux-gcc
[7] arm64-bluefield-linuxapp-gcc
[8] arm64-bluefield-linux-gcc
[9] arm64-dpaa2-linuxapp-gcc
[10] arm64-dpaa2-linux-gcc
[11] arm64-dpaa-linuxapp-gcc
[12] arm64-dpaa-linux-gcc
[13] arm64-octeontx2-linuxapp-gcc
[14] arm64-octeontx2-linux-gcc
[15] arm64-stingray-linuxapp-gcc
[16] arm64-stingray-linux-gcc
[17] arm64-thunderx2-linuxapp-gcc
[18] arm64-thunderx2-linux-gcc
[19] arm64-thunderx-linuxapp-gcc
[20] arm64-thunderx-linux-gcc
[21] arm64-xgene1-linuxapp-gcc
[22] arm64-xgene1-linux-gcc
[23] arm-armv7a-linuxapp-gcc
[24] arm-armv7a-linux-gcc
[25] i686-native-linuxapp-gcc
[26] i686-native-linuxapp-icc
[27] i686-native-linux-gcc
[28] i686-native-linux-icc
[29] ppc_64-power8-linuxapp-gcc
[30] ppc_64-power8-linux-gcc
[31] x86_64-native-bsdapp-clang
[32] x86_64-native-bsdapp-gcc
[33] x86_64-native-freebsd-clang
[34] x86_64-native-freebsd-gcc
[35] x86_64-native-linuxapp-clang
[36] x86_64-native-linuxapp-gcc
[37] x86_64-native-linuxapp-icc
[38] x86_64-native-linux-clang
[39] x86_64-native-linux-gcc
[40] x86_64-native-linux-icc
[41] x86_x32-native-linuxapp-gcc
[42] x86_x32-native-linux-gcc

----------------------------------------------------------
 Step 2: Setup linux environment
----------------------------------------------------------
[43] Insert IGB UIO module
[44] Insert VFIO module
[45] Insert KNI module
[46] Setup hugepage mappings for non-NUMA systems
[47] Setup hugepage mappings for NUMA systems
[48] Display current Ethernet/Baseband/Crypto device settings
[49] Bind Ethernet/Baseband/Crypto device to IGB UIO module
[50] Bind Ethernet/Baseband/Crypto device to VFIO module
[51] Setup VFIO permissions

----------------------------------------------------------
 Step 3: Run test application for linux environment
----------------------------------------------------------
[52] Run test application ($RTE_TARGET/app/test)
[53] Run testpmd application in interactive mode ($RTE_TARGET/app/testpmd)

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

----------------------------------------------------------
 Step 5: Uninstall and system cleanup
----------------------------------------------------------
[55] Unbind devices from IGB UIO or VFIO driver
[56] Remove IGB UIO module
[57] Remove VFIO module
[58] Remove KNI module
[59] Remove hugepage mappings

[60] Exit Script

Option: 39

编译成功则如下图所示:

dpdk testpmd设置 dpdk配置_v8_03

5.设置dpdk的环境变量
上面编译成功之后需要退出脚本,然后执行下面的命令设置环境变量:

export RTE_SDK=/home/jian/share/dpdk-stable-19.08.2
export RTE_TARGET=x86_64-native-linux-gcc

6.禁止eth0
由于我们的多队列网卡是eth0,所以接下来我么都是操作eth0.
我们先使用下面的命令把eth0禁止:

sudo ifconfig eth0 down

7.igb_uio模块
设置完dpdk环境变量和禁止eth0后,我们再次执行脚本插入igb_uio模块:

./usertools/dpdk-setup.sh

然后选择43,具体log看下面:

dpdk testpmd设置 dpdk配置_linux_04


插入igb_uio模块后,我们选择49绑定igb_uio模块到eth0,我们输入我们的PCI地址:0000:03:00:0,就可以成功绑定我们的网卡到igb_uio模块了,详细log如图所示:

dpdk testpmd设置 dpdk配置_dpdk testpmd设置_05

8.运行testpmd程序

为了测试我们dpdk环境是否ok,我们尝试运行一下dpdk自带的测试程序testpmd。

option我们选择53,然后bitmask设置为7,运行成功则如下图所示:

dpdk testpmd设置 dpdk配置_学习_06


这时候我们可以输入指令 show port info 0 查看我们的接口信息:

dpdk testpmd设置 dpdk配置_dpdk testpmd设置_07

9.运行第一个dpdk程序

dpdk的源代码有很多例子程序,都放在example目录中,其中有个最简单的程序helloworld,我们进入example/helloworld中,直接make,可以编译出helloworld程序。最后我们使用root权限执行,结果如下图所示:

dpdk testpmd设置 dpdk配置_dpdk testpmd设置_08

到此为止,我们的dpdk环境已经准备好了。下次我们尝试自己编写一个dpdk程序,88!