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

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

基本要求

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

1. 硬件

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

2. 配置

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

3. 系统/驱动

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

4. 系统设置

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

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

ProxmoxVE(PVE) 启用 IOMMU

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

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

手动启用 IOMMU

需要通过编辑内核命令行来启用 IOMMU 。 使用文本编辑软件打开您的引导加载程序内核命令行配置文件。打开WebGUI管理界面定位到:数据中心 -> 节点服务器 -> Shell

对于GRUB引导:

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

nano /etc/default/grub

找到GRUB_CMDLINE_LINUX_DEFAULT这一行

...
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=""
...

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

intel_iommu=on

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

...
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
...

检查无误后,按 ctrl+x 并按y确认保存更改

更新 grub

update-grub

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

amd_iommu=on

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

...
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on" 
...

检查无误后,按 ctrl+x 并按y确认保存更改

更新 grub

update-grub

对于systemd-boot引导:

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

nano /etc/kernel/cmdline

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

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

quiet intel_iommu=on

检查无误后,按 ctrl+x 并按y确认保存更改

然后更新 systemd-boot 引导

proxmox-boot-tool refresh

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

quiet amd_iommu=on

检查无误后,按 ctrl+x 并按y确认保存更改

然后更新 systemd-boot 引导

proxmox-boot-tool refresh

重启系统

验证 IOMMU 是否已启用

dmesg | grep -e DMAR -e IOMMU

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

在WebGUI中验证 IOMMU 是否已启用:

VM虚拟机中分配PCI硬件设备时候可见:

ProxmoxVE(PVE) 启用 IOMMU

开启PT模式

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

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

iommu=pt

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

...
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt" 
...

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

nano /etc/modules

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

vfio 
vfio_iommu_type1 
vfio_pci 
vfio_virqfd

检查无误后,按 ctrl+x 并按y确认保存更改

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

update-initramfs -u -k all

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

update-grub

IOMMU 中断重映射

如果没有中断重新映射,将无法使用 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 参考借鉴解决即可。

Zimri 收集整理,欢迎转载,请注明出处:https://www.insilen.com/post/501.html

文章遵循 署名-非商业性使用-相同方式共享 4.0 国际(CC BY-NC-SA 4.0)协议

(0)
打赏 微信赞赏 微信赞赏 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-19 22:16
下一篇 2022-12-22 03:01

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注