保姆级教程:在Ubuntu 22.04上为Mellanox网卡开启SR-IOV VF并配置驱动
实战指南Ubuntu 22.04下Mellanox网卡SR-IOV配置全流程当你面对一台搭载Mellanox ConnectX-6网卡的Ubuntu服务器时是否曾为如何充分发挥其虚拟化性能而困扰SR-IOV技术能让单张物理网卡化身多个独立虚拟设备直接穿透到虚拟机中带来近乎原生的网络性能。本文将手把手带你完成从硬件检查到VF驱动的完整配置过程解决实际部署中的各种坑。1. 环境准备与硬件兼容性验证在Ubuntu 22.04 LTS上配置SR-IOV前首先要确认硬件和内核的兼容性。ConnectX-6系列网卡虽然全面支持SR-IOV但不同固件版本对VF数量的支持可能存在差异。必备工具安装sudo apt update sudo apt install -y pciutils infiniband-diags rdma-core验证网卡型号和固件版本lspci | grep Mellanox # 示例输出04:00.0 Infiniband controller: Mellanox Technologies MT28908 Family [ConnectX-6] mlxconfig -d /dev/mst/mt4123_pciconf0 q关键检查点确认内核版本≥5.4Ubuntu 22.04默认满足固件版本应≥20.28.20062020年后版本更稳定主板BIOS需启用SR-IOV和Above 4G Decoding提示若使用KVM虚拟化需在GRUB中添加intel_iommuon或amd_iommuon参数2. 驱动安装与基础配置Mellanox官方推荐使用MLNX_OFED驱动以获得完整功能支持。以下是针对Ubuntu 22.04的安装步骤wget https://www.mellanox.com/downloads/ofed/MLNX_OFED-5.8-1.0.1.1/MLNX_OFED_LINUX-5.8-1.0.1.1-ubuntu22.04-x86_64.tgz tar -xzvf MLNX_OFED_LINUX-5.8-1.0.1.1-ubuntu22.04-x86_64.tgz cd MLNX_OFED_LINUX-5.8-1.0.1.1-ubuntu22.04-x86_64 sudo ./mlnxofedinstall --without-fw-update --force驱动加载检查sudo modprobe mlx5_core lsmod | grep mlx5 # 应看到mlx5_core、mlx5_ib等模块常见问题处理错误现象解决方案Required kernel headers not found安装linux-headers-$(uname -r)驱动加载时报CRC校验失败禁用Secure Boot无法识别设备检查PCIe插槽是否在x8/x16模式3. SR-IOV功能启用与VF配置找到网卡的PCI地址示例为0000:04:00.0mlxconfig -d /dev/mst/mt4123_pciconf0 set SRIOV_EN1 NUM_OF_VFS16动态调整VF数量需先卸载驱动echo 0 /sys/bus/pci/devices/0000:04:00.0/sriov_numvfs sudo rmmod mlx5_core echo 8 /sys/bus/pci/devices/0000:04:00.0/sriov_numvfs sudo modprobe mlx5_core验证VF创建lspci | grep Virtual # 应看到类似04:00.1 Infiniband controller: Mellanox Technologies MT28908 Family [ConnectX-6 Virtual Function]VF参数优化建议对于高性能场景建议限制VF数量≤16通过mlxconfig设置V_PORT_GUID为动态生成启用LINK_TYPE_P1支持以太网和InfiniBand双模式4. VF驱动绑定与网络配置为VF加载专用驱动sudo modprobe mlx5_vfio_pci for i in {1..8}; do echo 0000:04:00.$i /sys/bus/pci/drivers/mlx5_core/unbind echo 0000:04:00.$i /sys/bus/pci/drivers/mlx5_vfio_pci/bind done创建VF的RDMA设备ibdev2netdev -v # 输出应显示PF和VF对应的设备名VF网络接口配置示例sudo ip link set enp4s0f0v0 up sudo ip addr add 192.168.1.100/24 dev enp4s0f0v0重要VF直通到虚拟机时建议禁用宿主机的NetworkManager服务5. 性能调优与故障排查启用巨帧和流控sudo ethtool -G enp4s0f0 rx 4096 tx 4096 sudo ethtool -K enp4s0f0 lro on sudo ethtool --set-priv-flags enp4s0f0 rx_cqe_compression on性能对比测试使用iperf3模式吞吐量延迟CPU占用传统虚拟化10 Gbps50 μs25%SR-IOV VF56 Gbps3 μs5%典型问题排查流程检查dmesg是否有PCIe错误确认VF数量未超过硬件限制验证IOMMU分组是否正确测试PF本身是否工作正常6. 自动化部署脚本示例以下脚本实现一键式SR-IOV配置#!/bin/bash PCI_ADDR0000:04:00.0 VF_COUNT8 # 卸载驱动 echo 0 /sys/bus/pci/devices/$PCI_ADDR/sriov_numvfs sudo rmmod mlx5_core # 启用VF echo $VF_COUNT /sys/bus/pci/devices/$PCI_ADDR/sriov_numvfs sudo modprobe mlx5_core sudo modprobe mlx5_vfio_pci # 绑定VF驱动 for ((i1; i$VF_COUNT; i)); do echo ${PCI_ADDR}.$i /sys/bus/pci/drivers/mlx5_core/unbind echo ${PCI_ADDR}.$i /sys/bus/pci/drivers/mlx5_vfio_pci/bind done # 配置网络 sudo ip link set enp4s0f0 up for ((i0; i$VF_COUNT; i)); do sudo ip link set enp4s0f0v$i up done将此脚本保存为enable_sriov.sh并添加执行权限后即可快速部署SR-IOV环境。