Ubuntu 虚拟机 | DPDK 协议栈开发 | 2、DPDK驱动绑定VMWare模拟网卡 + Testpmd发包测试
原创不易!转载请注明出处!!
上一节
Ubuntu 虚拟机 | DPDK 协议栈开发 | 1、环境搭建 + 虚拟端口测试
前言
在之前的文章中,已经展示了如何在Ubuntu虚拟机中搭建基础的DPDK环境、运行Helloworld,以及借助Testpmd+net_null完成最简单的虚拟端口回环发包测试。
本节中,将会基于上一节配置的环境,完成DPDK驱动的安装,并将VMWare模拟网卡绑定到DPDK。最终,仍然通过Testpmd进行发包测试,但这次是基于驱动+模拟网卡,而非通过net_null模拟的虚拟端口。
一、初识VMWare虚拟网卡
DPDK官网中列举了所有支持DPDK的网卡,以下是Intel支持DPDK的网卡列表:
下面再看VMWare中安装的Ubuntu24.04的网卡型号。VMware 会为 Linux 虚拟机模拟一张独立的虚拟网卡(而非直接使用物理网卡),虚拟机的操作系统(Ubuntu)仅能识别到这张 “模拟网卡”,无法感知物理网卡的存在。
VMware 默认提供几种通用的虚拟网卡型号(确保兼容性),常见包括:
- Intel E1000:模拟 Intel 千兆以太网网卡(兼容性强,支持多数 Linux 系统);
- VMXNET3:VMware 自研的高性能虚拟网卡(需安装 VMware Tools 才能识别,性能优于 E1000)。
输入lspci | grep -i "Ethernet"
,可以查看到以下内容:
这里显示的其实就是Intel E1000网卡,可以看到DPDK支持的网卡列表中,e1000后面的括号里就有82545这个型号。也就是说,VMWare提供的模拟网卡是支持DPDK操作的。
二、安装DPDK驱动
直接点击支持列表的e1000超链接,定位到以下文档:
17. Driver for VM Emulated Devices
这里描述了可以为虚拟机模拟设备添加驱动,但使用的并非Ubuntu,因此我们忽略。但可以看到这一段信息:
也就是说,模拟设备和真实网卡之间还是有一定区别的。
2.1 安装VFIO驱动
输入以下指令:
./usertools/dpdk-devbind.py --status
可以查看到网卡绑定状态:
可以看到,模拟网卡目前还被归属在使用内核的设备,目前它使用的是内核态协议栈,drv=e1000
表示使用e1000驱动,unused=
表示其它可用的驱动,目前后面没有内容,这是因为我们还没安装DPDK驱动。
下面来安装DPDK驱动,首先配置在无IOMMU模式下安装:
sudo modprobe vfio enable_unsafe_noiommu_mode=1
然后安装VFIO:
sudo modprobe vfio-pci
这时候再次查看网卡绑定状态:
可以看到unused=vfio_pci
,表示目前有了一个可用的驱动,也就是vfio_pci。
2.2 模拟网卡绑定到VFIO驱动
在将模拟网卡绑定到VFIO之前,我们先执行ifconfig
,可以看到:
这时候,还可以查看到ens33。
下面开始将ens33绑定到VFIO,执行指令:
./usertools/dpdk-devbind.py --bind=vfio-pci ens33 # 取决于你的if=的值
# 或
./usertools/dpdk-devbind.py --bind=vfio-pci 02:01.0 # 取决于你的PCI设备地址
此时,你可能会弹出以下报错:
这是因为要从内核解绑的网卡此时正处于使用状态,前面查看状态时也可以看到,该网卡在Active状态。
解决方法是关闭该网卡的链接:
sudo ip link set ens33 down
此时再执行绑定操作,就能够成功执行。
成功绑定后,我们再来查看网卡状态:
可以看到该网卡变成了Network devices using DPDK-compatible driver
,使用的驱动也变成了vfio-pci
,说明我们成功将它从Linux内核解绑,绑定到了DPDK驱动中。
这时候再次执行ifconfig
,发现ens33不见了,这是因为它被被DPDK接管了。
将ens33切换回内核驱动的方式也很简单,执行以下指令即可:
./usertools/dpdk-devbind.py --bind=e1000 02:01.0
三、Testpmd发包
在前面的文章中,已经使用testpmd进行了最简单的虚拟端口发包。在绑定了模拟网卡后,可本小节我们通过VFIO+模拟网卡实现发包,并在主机端使用Wireshark抓包。
简单画了一下我们要做的事,如下图所示。我们已经完成了E1000模拟网卡绑定到VFIO,现在我们要通过VMnet1接口,利用testpmd向主机发包。
这里省去了大页配置等操作,详情参考前一节。
3.1 VMWare修改网络设置
修改虚拟机的网络适配器设置,如下图所示。
修改后,虚拟机可以通过VMnet1端口与主机通信。
3.2 Wireshark安装
Wireshark直接通过官网安装即可。
安装成功后,打开软件,选择VMnet1并双击。
这时就可以抓到一些VMnet1端口下的报文了。
可以看到,这里的报文源IP其实是我目前打开的另一台虚拟机。
而目的IP则是主机端的VMnet1的IP地址,可以在主机windows命令行输入ipconfig
查看。
3.3 Testpmd发包
执行指令打开testpmd。
sudo ./build/app/dpdk-testpmd -l 0-3 -- -i --portmask=0x1 --nb-cores=2 --forward-mode=txonly
端口掩码0x1表示只开启一个端口,也就是模拟网卡的端口。
输入start
发包,从Wireshark可以看到,立刻抓到了大量的包。
从左下角解析的信息可以看到,这些包的源和目的IP是198.18.0.1和198.18.0.2,这其实是RFC规定的专用于网络测试的IP字段(详见RFC6890)。
传输协议使用UDP协议,Discard Protocol源自RFC863,它主要用于测试,工作在UDP端口9,在收到数据包后全部删除,所以Wireshark中显示所有包全部被DISCARD。
也就是说,这些包其实是testpmd构造的测试报文。主机能够检测到这些报文,说明testpmd的数据被成功通过VFIO+模拟网卡发送出虚拟机,证明配置成功。
四、问题和解决
4.1 Helloworld
在安装VFIO驱动并绑定网卡后,再次运行Helloworld程序,发现如下报错:
该提示是因为DPDK需要禁用终端,改为PMD轮循模式,但在禁用中断时出错。但目前还没有找到解决方法,在找到后会持续更新。
THE END…