云网牛站
所在位置:首页 > Linux教程 > 更新升级到deepin 20.2.2后重启就进入grub界面的解决

更新升级到deepin 20.2.2后重启就进入grub界面的解决

2021-07-01 09:27:47作者:lxychlu稿源:深度站

如果你在更新升级到深度操作系统deepin 20.2.2后重启就进入了grub界面,那就按以下方法解决。

更新升级到deepin 20.2.2后重启就进入grub界面的解决

 

解决方案

首先在上面的界面执行ls看一下目录,不同的电脑可能都不一下:

> ls

(hdo,gpt4) (hdo,gpt3) (hdo,gpt2) (hdo,gpt1) 

然后一个个试试ls (上面的目录)/boot/grub/, 一般对的那个会有grub.cfg文件,例如我的是在ls (hdo,gpt3)/boot/grub,找到这个(hdo,gpt3)之后:

set root=(hdo,gpt3)  # 上面找到的目录,下同

set prefix=(hdo,gpt3)/boot/grub/

insmod normal

normal

然后就可以进入deepin 20.2.2系统了,但是这只是进入系统,重启还是重新引导,最后在找到解决方法,如下:

cd /boot/efi/EFI

cp -r UOS UOS.bak

cp deepin/* UOS

注:想了解20.2.2版本的更新详情,请参考Deepin 20.2.2(深度系统20.2.2)发布下载,附新特性功能内容

 

附1:deepin 20.2.2的grub-install的bug以及EFI引导的修复

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

 

附2:更多参考

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来确认它生成了哪些文件。

2、怎么知道引导过程需要/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。

3、怎么知道引导过程需要/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后遇到不少问题和系统BUG,附网友评论

精选文章
热门文章