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界面配置
- 选择虚拟机 → 硬件 → 添加 → PCI设备
- 选择"Mapped Device"或"Raw Device"
- 选择对应的VF(如
03:00.2) - 勾选"All Functions"和"ROM-Bar"
- 保存配置
命令行配置
# 编辑虚拟机配置文件
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虚拟机注意事项:
- 需要安装Intel官方驱动
- 驱动下载地址:Intel X520驱动
四、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 │
└─────────────┘ └─────────────┘
优化点:
- 内网虚拟机全部直通VF网卡,绕过虚拟交换机
- OpenWrt作为内网统一网关,提供NAT和防火墙
- 外网流量通过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 网络性能不达标
- 检查网卡协商速率
- 确保使用virtio驱动(Linux)或官方驱动(Windows)
- 开启巨帧(MTU 9000)
七、小结
本文详细介绍了PVE环境下两种主流万兆网卡的SR-IOV配置:
- Mellanox ConnectX-3:40G/56G网卡,VF直通Linux虚拟机稳定
- Intel X520:10G网卡,兼容性好,Windows支持完善
通过SR-IOV技术,可以:
- 显著降低网络延迟
- 提高网络吞吐量
- 减少CPU资源占用
- 实现接近物理机的网络性能
在All-in-One场景中,SR-IOV是优化虚拟机网络性能的最佳实践。