DPDK在centos8中安装编译

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

问题汇总:
(1)可能会要让重新安装python3
(2)在这里插入图片描述

解决方法:
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. 配置编译的环境
    在进入界面之后首先要执行36 配置编译的环境。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

问题汇总:
(1)内核版本和dpdk的模块版本不一致导致的问题
在这里插入图片描述

得让他们一样
解决方法:
Cd /usr/src/kernels/ 如果该目录下没有系统内核源码,执行以下操作
yum install kernel-devel
然后进行升级重启解决版本不一致
yum -y update kernel kernel-devel
再重启
reboot
再此查看,版本号一致,问题解决
在这里插入图片描述

(2)缺失包,依次下载即可[]
在这里插入图片描述

解决方法:
yum install elfutils-libelf-devel

(3)代码文件错误
在这里插入图片描述

解决方法: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分钟):

在这里插入图片描述

  1. 选择硬件支持的模式
    选择 43 。

在这里插入图片描述

问题汇总:
(1)在这里插入图片描述

解决办法:执行$ sudo modprobe uio,手动向内核中加载uio模块。

编译完成,结果如下:
在这里插入图片描述

  1. 配置大页
    方法一
    执行 47.
    在这里插入图片描述
    在这里插入图片描述

编译完成,结果如下:
在这里插入图片描述

方法二
(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 .* (seds,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包

在这里插入图片描述

一致。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值