侧边栏壁纸
博主头像
Narutoの博客

行动起来,活在当下

  • 累计撰写 58 篇文章
  • 累计创建 29 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录
NAS

PVE 开启硬件直通

Naruto
2025-07-29 / 0 评论 / 0 点赞 / 3 阅读 / 0 字

PVE 开启硬件直通

我们在 Proxmox VE(Proxmox Virtual Environment)PVE 系统操作添加: PCI 设备 硬件直通提示:No IOMMU detected, please activate it.See Documentation for further information.【翻译:未开启 IOMMU,请设置开启激活,更多有关更多信息,请参阅文档。】

这是因为默认 ProxmoxVE PVE 系统只能支持硬盘、CPU 型号直通。其他 PCI 硬件,例如:网卡 或者 核心显卡的直通,还需要开启 IOMMU 分组功能。

在 Proxmox VE(PVE)系统开启 IOMMU 功能实现硬件直通之前,我们要确认 CPU 是否支持 VT-D 技术; 开启直通的必要条件 Intel CPU 支持 VT-D,同时主板要开启 VT-D 支持。

一、查询 CPU 是否支持 VT-D

  1. 点击进入 CPU 官方网站
  1. 搜索对应处理器型号(例如:i3-12300T【传送门】)

  2. 看到内容,则说明 CPU 支持 VT-D 技术

英特尔® Virtualization Technology for Directed I/O (VT-d) ‡ 
是
英特尔® VT-x with Extended Page Tables (EPT) ‡ 
是

二、启用 IOMMU 功能

IOMMU(Input-Output Memory Management Unit)是一种硬件功能,用于管理设备对系统内存的访问。启用 IOMMU 后,可以在虚拟机中直接访问物理设备,并允许虚拟机独立于主机操作系统运行

编辑(nano、vi) /etc/default/grub ,并修改 GRUB_CMDLINE_LINUX_DEFAULT 那一行。

2.1 Intel CPU

对于 Intel CPU,添加 intel_iommu=on,操作如下:

  1. Shell 里面输入命令:nano /etc/default/grub
root@pve:~# nano /etc/default/grub
  1. 在里面找到:GRUB_CMDLINE_LINUX_DEFAULT="quiet"

然后修改为

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"

编辑完成后,使用快捷键 Ctrl + O 回车保存文件,Ctrl + X 退出编辑器。

  1. 使用命令 update-grub 保存更改并更新 grub
root@pve:~# update-grub
  1. 更新完成后,使用命令 reboot 重启 PVE 系统
root@pve:~# reboot

2.2 AMD CPU

对于 AMD CPU 添加 amd_iommu=on, 操作如下:

  1. Shell 里面输入命令:nano /etc/default/grub
root@pve:~# nano /etc/default/grub
  1. 在里面找到:GRUB_CMDLINE_LINUX_DEFAULT="quiet"

然后修改为

GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on"

编辑完成后,使用快捷键 Ctrl + O 回车保存文件,Ctrl + X 退出编辑器。

  1. 使用命令 update-grub 保存更改并更新 grub
root@pve:~# update-grub
  1. 更新完成后,使用命令 reboot 重启 PVE 系统
root@pve:~# reboot

2.3 高级配置

# 对于 Intel CPU
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream,multifunction pci=nommconf"

# 对于 AMD CPU
GRUB_CMDLINE_LINUX_DEFAULT="quiet iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream,multifunction pci=nommconf"

# 其他的一些写法(如果是AMD处理器,将intel改为amd)
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_gvt=1 video=efifb:off" # 这是GVT模式,也就是共享模式,少部分cpu支持,但体验很好
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt video=efifb:off" # 这是独占模式,都支持,但显示器没有pve的控制台输出,也只能直通个一个虚拟机
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream,multifunction"
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on initcall_blacklist=sysfb_init pcie_acs_override=downstream,multifunction"

# 参数释义
1.iommu=pt:启用 Intel VT-d 或 AMD-Vi 的 IOMMU。这是一种硬件功能,用于管理设备对系统内存的访问。在虚拟化环境中,启用 IOMMU 后,可以将物理设备直通到虚拟机中,以便虚拟机可以直接访问硬件设备。“iommu=pt”不是必须的,PT模式只在必要的时候开启设备的IOMMU转换,可以提高未直通设备PCIe的性能,建议添加。

