PVE 万兆网卡 SR-IOV 配置与虚拟机直通实战

PVE 万兆网卡 SR-IOV 配置与虚拟机直通实战

PVE 万兆网卡SR-IOV配置与虚拟机直通实战 本文要点:深入讲解Mellanox ConnectX-3和Intel X520万兆网卡的SR-IOV配置,实现VF直通给虚拟机,获得接近物理机的网络性能。 引言 SR-IOV(Single Root I/O Virtualization)是一种硬件虚

PVE 万兆网卡SR-IOV配置与虚拟机直通实战

本文要点:深入讲解Mellanox ConnectX-3和Intel X520万兆网卡的SR-IOV配置,实现VF直通给虚拟机,获得接近物理机的网络性能。

引言

SR-IOV(Single Root I/O Virtualization)是一种硬件虚拟化技术,允许物理网卡虚拟出多个VF(Virtual Function),直接分配给虚拟机使用。相比软件虚拟化,SR-IOV可以显著降低延迟、提高吞吐量,减少CPU占用。

本文将介绍两种主流万兆网卡的SR-IOV配置:Mellanox ConnectX-3(544+FLR)和Intel X520。

一、SR-IOV技术原理

1.1 基本概念

┌──────────────────────────────────────────┐
│           物理网卡 (PF)                   │
│  ┌────────────────────────────────────┐  │
│  │         SR-IOV Capable              │  │
│  │  ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐  │  │
│  │  │ VF0 │ │ VF1 │ │ VF2 │ │ VF3 │  │  │
│  │  └──┬──┘ └──┬──┘ └──┬──┘ └──┬──┘  │  │
│  │     │       │       │       │     │  │
│  └─────┼───────┼───────┼───────┼─────┘  │
│        │       │       │       │        │
└────────┼───────┼───────┼───────┼────────┘
         │       │       │       │
    ┌────┘       │       │       └────┐
    ▼            ▼       ▼            ▼
┌──────┐    ┌──────┐ ┌──────┐    ┌──────┐
│ VM 1 │    │ VM 2 │ │ VM 3 │    │ VM 4 │
└──────┘    └──────┘ └──────┘    └──────┘
  • PF(Physical Function):物理功能,完整的PCIe设备功能
  • VF(Virtual Function):虚拟功能,轻量化的PCIe设备功能,可直接分配给虚拟机

1.2 优势对比

特性 软件虚拟化 SR-IOV直通
延迟 较高 接近物理机
吞吐量 受限于虚拟化层 接近物理机
CPU占用 较高 极低
配置复杂度 简单 较复杂
热迁移 支持 需特殊支持

二、Mellanox ConnectX-3 配置

2.1 硬件准备

  • Mellanox ConnectX-3(MCX354A)或兼容网卡
  • QSFP+光模块或DAC线缆
  • 支持SR-IOV的主板和CPU

2.2 安装驱动和工具

# 更新系统
apt update && apt install -y mstflint

# 查看网卡信息
lspci | grep Mellanox

# 查看网卡固件版本
mstflint -d 03:00.0 q  # 替换为你的网卡地址

2.3 配置SR-IOV

步骤1:加载驱动并配置VF数量

# 配置驱动参数
echo 'options mlx4_core port_type_array=2,2 num_vfs=8 probe_vf=8' > /etc/modprobe.d/mlx4_core.conf

# 参数说明:
# port_type_array=2,2 - 两个端口都配置为以太网模式
# num_vfs=8 - 每个PF创建8个VF
# probe_vf=8 - 启用8个VF

# 更新initramfs
update-initramfs -u

# 重启系统
reboot

步骤2:配置VF MAC地址

创建启动脚本/root/set-sriov.sh

#!/bin/bash

# 设置VF数量
echo 8 > /sys/class/net/ens4/device/sriov_numvfs

# 配置Port 1的VF MAC地址
for i in {0..7}; do
    mac=$(printf "ae:21:1a:41:c0:%02x" $i)
    echo "Setting VF $i MAC: $mac"
    ip link set dev ens4 vf $i mac $mac spoofchk on
done

# 配置Port 2的VF MAC地址(如需要)
# ip link set dev ens4d1 vf 14 mac ae:21:1a:41:c1:14 spoofchk on

# 启用网卡和VF
ip link set ens4 up
ip link set ens4d1 up

# 重启网络服务
systemctl restart networking

赋予执行权限并设置开机启动:

chmod +x /root/set-sriov.sh

# 创建systemd服务
cat > /etc/systemd/system/net-sriov.service <<EOF
[Unit]
Description=Net SR-IOV Service
After=network.target

[Service]
Type=simple
User=root
ExecStart=/root/set-sriov.sh

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable net-sriov.service
systemctl start net-sriov.service

2.4 PVE中直通VF

查看VF设备

# 列出所有VF
lspci | grep Mellanox

# 示例输出:
# 03:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]
# 03:00.1 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]
# 03:00.2 Ethernet controller: Mellanox Technologies MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
# ... VF设备

