![如何为 AMD IOMMU 编译 Gentoo 内核?](https://linux22.com/image/89122/%E5%A6%82%E4%BD%95%E4%B8%BA%20AMD%20IOMMU%20%E7%BC%96%E8%AF%91%20Gentoo%20%E5%86%85%E6%A0%B8%EF%BC%9F.png)
我有一个 AMD A4-5300 CPU,其主板支持 IOMMU,我尝试在我的 Gentoo Hardened 4.3.3-r4 内核上启用 IOMMU,目的是在 KVM 虚拟机上使用显卡。根据本指南在这里,我应该使用一些提供的选项(“支持 DMA 重新映射设备”、“启用 DMA 重新映射设备”和“PCI 存根驱动程序”)重新编译内核。但是,我的内核配置中缺少“Support for DMA Remapping Devices”和“Enable DMA Remapping Devices”。
然后,我在配置中搜索“重新映射”,并尝试启用多个选项,其中包括 CONFIG_IRQ_REMAP、CONFIG_DMAR_TABLE、CONFIG_IOMMU_SUPPORT、CONFIG_SWIOTLB 和 CONFIG_PCI_IOV。然后,我在启用这些选项的情况下重新编译了内核,amd_iommu=fullflush iommu=force
在内核命令行上启动了我的系统,并根据上述指南,我通过在内核消息中查找“AMD-Vi”来检查 IOMMU 是否在我的系统上运行:
dmesg | grep AMD-Vi
我的内核日志中没有显示任何有关 AMD-Vi 的内容。
此外,当我尝试在 virt-manager 上启动带有附加 PCI 设备的虚拟机时,我收到一条消息:“启动域时出错:不支持的配置:主机不支持主机 PCI 设备的直通”。
我发现的几乎所有内容都适用于 Fedora、Ubuntu 和 Debian,其中 IOMMU 显然是开箱即用的。我不认为这是我的主板和 CPU 不支持它的问题,因为我的 BIOS 有一个选项,而且因为我记得几年前能够在 Debian 上运行带有 IOMMU 的 VirtualBox VM(尽管我没有)不再跟进,因为我目前从未想过我需要两个显卡才能通过 IOMMU 在 VM 上使用 GPU)。
这是我已经尝试过但没有成功的方法:
- 使用标准内核而不是硬化内核。
- 启用设备驱动程序 >> IOMMU 硬件支持,AMD IOMMU 支持,使用 DMA 重新映射设备支持 Intel IOMMU,支持中断重新映射和总线选项(PCI 等)>> PCI 存根。
- 使用最新的内核,目前刚刚升级到4.4.8-hardened-r1。
这是我用来启动内核的命令行,为了方便起见,每个参数都位于单独的行上:
root=/dev/ram0
crypt_root=/dev/disk/by-uuid/c1ce6456-4c6a-4a64-8027-5ec4fdc0f344
dolvm
real_root=/dev/mapper/cryptgentoo-raiz
rootfstype=jfs
real_init=/sbin/init
root_keydev=/dev/disk/by-partuuid/086194de-e476-4abb-82da-9744e6fb0257
root_key=luks-key.gpg
keymap=la
amd_iommu=on
iommu=on
我还缺少内核配置选项吗?
更新:由于心不在焉,我错误地发出了ps -ef | grep -i iommu
,看看我刚刚发现了什么......
rockshooter ~ # ps -ef | grep iommu
root 66 2 0 02:57 ? 00:00:00 [amd_iommu_v2]
如果我看到一个内核线程,我想我可能有机会让 IOMMU 运行,只是我的内核没有对此做任何说明。这只是一个疯狂的猜测......但我将继续尝试使用它。
答案1
IOMMU 主要选项
尝试Device Drivers >> IOMMU Hardware Support
:
AMD IOMMU
然后启用AMD IOMMU support
.
DMA 重新映射
使能够Support for Intel IOMMU using DMA Remapping Devices
可选:IRQ 重新映射
使能够Support for Interrupt Remapping
可选:启用版本 2 支持
AMD IOMMU Version 2 driver
PCI选项
Bus options (PCI etc.) >> PCI Stub
切勿使用grep
配置文件,始终使用menuconfig
和/
键来搜索所需的选项。您链接的指南存在三个问题:
- 它是为 Fedora/Redhat 用户量身定制的。
- 由于#1,内核版本不同,因此选项位于不同的位置。
- Gentoo 的内核比指南中使用的内核新。
更新
我的主板太旧,无法支持 PCI 直通,但我想让您看到这些选项现在已正确启用。使用我指示您使用的确切选项:
IOMMU 主要选项
AGP: Checking aperture...
[ 0.000000] AGP: No AGP bridge found
[ 0.000000] AGP: Node 0: aperture [bus addr 0xc4000000-0xc5ffffff] (32MB)
[ 0.000000] Aperture pointing to e820 RAM. Ignoring.
[ 0.000000] AGP: Your BIOS doesn't leave an aperture memory hole
[ 0.000000] AGP: Please enable the IOMMU option in the BIOS setup
[ 0.000000] AGP: This costs you 64MB of RAM
[ 0.000000] AGP: Mapping aperture over RAM [mem 0xc4000000-0xc7ffffff] (65536KB)
...
[ 0.959270] PCI-DMA: Disabling AGP.
[ 0.959337] PCI-DMA: aperture base @ c4000000 size 65536 KB
[ 0.959338] PCI-DMA: using GART IOMMU.
[ 0.959340] PCI-DMA: Reserving 64MB of IOMMU area in the AGP aperture
...
[ 1.375277] AMD IOMMUv2 driver by Joerg Roedel <[email protected]>
[ 1.375277] AMD IOMMUv2 functionality not available on this system
答案2
经过一番哀嚎、抱怨和摇头之后,我终于明白是怎么回事了。
事实证明,IOMMU 一直在工作,只是内核日志没有显示它。ps -ef
但 IOMMU 驱动程序在那里,它正在工作,当我错误地输入而不是dmesg
这样时,我偶然发现:
rockshooter ~ # ps -ef | grep -i iommu
root 66 2 0 04:19 ? 00:00:00 [amd_iommu_v2]
当我看到内核线程运行时,我想,也许我的 IOMMU 确实在工作?因此,我执行了与之前在 Debian 上执行的相同配置步骤,一小时后,你瞧,我在连接到显卡的虚拟机上玩一些游戏。
请保存此线程以供将来参考,因为我花了 3 周的时间才弄清楚这一点。我仍然给了另一位发帖者一些当之无愧的 +50 声誉,因为他费尽心思设置和测试这个问题。