2.initcall_blacklist=sysfb_init:禁用 sysfb_init 内核初始化函数。这个函数通常用于在内核启动过程中初始化系统帧缓冲。在使用 GPU 直通的情况下,这个函数可能会干扰直通操作,因此需要禁用它。

3.i915.enable_gvt=1:启用 Intel GVT-g 虚拟 GPU 技术。这个选项用于创建一个虚拟的 Intel GPU 设备,以便多个虚拟机可以共享物理 GPU 设备。启用 GVT-g 需要在支持虚拟 GPU 的 Intel CPU 和主板上运行,并且需要正确配置内核和虚拟机。想开启GVT-g的就添加这条,显卡直通的就不要添加了。

4.initcall_blacklist=sysfb_init:屏蔽掉pve7.2以上的一个bug,方便启动时候就屏蔽核显等设备驱动;

5.pcie_acs_override=downstream,multifunction:便于iommu每个设备单独分组,以免直通导致物理机卡死等问题

6.pci=nommconf:意思是禁用pci配置空间的内存映射,所有的 PCI 设备都有一个描述该设备的区域(您可以看到lspci -vv),访问该区域的最初方法是通过 I/O 端口,而 PCIe 允许将此空间映射到内存以便更简单地访问。

###
intel_iommu 和 amd_iommu=on 为 开启IOMMU
video=vesafb:off  不加载 vesafb 是 veas设备 的 fb 
video=efifb:off   不加载  uefi设备 的 fb 
在 PVE 7.3 之后版本用initcall_blacklist=sysfb_init 替代
pcie_acs_override=downstream 是为了将 iommu groups拆分,
方便直通一些板载的设备(来源于加强硬件直通的功能)

参数解释说明
quiet默认参数,表示在启动过程中只显示重要信息
intel_iommu = on用 intel_iommu 驱动来驱动 IOMMU 硬件单元
amd_iommu = on用 amd_iommu 驱动来驱动 IOMMU 硬件单元
iommu = pt只为使用透传功能的设备启用 IOMMU,并可以提供更好的功能和性能
pci = assign-busses部分网卡开启 SR-IOV 需要这个参数,否则可能报错
PCIe_acs_override = downstream用于将 iommu groups 拆分,方便灵活按需直通一些板载的设备
PCIe_acs_override = multifunctionPCIe 直通多功能支持,提高直通完美度(可选)
nofb该选项允许你不用一个 frame 缓冲来使用图形安装程序
textonly仅在文本模式下支持 GRUB 串行控制台
nomodeset系统启动过程中,暂时不运行图像驱动程序
video = vesafb: off禁用 vesa 启动显示设备
video = efifb: off禁用 efi 启动显示设备
video = simplefb: off5.15 内核开始直通可能需要这个参数
initcall_blacklist = sysfb_init部分 A 卡如 RX580 直通异常可能需要这个参数
pcie_aspm = off关闭 PCIe 设备的 ASPM 节能模式,解决部分 PCIe 设备 AER 报错
pcie_aspm = force强制 PCIe 设备及爱情 ASPM 节能模式,解决部分 PCIe 设备 AER 报错
pci = noaer不输出 AER 报错日志,华南主板经常会 AER 报错,建议配合使用,眼不见心不烦
pci = nomsi在系统范围内禁用 MSI 中断,主要还是解决 PCIe 相关的报错

2.4 测试 iommu

  1. 重启后,验证是否开启 iommu

  2. 从命令行运行 dmesg | grep -e DMAR -e IOMMU 如果没有输出,则说明有问题。你应该看到这样的东西;DMAR: IOMMU enabled

  3. 如果有,可基本确认这个过程顺利完成! 接下来就可以为虚拟机正常的添加硬件直通了。

