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
是一项需要硬件支持的功能,因此需要进行一些检查准备工作。
- 硬件
- 主板/硬件: 需要支持
IOMMU
- CPU: Intel 的
VT-d
技术AMDYES-
的Vi
技术
- 配置
必须在 BIOS/UEFI
中启用 IOMMU
支持,常规的名称可能会为 IOMMU
或 VT-d Intel
的VT-d
技术 AMDYES-
的 Vi
技术 也需要在 BIOS/UEFI
中对应开启(近代产品基本都支持该技术。intel一般默认关闭,AMD默认开启)
- 系统/驱动
- 你的硬件设备至少能基本兼容和运行Linux,并且有对应的驱动
- 安装了ProxmoxVE系统 推荐为最新发行版截止本文记录时,版本为 7.3-3
- 系统设置
内核旧版为 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
需要通过编辑内核命令行来启用 IOMMU 。 使用文本编辑软件打开您的引导加载程序内核命令行配置文件。
打开WebGUI管理界面定位到:数据中心 -> 节点服务器 -> Shell
对于GRUB引导
GRUB引导非常常见,一般也是ProxmoxVE(PVE)系统的默认引导方式
vim /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=""
...
interl CPU
如果你的CPU是 Intel CPU 那么就在 GRUB_CMDLINE_LINUX_DEFAULT
这一行的值里加入
intel_iommu=on
注意是追加,不是覆盖,就得到下面的格式
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
检查无误后,按 esc 键,然后输入 :wq
保存更改
更新 grub
update-grub
AMD CPU
如果你的 CPU 是 AMDYES! CPU 那么就在 GRUB_CMDLINE_LINUX_DEFAULT
这一行的值里加入
amd_iommu=on
注意是追加,不是覆盖,就得到下面的格式
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on"
检查无误后,按 esc 键,然后输入 :wq
保存更改
然后,使用以下命令,更新 grub
update-grub
对于systemd-boot引导
如果引导是 systemd-boot(并不是ProxmoxVE现行版本常见引导方式):
vim /etc/kernel/cmdline
它的格式是带有选项的单行。如果不存在,您可以为 systemd-boot 新建文件
interl CPU
如果你的CPU是Intel CPU 那么就在第一行末尾添加以下内容
quiet intel_iommu=on
检查无误后,按 esc 键,然后输入 :wq
保存更改
AMD CPU
如果你的CPU是AMDYES! 那么就在第一行末尾添加以下内容
quiet amd_iommu=on
检查无误后,按 esc 键,然后输入 :wq
保存更改
然后更新 systemd-boot 引导
proxmox-boot-tool refresh
重启系统
验证 IOMMU 是否已启用
dmesg | grep -e DMAR -e IOMMU
应该有一行
DMAR: IOMMU enabled
。如果没有输出,则说明有问题需进一步排查
开启PT模式
PT模式:会在IOMMU需要使用时候才启动,适配器不需要使用 DMA 转换到内存,因此可以提高其他没有分配过设备的性能
Intel 和 AMD 芯片都可以使用附加参数 iommu=pt
注意是追加,不是覆盖,就得到下面的格式
...
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
...
基于 5.4 的内核中还需要添加一些模块设置,现行版本已经添加。但最好还是一并检查一下
vim /etc/modules
如果没有以下内容则添加,如果有则检查。不能重复也不能少
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
检查无误后,按 esc 键,然后输入 :wq
保存更改
更改任何相关模块后,您需要刷新 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 参考借鉴解决即可。