在PVE环境下打开SRIOV
Single root input/output virtualization(SR-IOV), 是一种先进的虚拟化技术,以网卡为例,它可以在一个物理功能PF(一个网口)上开出多个虚拟功能(虚拟网卡)。
为了令虚拟机与外界的连接高效可靠,往往会采用直通网卡(PCIE Passthrough)的方法,但若是物理机中存在较多的虚拟机,这一方法便不再可行。此外,采取直通网卡的诸多虚拟机之间,并没有网络连接。
SR-IOV针对性的解决了以上两个问题,开启SR-IOV之后,物理网口PF与虚拟网口VFs(可以存在多个)间会建立一个虚拟交换机,这个虚拟交换机具有很好的性能,往往还支持RDMA等高级功能。倘若将VF直通进入虚拟机,这一虚拟机就会与外界、与其他挂在同一PF下的虚拟机,建立高效的连接。这些连接是绕过宿主机内核的,这将带来极好的网络性能。
Proxmox VE(PVE)是常用的虚拟化平台,本文将讨论,如何在PVE中打开SR-IOV。
1. 配置BIOS
在BIOS中打开下面这些选项
Vd-t, IO-MMU, SR-IOV
2. 开启iommu
修改grub文件
# vi /etc/default/grub
在GRUB_CMDLINE_LINUX_DEFAULT项末尾加上下面的内容
# intel_iommu=on iommu=pt
3. 编写service,在开机过程中打开SR-IOV VFs
# cd /etc/init.d
# vi net-sriov
下面是示例内容,可根据具体情况修改
#! /bin/sh
### BEGIN INIT INFO
# Provides: sriov_script
# Required-Start: $network $named $remote_fs $syslog $sriov_scripts
# Required-Stop: $remote_fs $sriov_scripts
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: SR-IOV initialization.
#Description: Initializing VM's network with sriov support.
### END INIT INFO
start () {
#enable Sriov
echo 4 > /sys/class/net/enp4s0f0np0/device/sriov_numvfs
echo 4 > /sys/class/net/enp4s0f1np1/device/sriov_numvfs
ip link set dev enp4s0f0np0 up
ip link set dev enp4s0f1np1 up
ip link set dev enp4s0f0np0 vf 0 mac 24:8a:07:b7:a8:71
ip link set dev enp4s0f0np0 vf 1 mac 24:8a:07:b7:a8:72
ip link set dev enp4s0f0np0 vf 2 mac 24:8a:07:b7:a8:73
ip link set dev enp4s0f0np0 vf 3 mac 24:8a:07:b7:a8:74
ip link set dev enp4s0f1np1 vf 0 mac 24:8a:07:b7:a8:81
ip link set dev enp4s0f1np1 vf 1 mac 24:8a:07:b7:a8:82
ip link set dev enp4s0f1np1 vf 2 mac 24:8a:07:b7:a8:83
ip link set dev enp4s0f1np1 vf 3 mac 24:8a:07:b7:a8:84
}
stop () {
[ "$READ_INTERFACES" != "no" ] && network_interfaces ifdown
}
case $1 in
start)
start
;;
stop | force-stop)
stop
;;
*)
echo "Usage: $0 {start|stop}" >&2
exit 1
;;
esac
exit 0
之后启用服务,重启PVE,就能看到Sriov开出来的VF了
# chmod +x /etc/init.d/net-sriov
# systemctl enable net-sriov
# update-initramfs -u -k all
# update-grub
# reboot
4. 创建VM
在VM的Hardware栏中进行有关配置
Add->Pci Device,可以看到Sriov功能开出的VF
在Hardware中,进行一些配置,值得注意的是,需要将内存设置为 "balloon=0"
另外,可以在Options栏中,设置Startup delay,保证SR-IOV服务开启后,再启动虚拟机。
2. 效果
经过这些设置,SR-IOV就成功开启啦,在虚拟机中可以看到VF被成功识别,并且MAC地址与我们在前面的配置相符。
需要说明的是,经过测试,SR-IOV所开出的VF,不能被加入Linux Bridge或者OVS-Bridge,只能作为基本的网络端口使用。
Ubuntu、CentOS这些系统用于虚拟机,都能直接使用VF,但常用的软路由系统,”OpenWRT”,则需要重新编译网卡驱动才能启用。这部分的内容可以参照我的Github网页,在release部分有已经编译好的固件可供使用。
https://github.com/allegro0132/Openwrt-mlnx-ofed