在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部分有已经编译好的固件可供使用。

github.com/allegro0132/
编辑于 2023-02-04 16:01・IP 属地甘肃