DPDK编译安装指南
安装dpdk有两种方式:第一种命令;第二种使用dpdk-setup.sh。这次主要是通过dpdk-setup.sh方式来安装。
一.准备工作
CentOS版本信息:CentOS Linux release 8.2.2004 (Core)
1.下载dpdk
进入dpdk官网,下载想要的版本:http://core.dpdk.org/download/
使用的dpdk版本为;dpdk-stable-19.08.2
2.下载相应需要的依赖和工具包
yum install -y kernel-devel kernel-headers
yum install kernel.x86_64 -y
yum install gcc
(根据编译安装dpdk时候的提示是否还有其他需要安装的依赖库,在此就不一一列举了。)
编译工具安装meson和ninja
pip3 install meson ninja
安装libpcap包
yum -y install gcc-c++ (安装GCC)
yum -y install flex (安装flex)
注: 没有flex,直接安装libpcap会提示"Your operating system’s lex is insufficient to compile libpcap"错误;
安装bison
yum -y install bison
安装 libpcap
下载地址:http://www.tcpdump.org/
下载版本:wget -c http://www.tcpdump.org/release/libpcap-1.5.3.tar.gz
解压软件包:tar zxf libpcap-1.0.0.tar.gz
进入解压后的目录,输入命令行:
命令如下:
./configure
make
make install
注;这个如果不行 可以尝试用我给的其中备用的lib1.3.0的版本。有时候会出现未知的编译错误。更换包版本解决的这个问题
http://blog.chinaunix.net/uid-15464162-id-3351721.html
解决方法:
yum -y install gcc automake autoconf libtool make
yum install gcc gcc-c++
二.环境变量设置
在dpdk-stable-19.08.2的根目录下,创建一个dpdkenv的文件,在里面填充如下三个内容:
export RTE_ARCH=“x86_64”
export RTE_SDK=‘pwd’ (pwd是你当前dpdk的解压目录)
Eg:export RTE_SDK=’/root/dpdk1/dpdk-stable-19.08.2’
查看查看centos内核的版本: cat /proc/version
export RTE_TARGET=x86_64-native-linuxapp-gcc
(对于64位机使用这个命令,对于32位机使用命令i686-native-linuxapp-gcc)
执行一下 source dpdkenv。
注: 如果不行,可以考虑直接命令行输入这三条内容。
export RTE_ARCH=“x86_64”
export RTE_SDK=’/root/dpdk1/dpdk-stable-19.08.2’
export RTE_TARGET=x86_64-native-linuxapp-gcc
三.通过dpdk提供的脚本文件来进行安装dpdk
在/root/dpdk1/dpdk-stable-19.08.2/usertools(这个参考自己的解压位置而定)目录下,执行./dpdk-setup.sh
问题汇总:
(1)内核版本和dpdk的模块版本不一致导致的问题
得让他们一样
解决方法:
Cd /usr/src/kernels/ 如果该目录下没有系统内核源码,执行以下操作
yum install kernel-devel
然后进行升级重启解决版本不一致
yum -y update kernel kernel-devel
再重启
reboot
再此查看,版本号一致,问题解决
解决方法:
yum install elfutils-libelf-devel
解决方法:yum install numactl-devel*x86_64安装numa.h相关库即可解决
/root/dpdk/dpdk-stable-19.08.2/x86_64-native-linuxapp-gcc/build/kernel/linux/kni/kni_net.c:737:20: error: initialization of ‘void (*)(struct net_device , unsigned int)’ from incompatible pointer type ‘void ()(struct net_device *)’ [-Werror=incompatible-pointer-types]
.ndo_tx_timeout = kni_net_tx_timeout,
解决方法:
cd /root/dpdk/dpdk-stable-19.08.2/x86_64-native-linuxapp-gcc/build/kernel/linux/kni
vi kni_net.c
按esc,;set number 737行 然后按i进入插入模式,将报错部分注释掉
然后会出现
/root/dpdk/dpdk-stable-19.08.2/x86_64-native-linuxapp-gcc/build/kernel/linux/kni/kni_net.c:594:1: error: ‘kni_net_tx_timeout’ defined but not used [-Werror=unused-function]
kni_net_tx_timeout(struct net_device *dev)
解决方法:
cd /root/dpdk/dpdk-stable-19.08.2/x86_64-native-linuxapp-gcc/build/kernel/linux/kni
Vi Makefile
找到Makefile,去掉其中-Werror (按esc进入编辑模式, 按“/”再输入关键词Werror找到这行),重新编译。
编译完成,结果如下(第一次比较慢,大概10分钟):
解决办法:执行$ sudo modprobe uio,手动向内核中加载uio模块。
方法二
(1)修改/etc/default/grub,在 GRUB_CMDLINE_LINUX 行增加需要的默认大页信息
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=" ( s e d ′ s , r e l e a s e . ∗ (sed 's, release .* (sed′s,release.∗,g’ /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT=“console”
GRUB_CMDLINE_LINUX=“default_hugepagesz=1G hugepagesz=1G hugepages=128 crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet”
GRUB_DISABLE_RECOVERY=“true”
(2)使修改生效到启动信息中
grub2-mkconfig -o /boot/grub2/grub.cfg
(3)重启系统
Reboot now
(4)查看内核cmdline并确定默认大页是否设置成功
cat /proc/meminfo |grep Huge
4.绑定网卡
脚本配置方法
首先关掉你要运行脚本的那张网卡 eg:
选择49,绑定网卡 ,
然后输入对应网卡的ip地址即可,比如我的是enp7s0是07:00.0
由于我可能是python安装路径的问题,直接使用脚本安装不行,会报以下错误,所以我 使用用的是手动配置的方法
./dpdk-setup.sh: /root/dpdk1/dpdk-stable-19.08.2/usertools/dpdk-devbind.py: /usr/bin/: bad interpreter: Permission denied
手动配置方法
[root@localhost usertools]# python3 dpdk-devbind.py --status 先查看自己的网卡配置信息
(注:起码需要有两张网卡,一张用于联网,一张可用于配置dpdk发包使用)
(这个方法的前提是前面./dpdk-setup.sh的36 和43已经完成)
首先要把用于dpdk的网卡先解绑
Ifconfig enp7s0 down
由于前面43步的时候,已经插入uio和igb_uio模块,所以这次可以直接绑定igb_uio驱动到eh2上
[root@localhost usertools]#
python3 dpdk-devbind.py --bind=igb_uio enp7s0
或者
python3 dpdk-devbind.py --bind=igb_uio 07:00.0
然后查看网卡驱动绑定状态
显示如此,表示绑定成功
问题汇总;
有时候服务器断开就导致环境变量丢失或者网卡解绑,当遇到问题的时候需要考虑下问题是否因为这两个因素导致。
四.dpdk安装测试
1.配置环境,如果上面搭建的时候配置了,就不需要再配置了:
export RTE_ARCH=“x86_64”
export RTE_SDK=’/root/dpdk1/dpdk-stable-19.08.2’
export RTE_TARGET=x86_64-native-linuxapp-gcc
2.编译代码
[root@localhost dpdk-stable-19.08.2]# cd examples/helloworld
再make
3.运行可执行文件
cd bulid
./helloworld
至此,基本的dpdk流程就跑完了。
五.Dpdk的发包和抓包工具
本文中的发包和抓包分别是在两台服务器中完成的,
在196.168.18.174这台上进行发包
在196.168.18.175这台上进行抓包操作
所以需要在两台服务器中都完成上述步骤安装了dpdk才能进行以下操作。
注:安装pktgen-DPDK发包工具及一系列操作是在174的服务器中完成
安装pdump抓包及一系列操作是在175的服务器中完成
1.安装pktgen-DPDK
pktgen-dpdk是用于对DPDK进行高速数据包测试的工具
把DPDK那一套流程走一遍(环境变量设置、设置userspace I/O态、挂载大页、绑定网卡)
pktgen就是基于dpdk开发的应用,所以只要能成功编译dpdk就可以编译pktgen。
Pktgen版本; 19.08.00
下载地址:https://git.dpdk.org/apps/pktgen-dpdk/refs/tags
(1)安装配置好DPDK,编译,绑定网卡,配置大页内存,运行测试实例成功,保证DPDK能够正常工作。
(2)安装:将Pktgen解压到dpdk目录里的examples文件夹内,进入Pktgen目录内,先设置环境变量(上面配置了就不用再配置了):
export RTE_ARCH=“x86_64”
export RTE_SDK=’/root/dpdk1/dpdk-stable-19.08.2’ (根据自己dpdk的位置设置)
export RTE_TARGET=x86_64-native-linuxapp-gcc (根据自安装的编译工具选择)
然后输出make进行编译
(3)不出问题的话编译完成后在/pktgen-3.4.8/app/x86_64-native-linuxapp-gcc这个路径下可以看到pktgen这个可执行文件
(4)在pktgen的主目录下输入命令:
./app/x86_64-native-linuxapp-gcc/pktgen -l 0-2 -n 3 – -P -m “[1].0, [2].1”
其中的-l -n -P -m均属于pktgen的指令,可以参考博文进行自定义设置:
https://www.jianshu.com/p/fa7d9f2c0f55
之后,在Pktgen:/> 指令下,输入start 0 或start 1就可以开始发包(0/1对应于dpdk绑定的两个网卡)。
pktgen会按照网卡最大速度进行发包,可以在start之前输入下列语句控制速度和包数量:
.
set all rate 10 # 在pktgen中设置速率为10%,更具体的速率设置可以通过tx_cycles设置
set 1 count 1000 # 每次start,1端口发1000个包
停止发包,输入 stop 0 或stop 1。
上图为发包时,pktgen的打印结果。
问题汇总:
这就是网卡不知道为啥解绑了,重新绑定即可
2.安装pdump
(1)加载环境变量
export RTE_ARCH=“x86_64”
export RTE_SDK=’/root/dpdk1/dpdk-stable-19.08.2’ (具体参考你的dpdk安装路径)
export RTE_TARGET=x86_64-native-linuxapp-gcc
export DESTDIR=‘/root/dpdk1/dpdk-stable-19.08.2/dpdk-pdump’ (同上)
(2)安装libpcap包(如果前面安装了 就不用管)
yum -y install gcc-c++ (安装GCC)
yum -y install flex (安装flex)
注: 没有flex,直接安装libpcap会提示"Your operating system’s lex is insufficient to compile libpcap"错误;
安装bison
yum -y install bison
安装 libpcap
下载地址:http://www.tcpdump.org/
下载版本:wget -c http://www.tcpdump.org/release/libpcap-1.5.3.tar.gz
解压软件包:tar zxf libpcap-1.0.0.tar.gz
进入解压后的目录,输入命令行:
命令如下:
./configure
make
make install
注;这个如果不行 可以尝试用我给的其中备用的lib1.3.0的版本。有时候会出现未知的编译错误。更换包版本解决的这个问题
http://blog.chinaunix.net/uid-15464162-id-3351721.html
(3).修改配置文件
在DPDK安装目录下,CONFIG文件夹中的common_base下修改,将n改为y,之后重新编译DPDK
[root@localhost ~]# vi dpdk1/dpdk-stable-19.08.2/config/common_base (这个前面的地址取决于你自己的路径)
CONFIG_RTE_LIBRTE_PMD_PCAP=y
CONFIG_RTE_LIBRTE_PDUMP=y
(4)安装pdummp
cd dpdk1/dpdk-stable-19.08.2/app/pdump/
make
Make install
(5)运行testpmd
首先得运行testpmd
pdump需要依附testpmd之类的主进程才可以运行
首先运行DPDK脚本,实现网卡绑定、设置大页内存等(按照前面步骤即可)
cd dpdk1/dpdk-stable-19.08.2/app/test-pmd/build/app
./build/app/testpmd -l 0-1 -n 1 – -i
(5)运行pdump
cd dpdk1/dpdk-stable-19.08.2/app/pdump/
./build/app/dpdk-pdump – --pdump ‘port=0,queue=*,rx-dev=/tmp/test.pcap’
参数解释:
port:网口编号(这里需要注意port的取值,一定是DPDK绑定的网卡,如绑定了3张网卡,那port取值范围就是0-2,对应于每个网卡)
queue:* 表示从所有队列抓包,NFV 上设置了几个 ffe instance 即几个队列,对于有 1G service port 的设备,最多可以开 8 个 ffe 队列,如果所有的 service port 都是 10G,则最多可以开 64 个 ffe 队列。
rx-dev:数据包存储文件
pdk发包测试
本文中的发包和抓包分别是在两台服务器中完成的,
在196.168.18.174这台上进行发包
在196.168.18.175这台上进行抓包操作
所以需要在两台服务器中都完成上述步骤安装了dpdk才能进行以下操作。
注:安装pktgen-DPDK发包工具及一系列操作是在174的服务器中完成
安装pdump抓包及一系列操作是在175的服务器中完成
1…运行pktgen(发包)
在pktgen的主目录下
./app/x86_64-native-linuxapp-gcc/pktgen -l 0-2 -n 3 – -P -m “[1].0, [2].1”
set 0 count 10000
start 0
2…运行testpmd和pdump
运行testpmd
cd dpdk1/dpdk-stable-19.08.2/app/test-pmd/build/app
./build/app/testpmd -l 0-1 -n 1 – -i
将网卡设为只读模式、非混杂模式(这样就只收pktgen发来的包)后开始收包
set fwd rxonly
set promisc all off
show port stats all
start
发了10000个收到了10000个。
运行pdump进行抓包并保存
cd dpdk1/dpdk-stable-19.08.2/app/pdump/
./build/app/dpdk-pdump – --pdump ‘port=0,queue=*,rx-dev=/tmp/test.pcap’
显示抓到的包也是10000个,然后用tshark查看抓到的pcap包
一致。