在 ARM64 平台的 RHEL 9.4 上配置 Mellanox ConnectX-6 网卡的 SR-IOV VF 直通 (Passthrough)

概述

在虚拟化环境中,Mellanox ConnectX-6 网卡的单根输入输出虚拟化(SR-IOV)功能允许将网卡的虚拟功能(Virtual Functions, VFs)分配给虚拟机,从而实现高效的网络性能和资源隔离。详细介绍了如何在 ARM64 平台的 RHEL 9.4 上配置 Mellanox ConnectX-6 网卡的 SR-IOV 虚拟功能 (VF) 直通。

范围

适用于系统管理员和虚拟化技术人员,帮助他们在 RHEL 9.4 ARM64 系统上配置 Mellanox ConnectX-6 网卡的 SR-IOV 虚拟功能 (VF) 直通,以优化虚拟化环境中的网络性能。

职责

  • 系统管理员:确保系统已正确安装必要的软件包,且系统硬件支持 IOMMU 和 SR-IOV 功能。
  • 操作员:按照##配置 Mellanox ConnectX-6 网卡的 SR-IOV VF 直通,并确保其正确运行。

要求

  • 运行 RHEL 9.4 操作系统的 ARM64 服务器。
  • 基本的命令行操作知识。
  • 具备 sudo 或 root 权限。
  • Mellanox ConnectX-6 网卡,并确保服务器固件支持 IOMMU 和 SR-IOV 功能。

过程

1. 系统环境准备

1.1 更新系统软件包列表

  • 在进行软件安装前,先确保系统软件包是最新的:
    1
    sudo dnf update -y

1.2 安装必要的驱动和工具

  • 安装 Mellanox 网卡的驱动程序和相关工具(如果已经安装mlx驱动直接跳过):

    1
    sudo dnf install -y mlnx-ofed-basic
  • 安装完毕后,重启服务器以加载新安装的驱动:

    1
    sudo reboot

1.3 检查 IOMMU 支持

  • 确保系统的固件(Firmware/BIOS)设置中已启用 IOMMU 支持。

  • 确认 IOMMU 已在内核启动参数中启用:

    1
    2
    sudo grubby --update-kernel=ALL --args="iommu.passthrough=on"
    sudo reboot
  • 重启后,使用以下命令确认 IOMMU 已启用:

    1
    dmesg | grep -i iommu

2. 配置 Mellanox ConnectX-6 的 SR-IOV

2.1 启用 SR-IOV 功能

  • 使用 lspci 命令找到 Mellanox ConnectX-6 网卡的 PCI 总线地址:

    1
    lspci | grep Mellanox
  • 记下类似 0000:03:00.0 的总线地址,这个地址表示网卡的物理功能(PF)。

  • /sys/class/net/ 下找到对应的网卡接口(如 enp3s0),并配置启用 SR-IOV:

    1
    echo 8 | sudo tee /sys/class/net/enp3s0/device/sriov_numvfs
  • 以上命令将在该网卡上启用 8 个虚拟功能(VFs)。可以根据需要调整数字。

  • 可以通过下面的命令查询支持的最大值

    1
    2
    cat /sys/class/net/enp3s0/device/sriov_totalvfs
    16

    2.2 验证 SR-IOV 配置

  • 使用 ip link showlspci | grep Mellanox 命令,确认是否已创建 VFs:

    1
    ip link show enp3s0
  • 输出中应包含 enp3s0 及其下的 vf 0vf 7 等信息。

3. 配置 SR-IOV VFs 的 Passthrough

3.1 识别并绑定 VF

  • 使用 lspci 命令获取 SR-IOV VF 的 PCI 地址:

    1
    lspci | grep Virtual
  • 将对应的 VF 通过 VFIO 驱动绑定:

    1
    2
    3
    4
    5
    sudo modprobe vfio
    sudo modprobe vfio-pci
    lspci -nn | grep Virtual #查询[]中结果,例如[15b3:101e]
    echo "0000:03:02.0" > /sys/bus/pci/devices/0000\:03\:02.0/driver/unbind
    echo "15b3 101e" > /sys/bus/pci/drivers/vfio-pci/new_id

    或者

    1
    2
    3
    4
    sudo modprobe vfio
    sudo modprobe vfio-pci
    echo "0000:03:02.0" | sudo tee /sys/bus/pci/drivers/mlx5_core/unbind
    echo "0000:03:02.0" | sudo tee /sys/bus/pci/drivers/vfio-pci/bind
  • 确认绑定成功:

    1
    lspci -nnk -d 15b3: | grep "Kernel driver in use"
  • 输出应显示 vfio-pci 作为内核驱动。

3.2 编辑虚拟机配置

  • 使用 virsh nodedev-list 查找支持的设备
    1
    pci_0000_03_02_0
  • 使用 virsh nodedev-dumpxml pci_0000_03_02_0 获取配置xml, 记录address
    1
    2
    3
    <iommuGroup number='62'>
    <address domain='0x0000' bus='0x03' slot='0x02' function='0x0'/>
    </iommuGroup>
  • 使用 virsh editvirt-manager 将 VF 设备分配给虚拟机。示例 XML 配置:
    1
    2
    3
    4
    5
    6
    <hostdev mode='subsystem' type='pci' managed='yes'>
    <source>
    <address domain='0x0000' bus='0x03' slot='0x02' function='0x0'/>
    </source>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </hostdev>

3.3 启用并启动虚拟机

  • 编辑并保存虚拟机配置后,启动虚拟机:
    1
    2
    virsh define /etc/libvirt/qemu/<vm_name>.xml
    virsh start <vm_name>
  • 在虚拟机中,使用 ip link show 或类似命令验证已分配的 VF 网卡。

4. 维护与管理

4.1 释放 VF 资源

  • 如果需要将 VF 资源从虚拟机中释放并返回主机,可以先关闭虚拟机并解除 VFIO 绑定:
    1
    2
    3
    virsh shutdown <vm_name>
    echo "0000:03:02.0" | sudo tee /sys/bus/pci/drivers/vfio-pci/unbind
    echo "0000:03:02.0" | sudo tee /sys/bus/pci/drivers/mlx5_core/bind

4.2 调整 VF 数量

  • 如果需要更改启用的 VF 数量,可以编辑对应的 SR-IOV 配置:
    1
    echo <new_number> | sudo tee /sys/class/net/enp3s0/device/sriov_numvfs

4.3 定期更新驱动

  • 确保定期更新 Mellanox 驱动程序和固件,以获取最新的功能和性能改进:
    1
    sudo dnf upgrade -y mlnx-ofed-basic

5. 常见问题与故障排除

5.1 VF 无法绑定到虚拟机

  • 检查是否已正确启用 IOMMU 和 SR-IOV 功能,确保 VFs 已成功创建并分配给虚拟机。

5.2 虚拟机中无法识别 VF 网卡

  • 检查虚拟机内的网络配置,确认 VF 是否已正确加载,并安装必要的驱动程序。

5.3 性能问题

  • 确保虚拟机配置中启用了 KVM 和 VFIO 驱动程序,确保最佳性能。

参考文献