硬件直通

我没有显卡直通需求,以下参数仅在直通SATA控制器上测试成功

Gen8 直通SATA控制器

intel_iommu=on默认直通参数

直接分配给虚拟机对应的PCI设备开机会报错

kvm: -device vfio-pci,host=0000:00:1f.0,id=hostpci0.0,bus=ich9-pcie-port-1,addr=0x0.0,multifunction=on: vfio 0000:00:1f.0: failed to setup container for group 10: Failed to set group container: Invalid argument
TASK ERROR: start failed: QEMU exited with code 1

查阅资料后发现 intel_iommu=relax_rmrr 能解决问题:
RMRR (Reserved Memory Region Reporting) 是 Intel 为了保证硬件稳定,在 BIOS 里划定的一些自留地。
BIOS 说:这几块内存地址(比如处理 USB 鼠标或主板监控的数据)只能给特定的硬件使用,操作系统不准动。

dmesg | grep -e DMAR -e IOMMU 的输出

DMAR: [Firmware Bug]: No firmware reserved region can cover this RMRR [0x00000000000f4000-0x00000000000f4fff], contact BIOS vendor for fixesDMAR: [Firmware Bug]: Your BIOS is broken; bad RMRR [0x00000000000f4000-0x00000000000f4fff]
DMAR: RMRR base: 0x000000000e8000 end: 0x000000000e8fff
DMAR: [Firmware Bug]: No firmware reserved region can cover this RMRR [0x00000000000e8000-0x00000000000e8fff], contact BIOS vendor for fixes
DMAR: [Firmware Bug]: Your BIOS is broken; bad RMRR [0x00000000000e8000-0x00000000000e8fff]

AI分析:

解读:这是 HP Gen8 的老毛病。BIOS 定义了一些保留内存区域(RMRR),但定义得不规范,被 Linux 内核判定为非法。
影响:如果没有 intel_iommu=relax_rmrr 参数,内核会因为安全风险拒绝初始化 IOMMU 或拒绝直通相关设备。
结论:你之前加上 relax_rmrr 确实是神来之笔,必须保留,否则直通必报 Invalid argument。

经测试,intel_iommu=relax_rmrr 是Gen8直通SATA控制器必须的,否则虚拟机开机报错


Gen8 其他直通参数

根据dmesg | grep -e DMAR -e IOMMU 的输出

DMAR-IR: x2apic is disabled because BIOS sets x2apic opt out bit.
DMAR-IR: Use 'intremap=no_x2apic_optout' to override the BIOS setting.

Gen8 的 BIOS 默认禁止了 x2apic(一种更高效的中断处理模式)。
系统能跑,但为了让 CPU 在处理虚拟机大量 I/O 中断时更高效,建议在启动参数里加上:
intremap=no_x2apic_optout
作用是强行无视 BIOS 的限制,开启高性能中断模式。


直通参数配置

根据情况选择相应的操作

情况1:外置U盘引导

因为我是U盘启动NVMe中的PVE,所以在 grub.cfg 或者 menu.slt 中找到
root=/dev/mapper/pve-root ro quiet
在后面加上 intel_iommu=on,relax_rmrr iommu=pt

最终的启动参数

kernel /boot/vmlinuz-6.17.2-1-pve root=/dev/mapper/pve-root ro quiet intel_iommu=on,relax_rmrr iommu=pt 
initrd /boot/initrd.img-6.17.2-1-pve

情况2:内置引导(GRUB)

  1. 编辑 GRUB 配置文件
    vi /etc/default/grub
  2. 找到参数行并修改
    找到以 GRUB_CMDLINE_LINUX_DEFAULT 开头的一行,在引号内添加直通参数。
    修改前: GRUB_CMDLINE_LINUX_DEFAULT="quiet"
    修改后: GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on,relax_rmrr iommu=pt"
  3. 应用配置(必须执行)
    修改保存后,必须运行以下命令让配置写入引导分区:
    update-grub

验证生效

重启 PVE 后,执行以下命令查看当前内核收到的指令:
cat /proc/cmdline

root@pve:~# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-6.17.9-1-pve root=/dev/mapper/pve-root ro quiet intel_iommu=on,relax_rmrr iommu=pt

参数说明

部分参数说明来自AI

intel_iommu=on

描述:开启 Intel CPU 的 IOMMU 支持,硬件直通的总开关。
作用:它在物理硬件和虚拟机之间建立一层地址转换映射,是所有直通操作的基础。没有它,后续所有参数均不生效。

intel_iommu=relax_rmrr

描述:解开 HPE 硬件锁定。
作用:Gen8 的 BIOS 经常将板载网卡或 USB 划入不可分配的保留内存区域(RMRR)。加上此参数可以强行解除锁定,解决设备被 RMRR 占用无法直通的问题。

iommu=pt

描述:开启 Passthrough 模式,提高未直通设备的性能
作用:让内核仅在必要时才转换设备地址。这能显著提升宿主机(PVE)自身未被直通硬件的性能,并减少 CPU 开销。

intremap=no_x2apic_optout

描述:中断映射优化
作用:在开启直通后,某些老旧的服务器硬件(如 Gen8)可能会出现中断处理异常,导致系统日志疯狂报错或虚拟机卡顿。这个参数告诉内核:别管 BIOS 的限制,强制开启中断映射。

pcie_acs_override=downstream,multifunction(拆分网卡的时候需要)

描述:拆分分组
作用:PCIe 插槽分组(IOMMU Group)有时候非常暴力,可能把网卡、阵列卡全分在一个组里,导致你要么全给虚拟机,要么一个都不给。强制系统尝试拆分这些分组,让你能绕过硬件层面的隔离限制,精准地把某一个网口或某一块卡单独分给虚拟机。

intremap=off (备选)

描述:如果上面的参数还是让你在直通网卡时导致 PVE 宿主机断网或死机
作用:彻底关掉中断映射。会降低一点安全性,但能解决很多由于硬件中断冲突导致的直通失败问题。


GEN8默认iommu分组

BIOS 里面可以适当调整分组,但是自由度并不是很高,能调但不完全能调
GEN8默认iommu分组

Last modification:February 20, 2026
If you think my article is useful to you, please feel free to appreciate