日常搬砖打杂所用,记录于此,以便日后查阅。
预备知识:DPDK配置及使用,SR-IOV相关概念(PF,VF),网卡passthrough给VM
SR-IOV数据包分发机制
<h4 id="1">配置过程(Ubuntu 14.04):</h4>
# Step 1 修改/etc/default/grub
# 表示对于每个物理interface,打开4个virtual functions
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on ixgbe.max_vfs=4"
# Step 2 更新grub配置并重启物理机
>> update-grub && reboot
重启之后可以查看到所有的PF和VF,表示配置成功>> lspci | grep -i ether,结果如下:
VF能够收发包的前提是相应的PF必须处于UP的状态,通过ifconfig来UP所有的PF
默认所有VF的mac地址都是全0,所以需要为VF配置mac地址,通过ip link set来进行设置
>> ip link set <ethX> vf <vf-id> mac <addr>
其余配置可选,同样使用ip link set来进行设置,可以通过ip link help来查看其余可配置项。
注:spoof checking开启后,会进行mac地址检查,如果发现VF要发送的数据包mac地址不是本身的mac地址,则会被丢弃。
到这一步,已经可以在物理机上使用VF了,用ifconfig把VF对应的interface UP起来即可收发数据包。接下来是配置DPDK + SR-IOV。
在Host上将VF从内核态驱动ixgbevf解绑,重新绑定到vfio-pci驱动,这里可以利用DPDK提供的脚本dpdk_bind_nic.py来设置
# 加载vfio-pci驱动内核模块
>> modprobe vfio-pci
# 重新绑定VF驱动
>> ./dpdk_bind_nic.py --bind=<vf pci bus addr> vfio-pci
到这里,就能够在Host上通过DPDK在VF上收发数据包了。再接下来是,如何在VM中使用DPDK在VF上收发数据包。
本文中使用的虚拟化软件是qemu-kvm,首先在启动VM时,需要设置qemu-kvm的启动参数,将VF passthrough到VM。
>> qemu-system-x86_64 -enable-kvm -drive file=<vm img>,if=virtio -cpu host -smp 16 -m 16G \
-name <vm name> -device vfio-pci,host=<vf pci bus addr> -device vfio-pci,host=<vf pci bus addr> -vnc :1 -net none
重点在于通过-device vfio-pci,host=<vf pci bus addr>将VF passthrough到虚拟机,这样VM就可以直接使用VF了。
VM启动后,ifconfig -a可以看到passthrough的VFs,将对应VF的interface绑定到DPDK提供的igb_uio驱动就可以在虚拟机中通过DPDK使用VF收发包了。
<h4 id="2">SR-IOV数据包分发机制</h4>
知道如何配置SR-IOV后,还需要了解数据包是如何从外部进入VF,以及从VF发出的数据包是如何流向的,才能够正确使用SR-IOV进行收发包。