前面把环境基本搭好,今天开始编译DPDK。首先是下载DPDK的源码,地址是:
https://core.dpdk.org/download/
也可以从官网https://www.dpdk.org/跳过来。然后就可以看到排下载的DPDK的版本:
这里下载的是DPDK 19.11.14(LTS),按网上的资料说,DPDK的编译分为两种情况,19.11(含)前,使用的是Gcc Make,而此后的新版本,可能是为了某些情况,使用了meson ninja。再次提醒一下,最好把环境需要的相关工具准备好,不然编译过程被打断挺麻烦的。
需要的主要工具有:make,gcc(g++,gdb顺道一起装上),python,libnuma-dev
另外,不同的操作系统和不同的DPDK的版本可能需要的相关库也略有不同,根据实际报告的错误安装即可。
官方的安装说明及相关文档地址:
http://core.dpdk.org/doc/archives/
源码下载比较慢,如果不使用镜像,有点耐心。
1、源码解压
tar -xvf dpdk-19.11.14.tar.xz
得到dpdk-stable-19.11.14文件夹。
2、编译预选项
使用如下命令进入usertools文件夹找dpdk-setup.sh在编译前,执行一下:
第一步:
cd dpdk-stable-19.11.14/usertools
./dpdk-setup.sh
会出来以下画面:
说明整个编译过程需要五个大的步骤,即:选择编译环境,设置Linux环境,运行测试程序,其它工具选项和卸载清理。
3、编译
可以选择65退出也可以CTRL C强行退出:
./dpdk-setup.sh
这里说明一下,从dpdk18开始,就不用提前设置环境变量了,这个在编译早期版本,设置环境变量的方法,网上有很好,此处不再赘述。
上来就是一个翻车现场:
/bin/sh: 2: cc: not found
cat: /home/fpc/dpdk-stable-19.11.14/x86_64-native-linuxapp-gcc/.config_tmp: No such file or directory
Configuration done using x86_64-native-linuxapp-gcc
/home/fpc/dpdk-stable-19.11.14/mk/rte.vars.mk:56: *** RTE_ARCH is not defined. Stop.
make[2]: *** [/home/fpc/dpdk-stable-19.11.14/mk/rte.sdkroot.mk:99: all] Error 2
make[1]: *** [/home/fpc/dpdk-stable-19.11.14/mk/rte.sdkinstall.mk:61: pre_install] Error 2
make: *** [/home/fpc/dpdk-stable-19.11.14/mk/rte.sdkroot.mk:77: install] Error 2
------------------------------------------------------------------------------
RTE_TARGET exported as x86_64-native-linuxapp-gcc
------------------------------------------------------------------------------
无语,没有设置CC编译器,使用GCC -v查看,果然没有安装,使用下面的命令:
sudo apt install gcc
sudo apt install g++
sudo apt install gdb
安装上相关编译器,再次招待可以向下进行。
因为是UBUNTU,所以选择41(x86_64-native-linuxapp-gcc),就会开始编译,这个第一次编译可能会需要一段时间,看机器配置,完成会报告没有错误,但会有如下的消息:
Build complete [x86_64-native-linuxapp-gcc]
Installation cannot run with T defined and DESTDIR undefined
这个是指需要把编译成功的代码拷贝到指定位置,这个可以不做,所以这里也没有给出错误,只是一个提示。如果非要解决可以在mk文件中修改:
dpdk-setup.sh fails to build with lack of environment variable
Build complete [x86_64-native-linuxapp-gcc]
Installation cannot run with T defined and DESTDIR undefined
Signed-off-by: Choonho Son <***@gmail.com>
---
usertools/dpdk-setup.sh | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/usertools/dpdk-setup.sh b/usertools/dpdk-setup.sh
index 5eebbce..5248e7a 100755
--- a/usertools/dpdk-setup.sh
+++ b/usertools/dpdk-setup.sh
@@ -65,6 +65,7 @@ setup_target()
{
option=$1
export RTE_TARGET=${TARGETS[option]}
+ export DESTDIR=${DESTDIR:-install}
compiler=${RTE_TARGET##*-}
if [ "$compiler" == "icc" ] ; then
@@ -76,7 +77,7 @@ setup_target()
fi
fi
if [ "$QUIT" == "0" ] ; then
- make install T=${RTE_TARGET}
+ make install T=${RTE_TARGET} DESTDIR=${DESTDIR}
fi
echo "------------------------------------------------------------------------------"
echo " RTE_TARGET exported as $RTE_TARGET"
其实就是增加两个指定的环境变量,地址按需要来定义即可。
命令提示为:“press enter to continue …”,回车进入下一步。
第二步:
指定DPDK加载的模块,这里使用48(igb_uio),此处没有什么可说的。成功显示:
unloading any existing DPDK UIO module
loading uio module
loading DPDK UIO module
VFIO:最安全的转发方式,可以添加IOMMU功能
IGB_UIO:候补模式,都安装不上的时候的备选
KNI:Linux系统内核自带的方式
第三步:
设置大页内存,这里选项52(Setup hugepage mapping for NUMA systems)
NUMA,这个是用来支持多CPU效率的。大页设置可以是64,256,这里第一次使用了64,但是在后面测试时有错误,分配不了内存,不知道是不是这个原因,但后来改成了256,就没问题了:
Removing currently reserved hugepages
Unmounting /mnt/huge and removing directory
Input the number of 2048kB hugepages for each node
Example: to have 128MB of hugepages available per node in a 2MB huge page system,
enter '64' to reserve 64 * 2MB pages on each node
Number of pages for node0: 64
Reserving hugepages
Creating /mnt/huge and mounting as hugetlbfs
第四步:
绑定网卡,回车后可以输入53,先查看一下当前网卡的情况,结果报:
/usr/bin/env: ‘python’: No such file or directory
软链接:ln -s /usr/bin/python3 /usr/bin/python
已经安装了Python,但是没有做软链接名字改成Python,所以输入:
sudo ln -s /usr/bin/python3 /usr/bin/python
再次执行:
Network devices using kernel driver
===================================
0000:02:06.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens38 drv=e1000 unused=igb_uio,vfio-pci *Active*
0000:03:00.0 'VMXNET3 Ethernet Controller 07b0' if=ens160 drv=vmxnet3 unused=igb_uio,vfio-pci *Active*
如果是挂在的IGB_UIO模块,就使用54来绑定网卡
如果是 VFIO模块,使用55来绑定网卡
这里有一个问题,看上面,两个网卡都是Active,在绑定时,会报绑定无效。即:
Enter PCI address of device to bind to IGB UIO driver: 03:00.0
Warning: routing table indicates that interface 0000:03:00.0 is active. Not modifying
OK
所以得先用ifdown命令处理一下:
sudo ifdown ens160
然后可以用ifconfig -a 命令看一下结果。
然后再按54,请输入53时网卡的ID,可以不输入前面的0000,只输入03:00.0即可。如果重复执行,会报已经绑定的提示。
第五步:
开始测试一下前面的配置是否成功,输入58,在前面提到了大内存时输入64,报下面的错误:
Enter hex bitmask of cores to execute testpmd app on
Example: to execute app on cores 0 to 7, enter 0xff
bitmask: 0xff
Launching app
EAL: Detected 8 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: No available hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: VFIO support initialized
EAL: PCI device 0000:02:06.0 on NUMA socket -1
EAL: probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:03:00.0 on NUMA socket -1
EAL: probe driver: 15ad:7b0 net_vmxnet3
Interactive-mode selected
Failed to set MTU to 1500 for port 0
testpmd: create a new mbuf pool : n=203456, size=2176, socket=0
testpmd: preferred mempool ops selected: ring_mp_mc
EAL: Error - exiting with code: 1
Cause: Creation of mbuf pool for socket 0 failed: Cannot allocate memory
Press enter to continue ...
----------------------------------------------------------
Step 1: Select the DPDK environment to build
----------------------------------------------------------
有提示,0~7输入0xff,依次算就可以,如果是四个则是0xf.
重新输入52,输入256,再依次下来到58,即报成功:
Enter hex bitmask of cores to execute testpmd app on
Example: to execute app on cores 0 to 7, enter 0xff
bitmask: 0xff
Launching app
EAL: Detected 8 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: No available hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: VFIO support initialized
EAL: PCI device 0000:02:06.0 on NUMA socket -1
EAL: probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:03:00.0 on NUMA socket -1
EAL: probe driver: 15ad:7b0 net_vmxnet3
Interactive-mode selected
Failed to set MTU to 1500 for port 0
testpmd: create a new mbuf pool : n=203456, size=2176, socket=0
testpmd: preferred mempool ops selected: ring_mp_mc
Warning! port-topology=paired and odd forward ports number, the last port will pair with itself.
Configuring Port 0 (socket 0)
Port 0: 00:0C:29:98:E3:76
Checking link statuses...
Done
这里仍然有一个小问题,就是设置MTU,但这个似乎没影响测试,此处再回车,会出一些配置的信息,这里就没贴出来了。下面简单说明一下测试命令testpmd的用法:
testpmd> start :开始转发
testpmd> stop :停止转发,结束时会显示转发的汇总(收、发、drop)
testpmd> quit :退出testpmd示例
testpmd> show config fwd:显示当前的配置(端口、核心、流)
testpmd> show port stats all :展示所有端口的收发包信息
这样,基本DPDK就安装完成了。
基本环境搭建和编译是学习所有工具或者软件的一个麻烦之处,并不在于多难,一个是大家都明白的网络的问题,另外一个是一些小细节不同的版本和OS以及不同的机器都可能出一些莫名其妙的问题。这就需要自己去看着错误消息去思考和在网上查找了。比如前面第一个错误就报CC问题,应该一下就明白没有编译器。
学过JAVA的朋友可能深有体会,所以学习时这个拦路虎很腻歪,弄不好就成为放弃的理由,希望还是要坚持下去。毕竟如今不同以往,网上各种信息还是相当多的。