文本将介绍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
设置大页内存,可以参考:
安装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/pkgconfig
与ldconfig
,之后就可以顺利编译pktgen了:
# cd dpdk-pktgen
yum install -y libpcap-devel
meson -Denable_kmods=true -Dexamples=all build
ninja
ninja install