可能有人有兴趣了解,如何知道是 deepin 的 grub-install 的 bug ?
在 deepin 中运行
sudo grub-install --debug
会显示它复制了哪些文件到 ESP 分区,以下是节选:
grub-install:信息: copying `/usr/lib/shim/shimx64.efi.signed' -> `/boot/efi/EFI/deepin/shimx64.efi'.
grub-install:信息: copying `/usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed' -> `/boot/efi/EFI/deepin/grubx64.efi'.
grub-install:信息: copying `/usr/lib/shim/mmx64.efi.signed' -> `/boot/efi/EFI/deepin/mmx64.efi'.
grub-install:信息: copying `/usr/lib/shim/fbx64.efi.signed' -> `/boot/efi/EFI/deepin/fbx64.efi'.
grub-install:信息: copying `/usr/lib/shim/BOOTX64.CSV' -> `/boot/efi/EFI/deepin/BOOTX64.CSV'.
grub-install:信息: copying `/boot/grub/x86_64-efi/load.cfg' -> `/boot/efi/EFI/deepin/grub.cfg'.
grub-install:信息: Registering with EFI: distributor = `deepin', path = `\EFI\deepin\shimx64.efi', ESP at hostdisk//dev/sda,gpt1.
可见并没有复制 /boot/efi/EFI/deepin/grub.efi 和 /boot/efi/EFI/UOS/grub.cfg 文件。
你也可以将 ESP 分区上的文件都删掉(最好先备份)或改名,然后执行 grub-install 来确认它生成了哪些文件。
怎么知道引导过程需要 /EFI/deepin/grub.efi 文件?
其一,如果没有这个文件,BIOS 引导时会报错,说找不到 grub.efi 文件。不过错误信息很快闪过,可能看不清。
其二,可以用 strings 命令(属于包 binutils)查看 /boot/efi/EFI/deepin/shimx64.efi 中的字符串:
strings /boot/efi/EFI/deepin/shimx64.efi | grep .efi
你可以看到里面有 “grub.efi”字样,但没有 “grubx64.efi”字样,这就说明它需要的是 grub.efi 而不是 grubx64.efi 。
怎么知道引导过程需要 /EFI/UOS/grub.cfg ?
其一,可以用 strings 命令查看 /boot/efi/EFI/deepin/grubx64.efi 中的字符串:
strings /boot/efi/EFI/deepin/grubx64.efi | grep EFI/
发现有 “/EFI/UOS”字样。不过,这还不能 100% 说明问题。
其二,有 /EFI/deepin/grub.efi 文件,但没有 /EFI/UOS/grub.cfg 文件时,启动机器会进入 grub shell ,这时查看环境变量 prefix 的值:
echo $prefix
会显示 “/EFI/UOS”,这就确认了,因为 grub 一般是加载 $prefix/grub.cfg 这个配置文件的。


中文 


deepin 20.2.2 社区版的 grub-install 工具对于 EFI 引导的机器有个严重的 bug ,使用它安装 EFI grub 可能会造成 deepin 系统无法引导。这个问题可能在 20.2.1 或更早的版本已经存在,不过我没有去确认。
deepin 20.2.2 的 EFI 引导过程大致是这样的:BIOS 加载 ESP 分区上的 /EFI/deepin/shimx64.efi 文件,/EFI/deepin/shimx64.efi 再加载 /EFI/deepin/grub.efi , /EFI/deepin/grub.efi 再执行 /EFI/UOS/grub.cfg 。(至于为啥是 UOS ,可能是需要用它的数字签名的 grub.efi 。更早的 deepin 版本还用过 /EFI/ubuntu/grub.cfg 。)
而 deepin 20.2.2 的 grub-install 工具只在 ESP 分区的 /EFI/deepin/ 目录安装了以下文件:
BOOTX64.CSV fbx64.efi grub.cfg grubx64.efi mmx64.efi shimx64.efi
可见,缺失了 /EFI/deepin/grub.efi 和 /EFI/UOS/grub.cfg 这两个文件,这造成了 deepin 系统无法启动。
修正的方法是,将 ESP 分区上的 /EFI/deepin/grubx64.efi 复制为 /EFI/deepin/grub.efi,将 /EFI/deepin/grub.cfg 复制为 /EFI/UOS/grub.cfg 。
如果你有双系统,或者 live cd/live usb 系统,可以用另一个系统引导,然后做上述修正。windows 中可以用 disk genius 修改 ESP 分区的文件。
如果只有单系统,也有办法挽救,只要你的 BIOS 支持选择任意 EFI 文件来启动。开机,进入 BIOS 的多重引导选择界面(不同BIOS品牌方法不一,例如我的机器是按 F9),选择“选择EFI文件”,然后找到上述 /EFI/deepin/grubx64.efi 文件,确认启动,这时会出现 "grub>" 提示符,进入了 grub shell 。接着,输入命令 " configfile /EFI/deepin/grub.cfg " ,回车,应该就可以进入 deepin 系统了。
进入 deepin 系统后,ESP 分区默认挂载到 /boot/efi 目录下。如果没有,就从命令行挂载一下。然后去复制 /boot/efi/EFI/deepin/grub.efi 和 /boot/efi/EFI/UOS/grub.cfg 文件即可(可能需要sudo)。