🚀 Proxmox VE 高级配置指南:SR-IOV & 硬件直通

让虚拟机直接接管硬件设备,释放物理性能极限


🔧 一、开启 IO-MMU 和 SR-IOV

1️⃣ 修改 GRUB 配置

bash

nano /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT 末尾追加(按平台二选一):

bash

# Intel 平台
quiet intel_iommu=on iommu=pt pcie_aspm=off pcie_acs_override=downstream,multifunction video=efifb:off,vesafb:off,simplefb:off

# AMD 平台(替换 intel_iommu=on)
quiet amd_iommu=on iommu=pt ... 

参数解析

  • intel_iommu=on/amd_iommu=on:启用 IOMMU 硬件虚拟化

  • iommu=pt:直通模式提升性能

  • pcie_acs_override=...:强制拆分设备组(解决直通分组问题)

  • video=...:off:禁用帧缓冲驱动(避免资源冲突)

▶️ 更新grub:

bash

update-grub

2️⃣ 加载直通内核模块

bash

nano /etc/modules

添加以下模块

text

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

▶️ 刷新配置:

bash

update-initramfs -u

3️⃣ 验证硬件状态

bash

# 查看网卡信息
lspci -nn | grep -i ethernet

# 检查 SR-IOV 支持(输出 >0 表示支持)
cat /sys/bus/pci/devices/0000:0c:00.0/sriov_totalvfs  # 替换为您的 PCI 地址

# 查看网卡驱动
ethtool -i enp5s0f0 | grep driver

4️⃣ 自动化 VF 创建脚本

bash

nano /etc/init.d/net-sriov

脚本内容(根据网卡名修改 enp5s0f0f0):

bash

#!/bin/sh
start() {
    echo 12 > /sys/class/net/enp5s0f0f0/device/sriov_numvfs  # 创建 12 个虚拟网卡
    ip link set dev enp5s0f0f0 up
    
    # 为每个 VF 设置唯一 MAC 地址
    for i in {0..11}; do
        ip link set dev enp5s0f0f0 vf $i mac aa:bb:cc:dd:ee:$((f1+i))
    done
}
case "$1" in start) start;; *) echo "Usage: $0 start";; esac

▶️ 启用脚本并重启

bash

chmod +x /etc/init.d/net-sriov
systemctl enable net-sriov
reboot

🎮 二、显卡直通配置

1️⃣ 屏蔽冲突驱动

bash

nano /etc/modprobe.d/pve-blacklist.conf

按显卡类型添加

bash

# Intel 核显
blacklist snd_hda_intel
blacklist snd_hda_codec_hdmi
blacklist i915

# NVIDIA 独显
blacklist nouveau
blacklist nvidia
blacklist nvidiafb

# AMD 显卡
blacklist radeon
blacklist amdgpu

⚠️ NVIDIA 额外配置

bash

echo "options kvm ignore_msrs=1" > /etc/modprobe.d/kvm.conf

2️⃣ 绑定设备到 VFIO

bash

# 获取设备 ID
lspci -nn

# 绑定设备(替换为您的 ID)
echo "options vfio-pci ids=1e0f:0008,8086:9bc5,8086:a3f0,10de:1f82,10de:10fa disable_vga=1" > /etc/modprobe.d/vfio.conf

▶️ 刷新配置并重启:

bash

update-initramfs -u && reboot

3️⃣ 验证直通状态

bash

lspci -nnk
# 输出示例:Kernel driver in use: vfio-pci

4️⃣ 虚拟机配置优化

bash

nano /etc/pve/qemu-server/100.conf

添加以下参数(解决 NVIDIA 43 错误):
args: -cpu host,kvm=off,hv_vendor_id=NV43FIX,hv_time,hv_relaxed,hv_vapic,hv_spinlocks=0x1fff

添加pcie设备时参数解析:

  • pcie=1:启用 PCIe 3.0/4.0 模式

  • rombar=0:禁用 ROM 加载(加速启动)

  • x-vga=0:非主显卡时必加

  • x-pci-sub-device-id=0x0000:解决设备 ID 冲突


⚡ 三、IOMMU 分组优化(ACS 补丁内核)

1️⃣ 安装破解内核

bash

# 下载地址(替换实际版本)
wget https://github.com/yfdoor/PVE-Kernel/releases/xxx.deb
dpkg -i *.deb

⚠️ 如需新版proxmox-kernel-6.11.0-2内核,也可找我获取

2️⃣ 调整 GRUB 引导

bash

nano /etc/default/grub

修改为
GRUB_DEFAULT="Advanced options...>Proxmox VE, with Linux 5.13.18-1-pve"
▶️ 更新配置:

bash

update-grub && reboot

3️⃣ 验证分组效果

bash

for d in /sys/kernel/iommu_groups/*/devices/*; do 
  n=${d#*/iommu_groups/*}; n=${n%%/*};
  echo "IOMMU Group $n: $(lspci -nns ${d##*/})";
done

理想输出:每个直通设备独立分组(如显卡单独 Group 12)


💾 四、硬盘/U 盘直通技巧

bash

# 查看磁盘 ID
ls -l /dev/disk/by-id

# SATA 直通(示例)
qm set 100 -scsi1 /dev/disk/by-id/ata-WDC-XXXXXX,discard=on,ssd=1

# USB 直通(通过 vendorID)
qm set 100 -usb0 host=13fe:3e00

# 移除直通设备
qm set 100 -delete scsi1

参数解析

  • discard=on:打通虚拟化环境下的 TRIM 指令传递通道,解决 SSD 在虚拟化中的 "写放大" 和 "性能衰减" 两大痼疾。

  • ssd=1:启用ssd仿真


💡 关键要点总结

  1. 安全第一

    • 修改 grub 前备份:cp /etc/default/grub /etc/default/grub.bak

    • 测试参数后再持久化配置

  2. 排错工具

    • dmesg | grep -i vfio 查看驱动绑定日志

    • lsmod | grep vfio 验证模块加载

  3. 性能调优

    • SR-IOV VF 数量不超过 sriov_totalvfs 限制

    • 显卡直通后关闭宿主机显示管理器(如 systemctl stop gdm

操作遇阻?尝试:

  • 更新内核到最新版 apt install pve-kernel-8.4

  • 检查 BIOS 中 VT-d/SVM 和 SR-IOV 支持是否开启

  • 社区支持:Proxmox 论坛