系统环境
操作系统: Win10
虚拟机软件:VMware Workstation 16
虚拟机系统:Ubuntu22.04,CPU个数 8,内存 4 G,网卡个数 4
要安装的 DPDK 版本:22.07
编译安装 DPDK
先安装一些依赖的软件包:
apt-get install meson
apt install python3-pyelftools
apt-get install pkg-config
再编译安装 DPDK:
wget https://fast.dpdk.org/rel/dpdk-22.07.tar.xz
tar xf dpdk-22.07.tar.xz
cd dpdk-22.07
meson build
cd build
ninja
ninja install
执行完之后所有的库都安装在 /usr/local/lib/x86_64-linux-gnu/
目录。
可执行程序和脚本都安装在 /usr/local/bin/
目录。
要卸载只需执行 ninja uninstall
即可。
编译裁剪
默认编译时,会默认编译不需要的驱动,导致编译很慢。由于我们是在虚拟机中,很多驱动都可以不需要,因此可以做裁剪。具体在执行 meson build 之前,
-
修改
drivers/meson.build
文件,subdirs 里只保留 ‘bus’,‘mempool’,‘net’ 即可。 -
修改
drivers/bus/meson.build
文件,drivers 里只保留 ‘pci’,‘vdev’ 即可。 -
修改
drivers/mempool/meson.build
文件,drivers 里只保留 ‘ring’,‘stack’ 即可。 -
修改
drivers/net/meson.build
文件,drivers 里只保留 ‘e1000’ 即可【因为虚拟机网卡使用的是 e1000 驱动】。
接着执行 meson build
,会看到如下信息:
Message:
===============
Drivers Enabled
===============
bus:
pci, vdev,
mempool:
ring, stack,
net:
e1000,
之后编译就很快了。
编译 igb uio 驱动
git clone http://dpdk.org/git/dpdk-kmods
cd dpdk-kmods/linux/igb_uio
make
编译出来 igb_uio.ko。
验证环境是否OK
为了验证我们的环境是没问题的,先编译出 l2fwd 程序:
cd examples/l2fwd
make
接着加载 igb_uio 驱动:
cd dpdk-kmods/linux/igb_uio
modprobe uio
insmod igb_uio.ko intr_mode=legacy
注意: 加载驱动时要带着参数intr_mode=legacy
,如果不加参数,将会有问题!
分配一些大页内存【这里是1G】:
echo 512 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
绑定两个网卡【虚拟机有 4 个网卡,最后两个网卡供 DPDK 使用】:
ifconfig ens34 down
ifconfig ens35 down
dpdk-devbind.py -b igb_uio ens34 ens35
运行 l2fwd 程序:
cd examples/l2fwd/build/
./l2fwd -l 0-1 -- -p 0x3 -T 1
如果看到以下信息,说明 DPDK 环境没问题!
EAL: Detected CPU lcores: 8
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Probe PCI driver: net_e1000_em (8086:100f) device: 0000:02:02.0 (socket 0)
EAL: Error reading from file descriptor 20: Input/output error
EAL: Probe PCI driver: net_e1000_em (8086:100f) device: 0000:02:03.0 (socket 0)
EAL: Error reading from file descriptor 6: Input/output error
TELEMETRY: No legacy callbacks, legacy socket not created
MAC updating enabled
Lcore 0: RX port 0 TX port 1
Lcore 1: RX port 1 TX port 0
Initializing port 0... EAL: Error enabling interrupts for fd 20 (Input/output error)
done:
Port 0, MAC address: 00:0C:29:0C:53:91
Initializing port 1... EAL: Error enabling interrupts for fd 6 (Input/output error)
done:
Port 1, MAC address: 00:0C:29:0C:53:9B
Checking link statusdone
Port 0 Link up at 1 Gbps FDX Autoneg
Port 1 Link up at 1 Gbps FDX Autoneg
L2FWD: entering main loop on lcore 1
L2FWD: -- lcoreid=1 portid=1
L2FWD: entering main loop on lcore 0
L2FWD: -- lcoreid=0 portid=0
Port statistics ====================================
Statistics for port 0 ------------------------------
Packets sent: 0
Packets received: 0
Packets dropped: 0
Statistics for port 1 ------------------------------
Packets sent: 0
Packets received: 0
Packets dropped: 0
Aggregate statistics ===============================
Total packets sent: 0
Total packets received: 0
Total packets dropped: 0
====================================================
^C
Signal 2 received, preparing to exit...
EAL: Error disabling interrupts for fd 20 (Input/output error)
Closing port 0... Done
EAL: Error disabling interrupts for fd 6 (Input/output error)
Closing port 1... Done
Bye...
EAL: Error enabling interrupts for fd 20 (Input/output error) 等错误可以忽略。
解绑网卡
两个网卡 ens34 和 ens35 被 DPDK 占用后,ifconfig 里是没有的,要恢复请进行如下操作。
首先查看两个网卡 pci 设备号:
root@ubuntu2204:~# lspci | grep Eth
02:00.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
02:01.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
02:02.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
02:03.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
可看到最后两个网卡设备号是 02:02.0 和 02.03.0。
然后解绑两个网卡的 igb_uio 驱动,绑定 e1000 驱动:
dpdk-devbind.py -u 02:02.0 02:03.0
dpdk-devbind.py -b e1000 02:02.0 02:03.0
最后将网卡up起来:
ifconfig ens34 up
ifconfig ens35 up