Web界面配置

  1. 选择虚拟机 → 硬件 → 添加 → PCI设备
  2. 选择"Mapped Device"或"Raw Device"
  3. 选择对应的VF(如03:00.2
  4. 勾选"All Functions"和"ROM-Bar"
  5. 保存配置

命令行配置

# 编辑虚拟机配置文件
vim /etc/pve/qemu-server/100.conf

# 添加VF设备(示例)
hostpci0: 03:00.2,pcie=1

# 虚拟机启动后,内部将看到独立的万兆网卡

2.5 已知问题

问题1:直通后Windows虚拟机蓝屏

Mellanox VF直通到Windows需要特殊驱动支持,可能需要:

  • 下载Mellanox官方驱动
  • 或使用Linux虚拟机

问题2:两个端口必须一起直通

ConnectX-3的两个端口在IOMMU中属于同一组,直通时会一起直通。

三、Intel X520 配置

3.1 硬件准备

  • Intel X520-DA2或兼容网卡
  • SFP+光模块或DAC线缆

3.2 配置SR-IOV

步骤1:启用IOMMU(如未启用)

# 编辑GRUB配置
vim /etc/default/grub

# 修改GRUB_CMDLINE_LINUX_DEFAULT,添加:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"

# 更新GRUB
update-grub

# 重启
reboot

步骤2:配置VF数量和MAC地址

创建脚本/root/net-sriov.sh

#!/bin/sh

# 配置参数
sriov_num=63  # VF数量,X520最大支持63个
device='ens4f0'  # 物理网卡名称
mac_prefix='ae:31:11:d1:ee'  # MAC地址前缀

start() {
    # 启用SR-IOV
    echo $sriov_num > /sys/class/net/${device}/device/sriov_numvfs
    echo "[P] Set SR-IOV num: $sriov_num"
    
    # 启用网卡
    ip link set dev ${device} up
    echo "[I] Set device up: ${device}"
    
    # 配置每个VF的MAC地址
    for ((i=0; i<$sriov_num; i++)); do
        mac_last=$(printf "%02x" $((i+1)))
        mac="${mac_prefix}:${mac_last}"
        echo "[I] Set VF $i MAC: $mac"
        ip link set dev ${device} vf $i mac $mac
done

    # 重启网络服务
    echo '[I] Restart networking'
    systemctl restart networking
}

stop() {
    echo "[I] Stopping SR-IOV..."
    ovs_ctl stop
}

case $1 in
    start)
        start
        ;;
    stop)
        stop
        ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit 1
        ;;
esac

exit 0

步骤3:设置开机启动

chmod +x /root/net-sriov.sh

# 创建systemd服务
cat > /etc/systemd/system/net-sriov.service <<EOF
[Unit]
Description=Net SR-IOV Service
After=network.target

[Service]
Type=simple
User=root
ExecStart=/root/net-sriov.sh start

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable net-sriov.service
systemctl start net-sriov.service

3.3 PVE中直通X520 VF

与Mellanox类似,在虚拟机配置中添加PCI设备:

# 查看VF设备
lspci | grep "Virtual Function"

# 编辑虚拟机配置
vim /etc/pve/qemu-server/101.conf

# 添加设备
hostpci0: 04:10.0,pcie=1

Windows虚拟机注意事项:

四、VF直通验证与测试

4.1 Linux虚拟机内验证

# 查看网卡信息
lspci | grep Ethernet

# 查看网卡详情
ethtool eth0

# 测试网络连通性
ping 10.10.10.1

4.2 性能测试

# 安装iperf3
apt install -y iperf3

# 服务端
iperf3 -s

# 客户端测试
iperf3 -c 10.10.10.31 -t 60

五、网络架构优化建议

5.1 内网统一网关架构

                    ┌─────────────┐
                    │   主路由     │
                    │ 192.168.0.1 │
                    └──────┬──────┘
                           │
           ┌───────────────┼───────────────┐
           │               │               │
    ┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
    │  OpenWrt    │ │  PVE主机    │ │  NAS        │
    │  10.10.10.250│ │  10.10.10.10│ │  10.10.10.30│
    │  (旁路由)   │ │             │ │             │
    └──────┬──────┘ └──────┬──────┘ └─────────────┘
           │               │
           │   ┌───────────┴───────────┐
           │   │                       │
    ┌──────▼───▼──────┐         ┌──────▼──────┐
    │   万兆交换机     │         │  万兆交换机  │
    │  (内网核心)     │         │  (扩展)      │
    └────────┬────────┘         └──────┬──────┘
             │                         │
      ┌──────┴──────┐           ┌──────┴──────┐
      │   虚拟机VF   │           │   虚拟机VF   │
      │ 10.10.10.41 │           │ 10.10.10.42 │
      └─────────────┘           └─────────────┘

优化点:

  1. 内网虚拟机全部直通VF网卡,绕过虚拟交换机
  2. OpenWrt作为内网统一网关,提供NAT和防火墙
  3. 外网流量通过OpenWrt转发到主路由

5.2 配置要点

OpenWrt双网卡配置:

  • eth0(直通):连接主路由,IP 192.168.0.250
  • eth1(直通):连接内网,IP 10.10.10.250

防火墙配置允许lan→innet、innet→lan转发。

六、常见问题

6.1 VF数量设置失败

# 检查错误日志
dmesg | grep -i sriov

# 可能原因:BIOS未开启SR-IOV或VT-d
# 解决方法:进入BIOS开启相关选项

6.2 虚拟机无法启动

# 检查IOMMU分组
cat /sys/kernel/iommu_groups/*/devices/*

# 如果VF与其他设备在同一组,可能需要一起直通

6.3 网络性能不达标

  1. 检查网卡协商速率
  2. 确保使用virtio驱动(Linux)或官方驱动(Windows)
  3. 开启巨帧(MTU 9000)

七、小结

本文详细介绍了PVE环境下两种主流万兆网卡的SR-IOV配置:

  1. Mellanox ConnectX-3:40G/56G网卡,VF直通Linux虚拟机稳定
  2. Intel X520:10G网卡,兼容性好,Windows支持完善

通过SR-IOV技术,可以:

  • 显著降低网络延迟
  • 提高网络吞吐量
  • 减少CPU资源占用
  • 实现接近物理机的网络性能

在All-in-One场景中,SR-IOV是优化虚拟机网络性能的最佳实践。

参考链接

Comment