Ubuntu18.04安装DPDK20.11.1超详细!

Posted 想实习犯法吗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ubuntu18.04安装DPDK20.11.1超详细!相关的知识,希望对你有一定的参考价值。

文章目录

一.工具集安装

1.GCC

sudo apt install build-essential
// 检验gcc版本
gcc --version
 gcc --version
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

2.pip3安装ninja

pip3 install meson ninja

3.安装numa依赖

apt-get install libnuma-dev

4.在linux中使用大页面

1.查看宿主机中内存页的大小
通常情况下,内存页大小为4KB。

getconf PAGESIZE
4096

2.查看宿主机中透明大页是否开启

cat /sys/kernel/mm/transparent_hugepage/enabled
always [madvise] never

3.开启透明大页

echo always > /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

4.查看宿主机中HugePage的大小

cat /proc/meminfo |grep -i HugePages
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

HugePages_Total: Hugepage的页面数量
HugePages_Free: 剩余的页面数量
HugePages_Rsvd: 被分配预留但是还没有使用的page数目
HugePages_Surp:HugePages_Total减去/proc/sys/vm/nr_hugepages中的值

5.挂载大页
内存只有被挂载了之后,才能被应用程序使用。到刚创建的huge目录下,挂载hugetlbfs文件系统。

sudo mount -t hugetlbfs  nodev /mnt/huge
mount |tail -1
//nodev on /mnt/huge type hugetlbfs (rw,relatime,pagesize=2M)

6.使用sysctl(sysctl命令用于设置和显示在/proc/sys目录中的内核参数)命令设置vm.nr_hugepages,将大页个数设置为200(200 * 2M=400M,需要确保宿主机有足够可以分配的内存)。

sudo sysctl vm.nr_hugepages=200
//vm.nr_hugepages = 200
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
HugePages_Total:     200
HugePages_Free:      200
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

7.大页内存挂载

mkdir /mnt/huge
sudo mount -t hugetlbfs pagesize=1GB /mnt/huge

通过在/etc/fstab文件中添加以下行,可以使挂载点在重新引导期间永久存在:

sudo vim /etc/fstab
//大页大小为1GB
nodev /mnt/huge hugetlbfs pagesize=1GB 0 0
//大页大小为2MB
nodev /mnt/huge hugetlbfs defaults 0 0

5.内核版本>=3.16

uname -r
#4.15.0-29-generic

6.glibc>=2.7

ldd --version

升级glibc 需要2.7版本 目前为2.27

wget http://ftp.gnu.org/gnu/glibc/glibc-2.7.tar.gz
tar -zxvf glibc-2.7.tar.gz
../glibc-2.7/configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin

配置configure时出现错误

These critical programs are missing or too old: as ld gcc make *** Check the INSTALL file for required versions
wget http://ftp.gnu.org/gnu/binutils/binutils-2.35.tar.gz

升级失败,目前用不上,暂时不用管了

二.安装DPDK及源码

tar xJf dpdk-20.11.1.tar.xz
cd dpdk-stable-20.11.1

DPDK源文件由几个目录组成:

lib: DPDK 库文件
drivers: DPDK 轮询驱动源文件
app: DPDK 应用程序 (自动测试)源文件
examples: DPDK 应用例程
config, buildtools, mk: 框架相关的makefile、脚本及配置文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210520100037122.png

三.在系统范围内编译和安装DPDK

DPDK可以配置,构建并安装使用的工具在系统上 meson和ninja。

1.dpdk配置

meson <options> build

出现错误

The Meson build system
Version: 0.45.1
Source dir: /home/dpdk-stable-20.11.1
Build dir: /home/dpdk-stable-20.11.1/build
Build type: native build
Program cat found: YES (/bin/cat)

meson.build:4:0: ERROR: Meson version is 0.45.1 but project requires >= 0.47.1.

A full log can be found at /home/dpdk-stable-20.11.1/build/meson-logs/meson-log.txt

修改方法:

pip3 install --user meson
//可以安装最新版,但是version还是显示以前低版本的

继续搜索发现pip3会将软件安装到/home/user/.local/bin
而系统默认是使用/usr/bin/meson
所以通过修改path路径使得pip安装的meson优先于系统meson被搜索到

export PATH=~/.local/bin:$PATH

配置完成后,即可构建并安装DPDK,并在系统范围内使用:

cd build
ninja
//[2415/2415] Linking target app/test/dpdk-test
sudo  ninja install
sudo ldconfig
build/app/dpdk-testpmd -c7 --vdev=net_pcap0,iface=eth0 --vdev=net_pcap1,iface=eth1 -- -i --nb-cores=2 --nb-ports=2 --total-num-mbufs=2048

四.Linux驱动程序

不同的PMD可能需要不同的内核驱动程序才能正常工作。根据所使用的PMD,应加载相应的内核驱动程序,并将网络端口绑定到该驱动程序。

1.音频输出

