Ubuntu22.04 虚拟机中搭建 DPDK 开发环境

本文详细介绍了在Ubuntu22.04环境下安装和配置DPDK的过程,包括编译安装、驱动裁剪、igbuio驱动编译及环境验证等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统环境

操作系统: 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
为了在Windows平台上使用DPDK并实现数据包的收发操作,我强烈建议参考这份宝贵的资源:《Windows平台下DPDK入门示例:HelloDPDK》。这份资料将为您提供从环境配置到数据包收发的具体步骤,以及一系列示例程序和教程。 参考资源链接:[Windows平台下DPDK入门示例:HelloDPDK](https://wenku.csdn.net/doc/5ie01bjudn?spm=1055.2569.3001.10343) 首先,您需要准备一台运行Windows操作系统的机器,并确保硬件满足DPDK的最低要求,特别是需要一块支持的网络接口卡(NIC)。 接着,下载DPDK的Windows版本源代码和《Windows平台下DPDK入门示例:HelloDPDK》资源。在源代码中,通常会包含一个makefile文件或者脚本,用于配置和编译DPDK环境。在Windows环境下,您可能需要使用Cygwin或者Windows Subsystem for Linux(WSL)来模拟类Unix环境,从而编译DPDK所需的库和示例程序。 安装好环境后,根据《Windows平台下DPDK入门示例:HelloDPDK》的指导,您需要初始化DPDK环境。初始化通常包括内存池的设置、核心亲和性配置、大页内存的分配和网络接口卡的初始化。DPDK提供了一系列API和工具来完成这些任务,例如使用dpdk-devbind.py工具来绑定网络接口卡到用户空间驱动,并使用lspci工具来确认网络接口卡的状态。 在DPDK环境初始化完成后,您可以开始编写示例程序,例如HelloDPDK,它通常演示了如何发送和接收数据包。编写程序时,您会使用DPDK提供的库函数,如rte_eth_dev_distance()来查询网络接口卡之间的距离,rte_eth_dev_rx_queue_setup()来设置接收队列,以及rte_eth_dev_tx_queue_start()来启动发送队列。 编译示例程序时,需要确保链接了DPDK提供的库文件。在Windows平台上,由于不支持Linux的原生接口,因此需要使用DPDK提供的Windows特定的库文件。 程序运行后,您可以通过配置的接口进行数据包的发送和接收测试,以验证DPDK环境和示例程序的正确性。如果您希望在实际网络环境中部署DPDK,那么还需要深入学习如何在不同的网络拓扑和配置下优化DPDK性能。 《Windows平台下DPDK入门示例:HelloDPDK》将会提供关于如何在Windows平台上搭建DPDK环境的详细信息,并包含完整配置示例程序的步骤。通过学习和实践,您将能够熟练掌握DPDK在Windows上的开发和应用,进而实现高性能网络应用的开发。 参考资源链接:[Windows平台下DPDK入门示例:HelloDPDK](https://wenku.csdn.net/doc/5ie01bjudn?spm=1055.2569.3001.10343)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值