文章目录
- 前言
- 虚拟机的网络拓扑结构
- 网络拓扑结构
- 网络配置
- DPDK的准备工作
- DPDK的编译
- 网卡绑定
- 测试
前言
我之前尝试通过namespace,搭建dpdk的测试环境,但是对于tcp有点问题,而且过程也比较麻烦,见: dpdk网络转发环境的搭建-CSDN博客
下面,我通过多个虚拟机的方式,搭建dpdk的测试环境,感觉还行。
测试环境对于学习过程中的快速验证很重要。
虚拟机的网络拓扑结构
网络拓扑结构
每个虚拟机都有个桥接网卡,供外部ssh连接。
dpdk实验的时候,需要将两张网卡直接连接起来。这里使用 virtualbox - Internal Networking 来实现。
Internal networks are created automatically as needed. There is no central configuration. Every internal network is identified simply by its name. Once there is more than one active virtual network card with the same internal network ID, the Oracle VM VirtualBox support driver will automatically wire the cards and act as a network switch. The Oracle VM VirtualBox support driver implements a complete Ethernet switch and supports both broadcast/multicast frames and promiscuous mode.
上面英文的大概意思是:internal netwok 是通过名称来区别。具有相同名称的网卡可以通信。这个通信是虚拟机之间的,不经过主机。VirtualBox 驱动程序将自动连接这些卡并充当网络交换机,支持广播/多播帧和混杂模式。
所以,上面的拓扑结构相当于,名称为intnet0的两张网卡插在一个交换机上。名称为intnet1的两张网卡插在另一个交换机上。而一个交换机上只接了两个网卡,相当于这两张网卡通过网桥连接,或者相当于通过网线直接连接。
virtualbox中配置内部网络的方式,如下图。
注意: 运行dpdk程序的这个虚拟机的内部网络网卡,必须开启混杂模式。否则,可以抓包看下,server那个虚拟机响应client的ARP协议的数据包,不会被dpdk接收到,导致连接失败。
网络配置
# client的网络配置
## 设置intnet0网卡的ip
ip address add 10.0.1.2/24 dev enp0s8
## 设置 10.0.2.0/24的数据包,都从intnet0的网卡出去
ip route add 10.0.2.0/24 dev enp0s8
# server的网络设置
ip address add 10.0.2.2/24 dev enp0s8
ip route add 10.0.1.0/24 dev enp0s8
DPDK的准备工作
DPDK的编译
关于编译参数,自行参考官方手册和源码。
git clone git@github.com:DPDK/dpdk.git
git checkout v23.11
meson setup -Dcpu_instruction_set=corei7 -Dbuildtype=debug -Dexamples=all -Dprefix=YOUR_DPDK_INSTALL_PATH build
cd build
ninja
ninja install
网卡绑定
# 如果包管理里面有,直接安装。如果没有,则源码编译安装。
## ubuntu
sudo apt install dpdk-igb-uio-dkms
# 编译igb_uio驱动; 在wsl中会编译失败,需要在linux环境中编译
git clone git://dpdk.org/dpdk-kmods
cd dpdk-kmods/linux
make
# 驱动安装
modprobe igb_uio
# 停止网卡
ip link set enp0s8 down
ip link set enp0s9 down
# 绑定网卡
./dpdk-devbind.py --bind=igb_uio enp0s8
./dpdk-devbind.py --bind=igb_uio enp0s9
测试
如果没有dpdk进行数据转发,10.0.1.2的网卡是无法将数据包发送给10.0.2.2的网卡。因为两者不在一个内部网络中。
下面,我们先启动转发程序。
./dpdk-skeleton
EAL: Detected CPU lcores: 8
EAL: Detected NUMA nodes: 1
EAL: Detected static linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: Probe PCI driver: net_e1000_em (8086:100e) device: 0000:00:08.0 (socket -1)
EAL: Probe PCI driver: net_e1000_em (8086:100e) device: 0000:00:09.0 (socket -1)
TELEMETRY: No legacy callbacks, legacy socket not created
Port 0 MAC: 08 00 27 7c bf 6e
Port 1 MAC: 08 00 27 af 8d 7d
WARNING: Too many lcores enabled. Only 1 used.
Core 0 forwarding packets. [Ctrl+C to quit]
然后使用10.0.1.2网卡,给10.0.2.2发送ICMP数据包,连接正常。
ping 10.0.2.2
PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data.
64 bytes from 10.0.2.2: icmp_seq=1 ttl=64 time=1.01 ms
64 bytes from 10.0.2.2: icmp_seq=2 ttl=64 time=1.26 ms
^C
我们再尝试下tcp协议。
# 在server上启动监听程序
nc -l -k -s 10.0.2.2 -p 80
# client与server建立连接
nc -s 10.0.1.2 10.0.2.2 80
# 两者通信正常