[Contribute Advice] deepin 20.2.2 的 grub-install 的 bug 以及 EFI 引导的修复
Tofloor
poster avatar
duanyao
deepin
2021-07-01 02:29
Author

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)。

 

Reply Favorite View the author
All Replies
1 / 2
To page
duanyao
deepin
2021-07-01 03:01
#1

可能有人有兴趣了解,如何知道是 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 这个配置文件的。

 

Reply View the author
走钢丝
deepin
2021-07-01 03:55
#2

666.学习一下。

Reply View the author
.Andy
deepin
2021-07-01 05:08
#3

这个修复方式比较简单. 

Reply View the author
忘记、过去
deepin
2021-07-01 06:51
#4

给大佬顶一下~

 

不过好像内测的时候升级 grub 没有这个问题来着,只更新了 grub.efi 而 grubx64.efi 没有升级......不知道正式推送的时候有啥问题......

Reply View the author
duanyao
deepin
2021-07-01 07:51
#5
忘记、过去

给大佬顶一下~

 

不过好像内测的时候升级 grub 没有这个问题来着,只更新了 grub.efi 而 grubx64.efi 没有升级......不知道正式推送的时候有啥问题......

正常升级的系统也可能不会遇到这个问题,因为可能有以前的版本残留的 grub.efi 和 grub.cfg,正好能用。但如果 ESP 分区炸了要修复 grub,就可能遇到这个问题。或者像我,安装完系统后,又转换了根分区的文件系统格式,然后修复 grub,也会遇到。

Reply View the author
jzc
deepin
2021-07-01 18:59
#6
Reply View the author
duanyao
deepin
2021-07-01 20:09
#7

忘了说一下,这个 grub-install 属于 grub2-common 包,当前版本是 2.04.1-17 ,apricot 仓库。

Reply View the author
liujy126
deepin
2021-07-01 20:50
#8

晕,完全看不懂

Reply View the author
duanyao
deepin
2021-07-01 21:21
#9
liujy126

晕,完全看不懂

实操就一句,第二段粗体。

其他的是为了讲清楚问题的根源,要看懂得了解一下 UEFI 和 grub 。

Reply View the author
veton
deepin
2021-07-02 06:11
#10

我测试不行,惠普战66

Reply View the author
veton
deepin
2021-07-02 06:28
#11

我还是进不了,我是双系统,一块ssd上deepin 和win10,从过启动选择win10还能进,但进deepin如下图,我在win10下使用easyUEFI看了,在UOS缺少grub.cfg,其他对的,按楼主操作,无效依然如下图,求大佬指导

Reply View the author
duanyao
deepin
2021-07-02 07:48
#12
veton

我还是进不了,我是双系统,一块ssd上deepin 和win10,从过启动选择win10还能进,但进deepin如下图,我在win10下使用easyUEFI看了,在UOS缺少grub.cfg,其他对的,按楼主操作,无效依然如下图,求大佬指导

从grub版本看,你这不是 deepin 20.2.2 ,是比较老的版本,或者是升级部分失败了?

先设法进deepin系统:在你的图中的界面上按 “c”,进入 grub shell 提示符 “grub>”,然后输入命令:

configfile (hd0,3)/boot/grub/grub.cfg

“3”就是deepin 系统所在的分区的编号,根据你的实际情况改。这样应该就能进系统了。如果不记得分区的编号,从1开始逐个试也可以。按向上箭头可以重复上个命令。

进了系统,运行

sudo grub-install --debug

如果没有报错,就按主贴修复。

 

P.S. 想详细了解如何使用 grub shell ,可以看这个:

https://www.linux.com/training-tutorials/how-rescue-non-booting-grub-2-linux/

 

Reply View the author
铁山老道孔乙己
deepin
2021-07-02 16:47
#13

看起来楼主对 grub 启动比较了解,请教个问题:

在 efi 分区,还有一个 Boot 文件夹,这个文件夹什么作用?里面的文件名看起来和 ubuntu、deepin 文件夹内的差不多。能不能删除?

Reply View the author
flyinke
deepin
2021-07-02 16:53
#14

多谢楼主,晚上回去试下,为了这问题折腾两天了

Reply View the author
houyawei
deepin
2021-07-02 18:13
#15

原来是这样

Reply View the author
duanyao
deepin
2021-07-02 19:09
#16
铁山老道孔乙己

看起来楼主对 grub 启动比较了解,请教个问题:

在 efi 分区,还有一个 Boot 文件夹,这个文件夹什么作用?里面的文件名看起来和 ubuntu、deepin 文件夹内的差不多。能不能删除?

如果你说的是 /EFI/Boot 目录,最好不要删除,它对 EFI 是有意义的:/EFI/Boot/bootx64.efi 是后备的启动文件,即如果 BIOS 中没有记载应该用哪个.efi 文件启动,就启动这个文件。但如果 BIOS 中已经记载了有效的启动项,它就没什么用了。

用 efibootmgr -v 命令可以查看启动项。

有 deepin、windows、ubuntu 三个启动项,这时 /EFI/Boot/bootx64.efi 没什么用。

Reply View the author
veton
deepin
2021-07-04 03:08
#17
duanyao

从grub版本看,你这不是 deepin 20.2.2 ,是比较老的版本,或者是升级部分失败了?

先设法进deepin系统:在你的图中的界面上按 “c”,进入 grub shell 提示符 “grub>”,然后输入命令:

configfile (hd0,3)/boot/grub/grub.cfg

“3”就是deepin 系统所在的分区的编号,根据你的实际情况改。这样应该就能进系统了。如果不记得分区的编号,从1开始逐个试也可以。按向上箭头可以重复上个命令。

进了系统,运行

sudo grub-install --debug

如果没有报错,就按主贴修复。

 

P.S. 想详细了解如何使用 grub shell ,可以看这个:

https://www.linux.com/training-tutorials/how-rescue-non-booting-grub-2-linux/

 

我确定我之前升级为20.2.2了,至于为何这样了我也不知道,反正最近一次更新失败重启后就这样了,目前我还是这样,用你说的办法也进不去,一个省级搞成这样……

Reply View the author
mark_deepin
deepin
2021-07-04 04:36
#18
veton

我确定我之前升级为20.2.2了,至于为何这样了我也不知道,反正最近一次更新失败重启后就这样了,目前我还是这样,用你说的办法也进不去,一个省级搞成这样……

问题多多,正在项目施工阶段,不是有备份就搞挂了,唉。。。

Reply View the author
veton
deepin
2021-07-06 02:46
#19
mark_deepin

问题多多,正在项目施工阶段,不是有备份就搞挂了,唉。。。

我是拿来做娱乐使用的,关键我把最近一年下的电影全部放deepin下了,现在win系统看不到linux的文件,就尴尬了~~

Reply View the author
duanyao
deepin
2021-07-06 23:51
#20
veton

我确定我之前升级为20.2.2了,至于为何这样了我也不知道,反正最近一次更新失败重启后就这样了,目前我还是这样,用你说的办法也进不去,一个省级搞成这样……

deepin 的分区编号是?

执行命令 configfile (hd0,3)/boot/grub/grub.cfg 后报什么错?

Reply View the author
1 / 2
To page