sudo modprobe vfio-pci

3.UIO

在无法使用VFIO的情况下,可以使用其他驱动程序。在许多情况下,uio_pci_genericLinux内核中包含的标准模块可以替代VFIO。可以使用以下命令加载该模块:

sudo modprobe uio_pci_generic

作为替代方案,可以在存储库dpdk-kmods中找到uio_pci_generic该igb_uio模块。可以如下所示加载它:

sudo modprobe uio
sudo insmod igb_uio.ko

4.与内核模块之间的网络端口绑定和解绑定

./usertools/dpdk-devbind.py --status

解绑

sudo ifconfig ens33 down
//要将设备eth1``04:00.1''绑定到uio_pci_generic驱动程序
./usertools/dpdk-devbind.py --bind=uio_pci_generic ens33

4.1问题:绑定失败

尝试用vfio-pic驱动,uio_pci_generic驱动绑定网卡,都失败,绑定不上,原因

Error: unbind failed for 0000:02:06.0 - Cannot open /sys/bus/pci/drivers/e1000/unbind

还没有找到合适的解决方法
想法:换igb_uio驱动
成功了!!!!

sudo ./usertools/dpdk-devbind.py --bind=igb_uio 0000:02:06.0

记得sudo!

4.2问题:dpdk是否支持该网卡

#查询网卡的devid号
lspci -nn | grep Ethernet
02:01.0 Ethernet controller [0200]: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) [8086:100f] (rev 01)
02:06.0 Ethernet controller [0200]: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) [8086:100f] (rev 01)

#在dpdk代码中搜索此devid号,
grep --include=*.h -rn -e '100f'

dpdk-stable-20.11.1/drivers/net/bnx2x/ecore_reg.h:1274:#define NIG_REG_BRB0_OUT_EN					 0x100f8
dpdk-stable-20.11.1/drivers/net/bnx2x/ecore_reg.h:2112:#define NIG_REG_XCM0_OUT_EN					 0x100f0
dpdk-stable-20.11.1/drivers/net/bnx2x/ecore_reg.h:2114:#define NIG_REG_XCM1_OUT_EN					 0x100f4
dpdk-stable-20.11.1/drivers/net/bnx2x/ecore_hsi.h:2669:	#define SHMEM_AFEX_VERSION_MASK                  0x100f
dpdk-stable-20.11.1/drivers/common/sfc_efx/base/efx_regs_mcdi.h:349:#define	MC_CMD_ERR_NO_MAC_ADDR 0x100f

是Intel支持的一种虚拟网卡,可以绑定的!

4.3安装igb_uio驱动

官网给的下载地址http://git.dpdk.org/dpdk-kmods

make

sudo apt install libelf-dev

5.最后以成功的截图纪念一下我为之努力的两天

五.第一个实例helloworld

1.make

make

2.执行./helloworld

./helloworld

3.结果

EAL: Detected 1 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Detected shared linkage of DPDK
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:   Invalid NUMA socket, default to 0
EAL: No legacy callbacks, legacy socket not created
hello from core 0

1.问题1:make时找不到pkg_config

sudo apt-get install pkg-config

2.问题2:执行时出现如下错误

EAL: Detected 1 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /run/user/1000/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'VA'
EAL: No available hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: Couldn't get fd on hugepage file
EAL: error allocating rte services array
EAL: FATAL: rte_service_init() failed
EAL: rte_service_init() failed
PANIC in main():
Cannot init EAL
5: [./helloworld(+0x84a) [0x55ee64f0e84a]]
4: [/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7) [0x7f5b64996bf7]]
3: [./helloworld(+0x818) [0x55ee64f0e818]]
2: [/usr/local/lib/x86_64-linux-gnu/librte_eal.so.21(__rte_panic+0xc5) [0x7f5b64d72285]]
1: [/usr/local/lib/x86_64-linux-gnu/librte_eal.so.21(rte_dump_stack+0x2e) [0x7f5b64d9445e]]
已放弃 (核心已转储)

改正:使用sudo

3.问题3:EAL: Error enabling interrupts for fd 19 (输入/输出错误)

原因:在虚拟机添加的网卡,dpdk不支持导致的。需要修改一行代码,跳过dpdk pci 检查
在dpdk-kmods/linux/igb_uio/igb_uio.c文件中找到

pci_intx_mask_supported(dev)

修改为

pci_intx_mask_supported(dev||true)

重新编译并加载该模块!
删除linux中驱动的命令:

rmmod igb_uio.ko

终于成功了,留下感动的泪水呜呜呜呜。。。。。。

以上是关于Ubuntu18.04安装DPDK20.11.1超详细!的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu18.04安装DPDK20.11.1超详细!

DPDK — 安装部署(Ubuntu 18.04)

卸载使用 ninja 安装的 dpdk

DPDK-20.11.1版本在Centos8上安装和测试

DPDK中使用VFIO的配置

dpdk20.11.1学习-2.skeleton