记一次 AMD 虚拟化 IOMMU 开启过程

起因

开始是这样的,需要做一些虚拟化的工作,发现需要开启IOMMU开启网卡直通,过程也是很曲折。

过程阶段一 失败

通过网上的教程,参考文章如下:https://www.jianshu.com/p/035287ba9acb (写得比较好的一篇,但漏掉了AMD CPU的相关信息)

# vim /etc/default/grub

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet amd_iommu=on"
GRUB_DISABLE_RECOVERY="true"

开启了第一遍,开机重启好几次,终于在BIOS中打开了对应的选项,遂启动。

然后开机过程中报错:ATA1.00: revalidation failed 而且还执行了100多秒,重复如此几次,最后还是报错进入紧急恢复模式。

然后放弃,此时凌晨3点,无解。

过程阶段二 失败

几天后,还是开始尝试阶段一的方案,这中间不断重启了N次,期间还经历了两次由于硬盘温度过高导致的自动关机。

然后就拆下硬盘用风扇吹,最后突然发现日志最后提示的是硬盘未找到,简单说就是硬盘没有被识别到。

于是在只保留一块系统硬盘的情形下开机了,此时直接无视阶段一的100s,等就是了。于是真的进入到了系统。

执行如下命令,可以看到结果实际上是成功了。

[root@vm ~]# dmesg | grep -E "DMAR|IOMMU"
[    1.726112] pci 0000:00:00.2: AMD-Vi: IOMMU performance counters supported
[    1.728781] pci 0000:00:00.2: AMD-Vi: Found IOMMU cap 0x40
[    1.729335] perf/amd_iommu: Detected AMD IOMMU #0 (2 banks, 4 counters/bank).

于是去掉/etc/fstab中对应的磁盘挂载信息

只是在执行磁盘分区信息查看时,硬盘居然不见了,不见了,不见了

[root@vm ~]# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 232.9G  0 disk
├─sda4   8:4    0    11G  0 part [SWAP]
├─sda2   8:2    0   566M  0 part /boot
├─sda3   8:3    0 220.8G  0 part /
└─sda1   8:1    0   550M  0 part /boot/efi

然后我搜了 iommu 无法识别硬盘, IOMMU can find disk, centos iommu disk 等几个关键词

期间,我还发现了这样一篇内容,如:
https://unix.stackexchange.com/questions/469153/what-are-the-implication-of-iommu-soft

期间介绍了几个问题,于是我尝试了 iommu=soft 这个选项,最终结果还是悲剧的。

过程阶段三 成功

通过 iommu=soft 这个选项还是搜索到了一些内容,有一些官方内容,还有一些论坛的内容:

  1. https://forum.manjaro.org/t/iommu-soft-inside-etc-default-grub-for-gigabyte-970-gaming/26190/3
  2. https://forum.giga-byte.co.uk/index.php?topic=14802.msg105102#msg1051022
  3. https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF

期间有很多实时在在的内容,总得来说比国内的一些教程来好些,比如这里就看到了关键的参数:

amd_iommu=on iommu=pt

于是调整参数,加上这一段,重启系统,一切正常。

实际上在archlinux上的那片文章很早就看到了,也看到了iommu=pt相关的内容,只是没太注意,因为后面的一句话您同时需要设置iommu=pt,这将防止Linux试图接触(touching)无法直通的设备。这让我仍未这个参数实际上不是必须选项。

完整的步骤复盘

  1. 修改/etc/default/grub, 调整GRUB_CMDLINE_LINUX内容,比如我这里的
    GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet amd_iommu=on iommu=pt"
  2. 执行启动选项重新生成的逻辑
    # 如果服务器时UEFI启动
    grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
    # 普通模式启动
    grub2-mkconfig -o /boot/grub2/grub.cfg
  3. 在BIOS中开启IOMMU选项,如果网卡有对应的虚拟化选项记得同步开启
  4. 查看状态: dmesg | grep -E "DMAR|IOMMU"

总结

太困了,看文章太快,不仔细。

注:该内容仅对AMD系列CPU的虚拟化有参考意义,如果是Intel系列请主动忽略

3条评论在“记一次 AMD 虚拟化 IOMMU 开启过程”

回复 宁波PDM   取消