ProxmoxVE(PVE) 启用 IOMMU

ProxmoxVE(PVE)VM/VPS 中添加 PCI 设备时候提示:No IOMMU detected, please activate it.See Documentation for further information. 本文将记录如何为ProxmoxVE(PVE) 启用 IOMMU

现行 ProxmoxVE(PVE) 版本内核自带默认开启了 IOMMU 支持

IOMMU 允许系统设备在虚拟内存中进行寻址,也就是将虚拟内存地址映射为物理内存地址,让实体设备可以在虚拟的内存环境中工作,这样可以帮助系统扩充内存容量,提升性能。

这么说可能有点复杂不易理解,这么说IOMMU重要用途是在虚拟化技术中,使VM虚拟机能够接入一些物理设备入PCIe中的网卡、声卡、显卡… VM虚拟机可以直接或间接使用它们

由于 IOMMU 是一项需要硬件支持的功能,因此需要进行一些检查准备工作。

  1. 硬件
  • 主板/硬件: 需要支持 IOMMU
  • CPU: Intel 的 VT-d 技术 AMDYES-Vi 技术
  1. 配置

必须在 BIOS/UEFI 中启用 IOMMU 支持,常规的名称可能会为 IOMMUVT-d IntelVT-d技术 AMDYES-Vi 技术 也需要在 BIOS/UEFI 中对应开启(近代产品基本都支持该技术。intel一般默认关闭,AMD默认开启)

  1. 系统/驱动
  • 你的硬件设备至少能基本兼容和运行Linux,并且有对应的驱动
  • 安装了ProxmoxVE系统 推荐为最新发行版截止本文记录时,版本为 7.3-3
  1. 系统设置

内核旧版为 5.15 或之前的,在 ProxmoxVE(PVE) 系统内核中,需要手动启用 IOMMU`` 。 5.15 版本以后的 ProxmoxVE(PVE)` 系统内核自带,只要硬件支持(满足上面的3点)时,在虚拟机添加 PCI 硬件设备位置 IOMMU 直接可用。

如 IOMMU 分组功能未开启,则会看到以下界面。

提示:No IOMMU detected, please activate it.See Documentation for further information. 未检测到IOMMU,请激活它。有关详细信息,请参阅文档

说明这时候需要手动开启,如果没有该提示且设备可选,那么就能直接跳过手动开启IOMMU这一整个步骤也可以顺带检查下是否开启PT模式

提示: ProxmoxVE8(PVE) 提示为:

需要通过编辑内核命令行来启用 IOMMU 。 使用文本编辑软件打开您的引导加载程序内核命令行配置文件。

打开WebGUI管理界面定位到:数据中心 -> 节点服务器 -> Shell

GRUB引导非常常见,一般也是ProxmoxVE(PVE)系统的默认引导方式

1
vim /etc/default/grub

找到GRUB_CMDLINE_LINUX_DEFAULT这一行

1
2
3
4
5
6
7
...
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s <strong>2</strong>> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""
...

interl CPU

如果你的CPU是 Intel CPU 那么就在 GRUB_CMDLINE_LINUX_DEFAULT 这一行的值里加入

1
intel_iommu=on

注意是追加,不是覆盖,就得到下面的格式

1
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"

检查无误后,按 esc 键,然后输入 :wq 保存更改

更新 grub

1
update-grub

AMD CPU

如果你的 CPU 是 AMDYES! CPU 那么就在 GRUB_CMDLINE_LINUX_DEFAULT 这一行的值里加入

1
amd_iommu=on

注意是追加,不是覆盖,就得到下面的格式

1
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on" 

检查无误后,按 esc 键,然后输入 :wq 保存更改


然后,使用以下命令,更新 grub

1
update-grub

如果引导是 systemd-boot(并不是ProxmoxVE现行版本常见引导方式):

1
vim /etc/kernel/cmdline

它的格式是带有选项的单行。如果不存在,您可以为 systemd-boot 新建文件


interl CPU

如果你的CPU是Intel CPU 那么就在第一行末尾添加以下内容

1
quiet intel_iommu=on

检查无误后,按 esc 键,然后输入 :wq 保存更改


AMD CPU

如果你的CPU是AMDYES! 那么就在第一行末尾添加以下内容

1
quiet amd_iommu=on

检查无误后,按 esc 键,然后输入 :wq 保存更改


然后更新 systemd-boot 引导

1
proxmox-boot-tool refresh

验证 IOMMU 是否已启用

1
dmesg | grep -e DMAR -e IOMMU

应该有一行 DMAR: IOMMU enabled。如果没有输出,则说明有问题需进一步排查

PT模式:会在IOMMU需要使用时候才启动,适配器不需要使用 DMA 转换到内存,因此可以提高其他没有分配过设备的性能

Intel 和 AMD 芯片都可以使用附加参数 iommu=pt

注意是追加,不是覆盖,就得到下面的格式

1
2
3
...
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt" 
...

基于 5.4 的内核中还需要添加一些模块设置,现行版本已经添加。但最好还是一并检查一下

1
vim /etc/modules

如果没有以下内容则添加,如果有则检查。不能重复也不能少

1
2
3
4
vfio 
vfio_iommu_type1 
vfio_pci 
vfio_virqfd

检查无误后,按 esc 键,然后输入 :wq 保存更改

更改任何相关模块后,您需要刷新 initramfs。通过执行以下命令来完成:

1
update-initramfs -u -k all

PT模式加入了 grub,也还行执行一次更新 grub

1
update-grub

如果没有中断重新映射,将无法使用 PCI 直通。设备分配将失败,并显示

Device assignment will fail with ‘Failed to assign device “[device name]”: Operation not permitted’ or ‘Interrupt Remapping hardware not found, passing devices to unprivileged domains is insecure

好在近代的 CPU/主板 只要开启了IOMMU 就会默认支持该功能甚至都没有开关选项,故此处省略记录。如遇到了只能是极个别问题,直接查阅官方文档 Pci_passthrough 参考借鉴解决即可。

文档来源于: https://www.insilen.com/post/501.html