我通过 USB 安装了全新的 Ubuntu。当我启动 PC 时,它直接带我进入 GNU Grub,当我选择 Ubuntu 时,我收到以下消息。
[Firmware Bug]: AMD-Vi: IOAPIC[0] not in IVRS table
[Firmware Bug]: AMD-Vi: No southbridge IOAPIC found in IVRS table
AMD-Vi: Disabling interrupt remapping
我可以通过“Ubuntu 高级选项”>“Ubuntu,Linux 4.2.0-30-generic(恢复模式)”>“恢复”进入 Ubuntu 桌面,但 CPU 运行速度接近 100% 并且不可持续。
电脑规格:
AMD A6-6400K
MSI A68HI Mini ITX F M2+ 主板
答案1
CPU 始终处于 100% 使用率的原因我认为这与您看到的消息不同。
关于错误信息
现在介绍AMD-Vi: IOAPIC[0] not in IVRS table
和AMD-Vi: No southbridge IOAPIC found in IVRS table
错误。这些消息意味着您的 CMOS/BIOS 设置已配置为启用IO管理单元但是 BIOS 缺少 IVRS 表,该表描述了 IOMMU 和 SMBus 控制器的地址。IVRS = I/O 虚拟化报告结构。另请参阅:http://support.amd.com/TechDocs/48882_IOMMU.pdf
什么是 IOMMU?
IO管理单元是目前 CPU 的一部分的硬件单元。它允许将设备可见的虚拟地址映射到物理地址。
为什么选择 IOMMU?
- IOMMU 可以提供更好的安全性并保护您的计算机免受某些可以访问 PCIe 和火线等总线的攻击。
- 您可以将物理 PCIe 设备公开给 VM(PCI 直通)。
- 它需要SR-IOV(VNF)
修复“AMD-Vi:IOAPIC[0] 不在 IVRS 表中”
- 更新主板固件
正确的修复应该来自主板的硬件制造商。因此,如果您的主板有 BIOS/固件更新,请安装它,因为这可能会解决问题。不幸的是,对于我的主板(华硕 Crosshair V Formula),即使在最新的 BIOS/固件更新(版本 1703,发布日期:2012 年 10 月 17 日)中,IVRS 也坏了。
- Linux 解决方法
如果 MB 制造商没有提供修复,您可以在 Linux 中通过在内核启动参数中使用ivrs_ioapic
选项指定这些设备所在的位置来修复此问题。
以下是操作步骤。有关详细信息,请参阅:https://ubuntuforums.org/showthread.php?t=2254677
amd_iommu_dump=1
通过添加内核选项来启动内核。您可以在启动过程中通过 grub 菜单执行此操作。
在内核日志中,你会看到类似这样的一些行:
$ dmesg |grep 'DEV_SPECIAL(IOAPIC\|not in IVRS table'
[ 0.133756] AMD-Vi: DEV_SPECIAL(IOAPIC[0]) devid: 00:14.0
[ 0.133995] AMD-Vi: DEV_SPECIAL(IOAPIC[255]) devid: 00:00.1
[ 0.134116] [Firmware Bug]: AMD-Vi: IOAPIC[5] not in IVRS table
[ 0.134235] [Firmware Bug]: AMD-Vi: IOAPIC[6] not in IVRS table
$
记下从 开始的索引IOAPIC
。在本例中,它们是5
和6
。请注意 devid,其中00:14.0
是可以的,00:00.1
是不正确的。
搜索这些设备的总线地址并记下地址(00:00.2
和00:14.0
)
$ lspci -nn | egrep "SMBus | IOMMU"
00:00.2 IOMMU [0806]: Advanced Micro Devices, Inc. [AMD/ATI] RD890S/RD990 I/O Memory Management Unit (IOMMU) [1002:5a23]
00:14.0 SMBus [0c05]: Advanced Micro Devices, Inc. [AMD/ATI] SBx00 SMBus Controller [1002:4385] (rev 42)
$
现在添加内核参数:ivrs_ioapic[5]=00:14.0 ivrs_ioapic[6]=00:00.2
其中 index5
和6
在 dmesg 输出中找到,值来自 lspci 输出。您可以通过编辑/etc/default/grub
文件然后运行来使其永久生效grub2-mkconfig -o /boot/grub2/grub.cfg
。
- 在 UEFI/BIOS 配置中禁用 IOMMU
禁用 IOMMU 可以带来一些性能上的好处。但为了系统的安全性和稳定性,禁用它是不可取的。某些虚拟化设置(PCI 直通、SR-IOV)需要 IOMMU,因此禁用它不是一个选项。
答案2
我更新了主板的固件,似乎已经解决了问题。