root@pve:~# dmesg | grep -e DMAR -e IOMMU
[    0.010605] ACPI: DMAR 0x0000000045382000 000088 (v02 INTEL  EDK2     00000002      01000013)
[    0.010663] ACPI: Reserving DMAR table memory at [mem 0x45382000-0x45382087]
[    0.056212] DMAR: IOMMU enabled
[    0.146289] DMAR: Host address width 39
[    0.146291] DMAR: DRHD base: 0x000000fed90000 flags: 0x0
[    0.146299] DMAR: dmar0: reg_base_addr fed90000 ver 4:0 cap 1c0000c40660462 ecap 29a08f0505e
[    0.146302] DMAR: DRHD base: 0x000000fed91000 flags: 0x1
[    0.146307] DMAR: dmar1: reg_base_addr fed91000 ver 5:0 cap d2008c40660462 ecap f050da
[    0.146310] DMAR: RMRR base: 0x0000004c000000 end: 0x000000507fffff
[    0.146314] DMAR-IR: IOAPIC id 2 under DRHD base  0xfed91000 IOMMU 1
[    0.146315] DMAR-IR: HPET id 0 under DRHD base 0xfed91000
[    0.146317] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[    0.147342] DMAR-IR: Enabled IRQ remapping in x2apic mode
[    0.396501] pci 0000:00:02.0: DMAR: Skip IOMMU disabling for graphics
[    0.477359] DMAR: No ATSR found
[    0.477360] DMAR: No SATC found
[    0.477362] DMAR: IOMMU feature fl1gp_support inconsistent
[    0.477363] DMAR: IOMMU feature pgsel_inv inconsistent
[    0.477364] DMAR: IOMMU feature nwfs inconsistent
[    0.477365] DMAR: IOMMU feature dit inconsistent
[    0.477366] DMAR: IOMMU feature sc_support inconsistent
[    0.477366] DMAR: IOMMU feature dev_iotlb_support inconsistent
[    0.477367] DMAR: dmar0: Using Queued invalidation
[    0.477370] DMAR: dmar1: Using Queued invalidation
[    0.479412] DMAR: Intel(R) Virtualization Technology for Directed I/O

三、增加驱动,加载模块

这仅在必要时启用 IOMMU 转换,将 iommu 分组相关的内核模块启用,从而可以提高 VM 中未使用的 PCIe 设备的性能。

3.1 添加模块

  1. 修改 /etc/modules 文件
root@pve:~# nano /etc/modules
  1. 添加如下内容
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
  • vfio_virqfd 在 Linux 6.2 以上版本中不适用,低于 Linux 6.2 的请取消注释-
  1. 使用 update-initramfs -k all -u 命令更新内核参数

  2. 重启主机。

3.2 测试模块

  1. 重启之后,在终端输入 dmesg | grep iommu,出现如下例子。则代表成功
root@pve:~# dmesg | grep iommu
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-6.8.12-13-pve root=/dev/mapper/pve-root ro quiet intel_iommu=on
[    0.056152] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-6.8.12-13-pve root=/dev/mapper/pve-root ro quiet intel_iommu=on
[    0.433313] iommu: Default domain type: Translated
[    0.433313] iommu: DMA domain TLB invalidation policy: lazy mode
[    0.477800] pci 0000:00:02.0: Adding to iommu group 0
[    0.478185] pci 0000:00:00.0: Adding to iommu group 1
[    0.478197] pci 0000:00:06.0: Adding to iommu group 2
[    0.478205] pci 0000:00:08.0: Adding to iommu group 3
[    0.478221] pci 0000:00:14.0: Adding to iommu group 4
[    0.478230] pci 0000:00:14.2: Adding to iommu group 4
[    0.478241] pci 0000:00:15.0: Adding to iommu group 5
[    0.478252] pci 0000:00:16.0: Adding to iommu group 6
[    0.478260] pci 0000:00:17.0: Adding to iommu group 7
[    0.478280] pci 0000:00:1c.0: Adding to iommu group 8
[    0.478298] pci 0000:00:1d.0: Adding to iommu group 9
[    0.478310] pci 0000:00:1d.7: Adding to iommu group 10
[    0.478336] pci 0000:00:1f.0: Adding to iommu group 11
[    0.478344] pci 0000:00:1f.3: Adding to iommu group 11
[    0.478354] pci 0000:00:1f.4: Adding to iommu group 11
[    0.478362] pci 0000:00:1f.5: Adding to iommu group 11
[    0.478373] pci 0000:00:1f.6: Adding to iommu group 11
[    0.478382] pci 0000:01:00.0: Adding to iommu group 12
[    0.478414] pci 0000:02:00.0: Adding to iommu group 13
[    0.478438] pci 0000:02:00.1: Adding to iommu group 14
[    0.478449] pci 0000:04:00.0: Adding to iommu group 15
  1. 输入命令 find /sys/kernel/iommu_groups/ -type l,出现很多直通组,就代表成功了。如果没有任何东西,就是没有开启
