解决 MSI 主板上安装 ArchLinux 时 UEFI 下 GRUB 启动项失效的问题

背景

过年这几天升级了一下家里的软路由 & NAS,从之前 ASRock 的 H81 MATX 主板换成了新的 MSI B460 TORPEDO,新主板是 ATX 有 2.5G 网口还有更多的 M.2 / PCI-E / SATA 口,做 All in one server 的扩展性已经足够了。

迁移系统的时候发现新买的十代 CPU (i5-10105T) 上面想用集显就必须用 UEFI 启动(不然会报错,说集显没有对应的 VBIOS 无法在 CSM 下启动)。不知道是不是我买了个 QS 散片的原因;但不管怎么样我必须要把之前的 ArchLinux BIOS/MBR 启动方式改为 UEFI/GPT 了

MBR 换成 GPT 我直接用的 DiskGenius 软件,想着按照 Arch Wiki 里面介绍 GRUB 安装 的说明一步一步走就可以了,没想到一直出错……就有了这篇文章。

问题

尝试按照 Arch Wiki 流程安装 GRUB,进入 Arch Installation Media,chroot 后运行下面的命令:

# grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=GRUB

提示安装成功。在安装环境下运行 efibootmgr 也可以看到确实成功添加了启动项,但是重启之后完全找不到启动项,主板 BIOS 页面甚至不允许添加这块硬盘作为启动设备,GRUB 的安装是失败的。

解法1

TL;DR

核心原因是 MSI 主板需要 EFI 文件在 EFI 的特定路径上。Arch 的 GRUB 会默认安装到 {ESP}/EFI/GRUB/grubx64.efi 上,但主板启动时希望的地方是 {ESP}/EFI/BOOT/BOOTx64.efi

因此根据 wiki 有两种办法:一个是安装时增加参数

# grub-install --target=x86_64-efi --efi-directory=esp --removable

另外也可以 grub-install 之后再把安装好的 efi 启动程序复制 / 移动到目标位置上

# mv esp/EFI/grub esp/EFI/BOOT
# mv esp/EFI/BOOT/grubx64.efi esp/EFI/BOOT/BOOTX64.EFI

这个问题在很多其他的设备上也存在,根据 Arch Wiki,看起来联想和部分 Thinkpad 的型号也有一样的问题

解法2(当时折腾的过程)

当时折腾的时候并没发现有这样的解法,而是绕了些弯路:进入 EFI Shell 手动去添加启动项。

当时的思路是在 Arch Media 里面 efibootmgr 宣称安装成功了,但重启后却失败,可能是因为 Arch Media 读写 UEFI 启动项位置 NVRAM 的过程是有问题的,所以得想办法换个方式写启动项。没什么思路,感觉只能靠 EFI Shell 了:

UEFI 方式启动的 Arch Installation Media

用 UEFI 启动 Arch Installation Media 的时候有一个选项是 UEFI Shell,进入之后可以看到类似下面的界面

直接敲 help 可以看到命令列表。这里输入 alias 命令可以看到 UEFI Shell 里找到的 EFI 分区(一般至少找到两个,有一个是安装镜像自带的)的 Mapping Table,根据对应的文字说明找到真正需要启动的分区 FS[n]: 假设是 FS1

首先的操作类似 DOS,先输入 FS1: 回车进入对应的分区

之后可以通过 cd ls 等命令看到自己的 EFI 文件,也可以间接检查自己是否进入了正确的分区。注意,在这里启动器安装好的 EFI 文件是可以直接运行的,运行对应的 .EFI 文件就进入安装好的启动器了。(手动进入 grubx64.efi 之后,我才确认 GRUB 的安装完全没问题,单纯是引导项的问题)

之后用 bcfg 命令(参见文档)确认启动项

Shell> bcfg boot dump -v 

添加启动项,EFI 文件的路径可以是相对或者绝对路径

Shell> bcfg boot add 1 FS0:\EFI\GRUB\grubx64.efi "GRUB"

到这里重启就发现确实成功添加了启动项,主板 BIOS 里也能看到刚才添加的 GRUB 启动条目了。

这么做其实很折腾而且在我的系统上依旧不稳定,硬盘分区大小发生变化都会导致主板上的启动项丢失,需要重新添加。

结论 & 遗留问题

  1. 看起来这个问题在很多设备上都出现过,并非不常见,这么看来以后安装时应该默认安装到这个 fallback 路径下(EFI/BOOT/BOOTX64.EFI)才合理吧。
  2. 如果 UEFI 只认固定路径的 EFI 文件,那么在 UEFI Shell 里通过 bcfg 命令的方法,我不确定在其他设备上是否也成立;
  3. bcfg 添加启动项的方法在我的微星主板上是一个不稳定的方法,更换硬盘,甚至调整分区大小后这个启动项都会消失,需要再次手动重新添加,因此还是少折腾,直接把 EFI 文件放在正确的位置吧。
  4. 你可千万不要像隔壁叔叔一样,大年初二还在修电脑.jpg

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注