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
- 点击进入 CPU 官方网站
-
搜索对应处理器型号(例如:i3-12300T【传送门】)
-
看到内容,则说明 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
,操作如下:
- Shell 里面输入命令:
nano /etc/default/grub
root@pve:~# nano /etc/default/grub
- 在里面找到:
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
然后修改为
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
编辑完成后,使用快捷键 Ctrl + O
回车保存文件,Ctrl + X
退出编辑器。
- 使用命令
update-grub
保存更改并更新 grub
root@pve:~# update-grub
- 更新完成后,使用命令
reboot
重启 PVE 系统
root@pve:~# reboot
2.2 AMD CPU
对于 AMD CPU 添加 amd_iommu=on
, 操作如下:
- Shell 里面输入命令:
nano /etc/default/grub
root@pve:~# nano /etc/default/grub
- 在里面找到:
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
然后修改为
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on"
编辑完成后,使用快捷键 Ctrl + O 回车保存文件,Ctrl + X 退出编辑器。
- 使用命令
update-grub
保存更改并更新 grub
root@pve:~# update-grub
- 更新完成后,使用命令
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 = multifunction | PCIe 直通多功能支持,提高直通完美度(可选) |
nofb | 该选项允许你不用一个 frame 缓冲来使用图形安装程序 |
textonly | 仅在文本模式下支持 GRUB 串行控制台 |
nomodeset | 系统启动过程中,暂时不运行图像驱动程序 |
video = vesafb: off | 禁用 vesa 启动显示设备 |
video = efifb: off | 禁用 efi 启动显示设备 |
video = simplefb: off | 5.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
-
重启后,验证是否开启 iommu
-
从命令行运行
dmesg | grep -e DMAR -e IOMMU
如果没有输出,则说明有问题。你应该看到这样的东西;DMAR: IOMMU enabled
-
如果有,可基本确认这个过程顺利完成! 接下来就可以为虚拟机正常的添加硬件直通了。
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 添加模块
- 修改
/etc/modules
文件
root@pve:~# nano /etc/modules
- 添加如下内容
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
vfio_virqfd
在 Linux 6.2 以上版本中不适用,低于 Linux 6.2 的请取消注释-
-
使用
update-initramfs -k all -u
命令更新内核参数 -
重启主机。
3.2 测试模块
- 重启之后,在终端输入
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
- 输入命令
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
- 验证是否 启用 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 后就能删除/修改错误的直通配置,恢复正常。
评论区