root@pve:~# find /sys/kernel/iommu_groups/ -type l
/sys/kernel/iommu_groups/7/devices/0000:00:17.0
/sys/kernel/iommu_groups/15/devices/0000:04:00.0
/sys/kernel/iommu_groups/5/devices/0000:00:15.0
/sys/kernel/iommu_groups/13/devices/0000:02:00.0
/sys/kernel/iommu_groups/3/devices/0000:00:08.0
/sys/kernel/iommu_groups/11/devices/0000:00:1f.0
/sys/kernel/iommu_groups/11/devices/0000:00:1f.5
/sys/kernel/iommu_groups/11/devices/0000:00:1f.3
/sys/kernel/iommu_groups/11/devices/0000:00:1f.6
/sys/kernel/iommu_groups/11/devices/0000:00:1f.4
/sys/kernel/iommu_groups/1/devices/0000:00:00.0
/sys/kernel/iommu_groups/8/devices/0000:00:1c.0
/sys/kernel/iommu_groups/6/devices/0000:00:16.0
/sys/kernel/iommu_groups/14/devices/0000:02:00.1
/sys/kernel/iommu_groups/4/devices/0000:00:14.2
/sys/kernel/iommu_groups/4/devices/0000:00:14.0
/sys/kernel/iommu_groups/12/devices/0000:01:00.0
/sys/kernel/iommu_groups/2/devices/0000:00:06.0
/sys/kernel/iommu_groups/10/devices/0000:00:1d.7
/sys/kernel/iommu_groups/0/devices/0000:00:02.0
/sys/kernel/iommu_groups/9/devices/0000:00:1d.0
  1. 验证是否 启用 IOMMU 中断重映射,输入 dmesg | grep remapping 并输出 类似 以下内容即为成功。
dmesg | grep remapping
# intel
[    0.175675] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[    0.177198] DMAR-IR: Enabled IRQ remapping in x2apic mode
# amd
AMD-Vi: Interrupt remapping enabled
root@pve:~# dmesg | grep remapping
[    0.146317] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[    0.147342] DMAR-IR: Enabled IRQ remapping in x2apic mode
  • 如果失败或者没有,可能没有 启用 IOMMU 中断重映射 ,会导致无法直通,请如下操作。
vim /etc/modprobe.d/iommu_unsafe_interrupts.conf
 
#增加
options vfio_iommu_type1 allow_unsafe_interrupts=1 

PVE 系统添加 PCI 设备开启硬件直通界面

四、PVE 直通错误

如果出现 PVE 下的虚拟主机直通硬件时,不小心把 PVE 系统主机使用的网卡、硬盘或者是其他硬件直通了,又勾选了 开机自启动 的选项,导致无法进入 PVE 系统网页控制界面,重启后也是没用任何反应,多次重启后还是无法解决

可以直接从 BIOS 上设置关闭虚拟化支持,这样 PVE 启动后, 虚拟机就会自启失败

✅ 直通导致 PVE 无法启动的原因

  • 如果把 PVE 正在使用的硬件(比如启动盘、主网卡)直通给虚拟机,启动时 VM 会“抢走”这个硬件。
  • 如果该虚拟机还设置了 开机自启,那么 PVE 一启动 VM 就跟着启动,硬件被直通,PVE 自身就挂了。
  • 结果:Web 界面进不去,物理机也没法用。

✅ 解决办法原理

  • 关闭虚拟化支持(VT-d / IOMMU)
    • 在 BIOS 禁用虚拟化相关选项(Intel VT-d / AMD IOMMU)。
    • 这样 PVE 即使想直通硬件也做不到,虚拟机启动直通失败 → VM 会报错但 PVE 本身能起来。
  • 进 PVE 后就能删除/修改错误的直通配置,恢复正常。

参考

  1. Proxmox VE(PVE)系统开启 IOMMU 功能实现硬件直通
  2. PVE 开启 IOMMU(硬件直通)
  3. PVE 开启硬件直通功能
  4. PVE(Proxmox Virtual Environment)虚拟机配置有误、直通错误、设置了开机自启动等,导致 PVE 卡死机无法进入 web 管理页面的解决方式
0

评论区