背景
过年这几天升级了一下家里的软路由 & 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 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 启动条目了。
这么做其实很折腾而且在我的系统上依旧不稳定,硬盘分区大小发生变化都会导致主板上的启动项丢失,需要重新添加。
结论 & 遗留问题
- 看起来这个问题在很多设备上都出现过,并非不常见,这么看来以后安装时应该默认安装到这个 fallback 路径下(
EFI/BOOT/BOOTX64.EFI
)才合理吧。 - 如果 UEFI 只认固定路径的 EFI 文件,那么在 UEFI Shell 里通过
bcfg
命令的方法,我不确定在其他设备上是否也成立; - bcfg 添加启动项的方法在我的微星主板上是一个不稳定的方法,更换硬盘,甚至调整分区大小后这个启动项都会消失,需要再次手动重新添加,因此还是少折腾,直接把 EFI 文件放在正确的位置吧。
- 你可千万不要像隔壁叔叔一样,大年初二还在修电脑.jpg
膜Andy佬 类似的问题在近几年惠普的笔电BIOS也稳定出现 一直以为是什么主板厂商和微软的py交易 原来是微软拿了个信息差)