配置双网卡
在虚拟机中添加两块采用NAT模式的网卡(建议再增加一块用于联网的网卡)

此外,在本次测试中内存设置为6G,处理器数量2个、每个处理器的内核数量4(该参数根据实际情况设定)
安装依赖组件
安装Python3与PIP3,并
1
|
sudo apt install python3-pip
|
PIP3安装Meson与Ninjia,Meson负责构建项目依赖关系、Ninja进行编译
1
2
|
pip3 install meson ninja pwntools -i https://pypi.tuna.tsinghua.edu.cn/simple
sudo pip3 install meson ninja pwntools -i https://pypi.tuna.tsinghua.edu.cn/simple
|
【实测表明无需该命令】通过export将Python3添加进环境变量,若后续提示meson或ninjia不存在,再次运行该命令即可
1
|
export PATH=~/.local/bin:$PATH
|
安装Numa依赖
1
|
sudo apt-get install libnuma-dev
|
安装igb_uio模块
虽然PMD是在用户态实现的网卡驱动程序,但实际上还是会依赖于内核提供的策略。其中UIO内核模块是内核提供的用户态驱动框架,而IGB_UIO是DPDK用于与UIO交互的内核模块,通过igb_uio来绑定指定的PCI网卡设备到DPDK使用
IGB_UIO借助UIO技术来截获中断,并重设中断回调行为,从而绕过内核协议栈后续的处理流程,并且IGB_UIO会在内核初始化的过程中将网卡硬件寄存器映射到用户态
从DPDK官网下载源码,并解压
1
2
3
|
sudo apt install git
git clone http://dpdk.org/git/dpdk-kmods
cd dpdk-kmods/linux/igb_uio/
|
注意在虚拟机中添加的网卡,DPDK不支持,因此会出现EAL: Error enabling interrupts for fd 19报错
需要修改dpdk-kmods/linux/igb_uio/igb_uio.c中的代码,跳过DPDK PCI检查

1
2
3
4
|
// Original
pci_intx_mask_supported(udev->pdev)
// Change to
pci_intx_mask_supported(udev->pdev) || true
|
编译后,插入uio和igb_uio模块
1
2
3
|
make
sudo modprobe uio
sudo /sbin/insmod igb_uio.ko
|
验证模块安装正确

安装DPDK
下载DPDK
1
2
|
git clone git://dpdk.org/dpdk
cd dpdk
|
1
2
3
4
5
|
meson build
cd build
ninja
sudo ninja install
sudo ldconfig
|
设置巨页HugePage
查看当前系统的巨页信息:每个巨页的大小为2MB(Hugepagesize),并且系统中当前有0个巨页(HugePages_Total)
1
|
cat /proc/meminfo | grep Huge
|

这里:2MB*1024=2GB
1
2
3
4
5
|
sudo su
mkdir -p /dev/hugepages
mountpoint -q /dev/hugepages || mount -t hugetlbfs nodev /dev/hugepages
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
exit
|
一种简单的方法是直接使用DPDK提供的工具
1
|
sudo ./usertools/dpdk-hugepages.py -p 2M --setup 16G
|
绑定网卡
使用ifconfig检查系统当前挂载的两个网卡:ens33与ens34

使用dpdk工具usertools/dpdk-devbind.py查看当前的网卡状态:ens33与ens34都处于活动状态,且目前仍采用Linux内核驱动
1
|
./usertools/dpdk-devbind.py --status
|

将网卡ens33、ens34与Linux内核解绑
1
2
|
sudo ifconfig ens33 down
sudo ifconfig ens34 down
|
再次使用ifconfig与dpdk工具检查网卡绑定情况:ens33与ens34都不再处于活动状态
1
2
|
ifconfig
./usertools/dpdk-devbind.py --status
|


将ens33、ens34与dpdk使用igb_uio进行绑定,此时需使用ens33、ens34对应的ID号0000:02:01.0、0000:02:02.0
1
2
|
sudo ./usertools/dpdk-devbind.py --bind=igb_uio 0000:02:01.0
sudo ./usertools/dpdk-devbind.py --bind=igb_uio 0000:02:02.0
|
使用dpdk工具进行检验:此时两块网卡已通过igb_uio与dpdk进行绑定
1
|
./usertools/dpdk-devbind.py --status
|

测试示例
在dpdk/build下编译example示例helloworld
1
2
|
meson configure -Dexamples=helloworld
ninja
|
在/dpdk/build/examples文件下运行helloworld例程

一键脚本
为便于Ubuntu系统重启后完成巨页的配置和网卡的挂载,可使用脚本完成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
# chmod u+x boot-dpdk.sh
# sudo ./boot-dpdk.sh
# 若使用vfio-pci需要以下操作
# sudo vim /etc/default/grub
# 在GRUB_CMDLINE_LINUX行添加intel_iommu=on iommu=pt
# sudo update-grub
# sudo reboot
sudo echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
sudo ifconfig ens35 down
sudo ifconfig ens64f0 down
sudo ifconfig ens64f1 down
sudo ifconfig ens64f2 down
cd /home/hedwig/Halo/dpdk-stable-23.11.2/
sudo ./usertools/dpdk-hugepages.py -p 2M --setup 16G
sudo ./usertools/dpdk-devbind.py -b vfio-pci ens35
sudo ./usertools/dpdk-devbind.py -b vfio-pci ens64f0
sudo ./usertools/dpdk-devbind.py -b vfio-pci ens64f1
sudo ./usertools/dpdk-devbind.py -b vfio-pci ens64f2
./usertools/dpdk-hugepages.py -s
./usertools/dpdk-devbind.py --status
|