DPDK 与DPDK-Pktgen 安装

文本将介绍DPDK与Pktgen的安装。

安装包下载

DPDK与DPDK-Pktgen下载

# git clone https://dpdk.org/git/dpdk
# git clone http://dpdk.org/git/apps/pktgen-dpdk

安装DPDK

首先安装DPDK的必备库。

#!/bin/sh

yum update -y --allowerasing --skip-broken --nobest
yum install -y gcc-toolset-9
yum install -y zlib-devel
yum install -y libnl3-devel
yum install -y boost-devel
yum install -y systemd-devel
yum install -y yasm
yum install -y lz4-devel
yum install -y elfutils-libelf-devel
yum install -y openssl-devel
yum install -y numactl-devel
yum install -y python3
pip3 install mwcp # python3需要安装 mwcp , 才可以继续安装meson build, 
pip3 install meson # Build DPDK和DPDK-pktgen的工具
pip3 install ninja # 安装DPDK和DPDK-pktgen的工具

meson 如果安装不上去,

设置大页内存

设置大页内存有两种方式,通过挂载或者通过修改grub。

挂载的方式如下:

echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
mkdir /mnt/huge
mount -t hugetlbfs pagesize=1GB/mnt/huge
# modprobe vfio
# modprobe vfio_pci
# modprobe uio_pci_generic
# modprobe vfio enable_unsafe_noiommu_mode=1
# echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode

修改grub的方式如下:进入/etc/default/grub,把 default_hugepagesz=1GB hugepagesz=1G hugepages=100 intel_iommu=on iommu=pt 添加到GRUB_CMDLINE_LINUX:

# vim /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet default_hugepagesz=1GB hugepagesz=1G hugepages=100 intel_iommu=on iommu=pt"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true

重新载入grub并重启:

grub2-mkconfig -o /boot/grub2/grub.cfg
reboot

通过grep Huge /proc/meminfo检查是否设置成功:

AnonHugePages:    149504 kB
ShmemHugePages:        0 kB
HugePages_Total:     100
HugePages_Free:      100
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:    1048576 kB
Hugetlb:        104857600 kB

有时候会出现这个错误:

[root@localhost grub2]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
/usr/bin/grub2-editenv: error: environment block too small.
[root@localhost grub2]# ls
grub.cfg  grub.cfg.new  grub.cfg.old  grubenv

这一般是grubenv文件配置导致的,该文件是environment block, 环境锁,在该文件中将default_hugepagesz=1GB hugepagesz=1G hugepages=100 intel_iommu=on iommu=pt添加到kernelopts中(与grub.cfg一致)。

# GRUB Environment Block
#saved_entry=4df9ab5a7ada4793a22d0d4668f7e914-4.18.0-193.el8.x86_64
#saved_entry=1
kernelopts=root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet default_hugepagesz=1GB hugepagesz=1G hugepages=100 intel_iommu=on iommu=pt
boot_success=0

设置大页内存,可以参考:

Setup Hugepages

Setup HugePages 2

安装Pktgen

Pktgen安装必须要有的库有:

libpcap # 数据包捕获函数库
meson
ninja
pkg-config # 指向头文件和库文件的工具,给编译器使用,类似快捷方式

进入pktgen源文件目录进行安装:

cd pktgen-dpdk
meson build # meson编译时容易报错
ninja 
ninja install

在执行meson build时,可能会出现以下问题:

Found pkg-config: /usr/bin/pkg-config (1.4.2)
Found CMake: /usr/bin/cmake (3.18.2)
Run-time dependency libdpdk found: NO (tried pkgconfig and cmake)

meson.build:62:0: ERROR: Dependency "libdpdk" not found, tried pkgconfig and cmake

显示没有找到dpdk相关的库,原因在于dpdk编译时生成的库并没有放入/usr/lib与/lib中。dpdk相关的库数量非常多,如果直接拖动到这两个文件夹中,不方便管理。因此可以采用ld.so的方式进行类似"快捷方式"的连接,dpdk的库不需要移动位置就可以被其他的程序调用。

解决方法如下:

先将已安装的dpdk全部删除干净,目的是重新安装DPDK且其lib有一个固定的位置。
如果是只删除原来用meson和ninja安装的DPDK, 直接执行:

ninja uninstall 

再删除创建的dpdk-xxx/build文件夹。

但是有可能机器里安装了DPDK在其他位置。

find /usr/ -type d -name "dpdk" -exec rm -rf {} #在/usr/下寻找所有带有"dpdk"字符的目录 并且删除所有结果
find /lib/ -type d -name "dpdk" -exec rm -rf {} 
find /lib64/ -type f -name "librte" -exec rm -rf {} #在/lib64/下寻找带有"librte"字符的文件,并且删除所有结果
find /usr/ -type f -name "librte" -exec rm -rf {}
find /lib/ -type f -name "librte" -exec rm -rf {}

执行完再重新安装DPDK,一般安装完之后的库在/lib64/下(如果在其他的地方也没有问题,仍然使用ldconfig 进行配置)。安装过程上文已写出。关键在于安装完毕之后配置libdpdk的路径。新版的DPDK安装完之后并没有名叫“libdpdk”的包,而是各种分为了许许多多名字不一的包,可以在dpdk-xxx/build/lib中看到,需要将该目录中的所有库文件被ld.so指向。

配置ldconfig文件:

# vim /etc/ld.so.conf.d/pktgen.conf
# 在该配置文件中加入需要指向的库文件目录

/usr/local/lib64
/dpdk-20.11/build/lib

在命令行模式下执行export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfigldconfig,之后就可以顺利编译pktgen了:

# cd dpdk-pktgen
yum install -y libpcap-devel
meson  -Denable_kmods=true -Dexamples=all build
ninja
ninja install
posted @ 2022-02-26 17:37  goto2091  阅读(2943)  评论(0编辑  收藏  举报