起因
开始是这样的,需要做一些虚拟化的工作,发现需要开启IOMMU开启网卡直通,过程也是很曲折。
过程阶段一 失败
通过网上的教程,参考文章如下:https://www.jianshu.com/p/035287ba9acb (写得比较好的一篇,但漏掉了AMD CPU的相关信息)
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,等就是了。于是真的进入到了系统。
执行如下命令,可以看到结果实际上是成功了。
[ 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中对应的磁盘挂载信息
只是在执行磁盘分区信息查看时,硬盘居然不见了,不见了,不见了
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
这个选项还是搜索到了一些内容,有一些官方内容,还有一些论坛的内容:
- https://forum.manjaro.org/t/iommu-soft-inside-etc-default-grub-for-gigabyte-970-gaming/26190/3
- https://forum.giga-byte.co.uk/index.php?topic=14802.msg105102#msg1051022
- https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF
期间有很多实时在在的内容,总得来说比国内的一些教程来好些,比如这里就看到了关键的参数:
amd_iommu=on iommu=pt
于是调整参数,加上这一段,重启系统,一切正常。
实际上在archlinux上的那片文章很早就看到了,也看到了iommu=pt
相关的内容,只是没太注意,因为后面的一句话您同时需要设置iommu=pt,这将防止Linux试图接触(touching)无法直通的设备
。这让我仍未这个参数实际上不是必须选项。
完整的步骤复盘
- 修改/etc/default/grub, 调整GRUB_CMDLINE_LINUX内容,比如我这里的
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet amd_iommu=on iommu=pt"
- 执行启动选项重新生成的逻辑
# 如果服务器时UEFI启动
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
# 普通模式启动
grub2-mkconfig -o /boot/grub2/grub.cfg - 在BIOS中开启IOMMU选项,如果网卡有对应的虚拟化选项记得同步开启
- 查看状态:
dmesg | grep -E "DMAR|IOMMU"
总结
太困了,看文章太快,不仔细。
注:该内容仅对AMD系列CPU的虚拟化有参考意义,如果是Intel系列请主动忽略
虚拟化不专业完全搞不定的
是的呢,我后来还是放弃了