apt upgrade
后,再启动电脑变无法进入grub,记录一些遇到的问题
两个硬盘 sdb5: root(/) sdb6: boot(/boot) sda2: EFI (/boot/efi)
双系统 win8.1 + ubuntu18.06,UEFI启动
按照这篇博文的排查流程https://www.howtogeek.com/196740/how-to-fix-an-ubuntu-system-when-it-wont-boot/ 能否进入GRUB boot loader,我的不能便按照第二个文章进行GRUB安装。因为电脑直接显示Ubuntu Boot Failed [OK]然后直接进入Windows系统,没有进入紫色界面。
第二篇文章https://www.howtogeek.com/114884/how-to-repair-grub2-when-ubuntu-wont-boot/ 可使用boot-repair这个工具进行修复,或者使用命令行安装grub,这两个我都试了:
sudo apt-add-repository ppa:yannubuntu/boot-repair
sudo apt-get update
sudo apt-get install -y boot-repair
boot-repair
启动后直接点点就行,但是我在粘贴它提示的命令后,即卸载旧grub,但是它仍然提示旧grub2未卸载,提示说新开个terminal输入命令就行我估计是卸载了PE的grub,但是我也把挂载的boot中的grub重命名了,仍然未成功,此路终结。
把那三个分区全部按序挂载,然后输入文章的命令:
sudo grub-install --boot-directory=/mnt/ubuntu/boot /dev/sdX
我的系统在第二个磁盘即sdb
,输入sda
执行会提示跨硬盘安装
但是又报错:
root@ubuntu:/mnt/ubuntu/boot# sudo grub-install --boot-directory=/mnt/ubuntu/boot /dev/sdb
Installing for i386-pc platform.
grub-install: warning: this GPT partition label contains no BIOS Boot Partition; embedding won’t be possible.
grub-install: warning: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged…
grub-install: error: will not proceed with blocklists.
root@ubuntu:/mnt/ubuntu/boot# sudo grub-install --boot-directory=/mnt/ubuntu/boot /dev/sda
Installing for i386-pc platform.
grub-install: warning: this GPT partition label contains no BIOS Boot Partition; embedding won’t be possible.
grub-install: error: embedding is not possible, but this is required for cross-disk install.
上面说说GPT分区标签没有BIOS Boot 分区,什么意思呢?搜索一番都说是要开辟一个新分区,并给打上标记(bios_grub);
但是这个回答解释了更清楚,不是无脑创建分区:https://superuser.com/questions/903112/grub2-install-this-gpt-partition-label-contains-no-bios-boot-partition 【建议精读】
To install GRUB, you should first be sure that you’ve installed the correct GRUB package. I’m not sure of naming in all distributions, but in Ubuntu, it would be grub-pc for BIOS/CSM/legacy mode and grub-efi-amd64 for EFI/UEFI mode. An EFI-mode installation will also require booting whatever you’re using to install GRUB (a live CD/USB, presumably) in EFI mode. Doing this may require using your computer’s built-in boot manager, which is typically accessed via a function key, but the details vary from one computer to another.
说得很清楚,BIOS启动或lagacy用grub-pc,需要额外的分区;EFI/UEFI用 grub-efi-amd64,并且需要电脑内建的启动管理器,GRUB2 并不需要额外的分区,我再次核实了我是用UEFI启动,所以我不需要创建分区。
回过头来看,i386-pc一般指32位,GRUB中给BIOS使用,而x86_64-efi是64位,GURB中给UEFI使用,https://unix.stackexchange.com/questions/524622/what-is-the-relation-between-uefi-and-grub 和上面那个回答的引用对应:grub-pc for BIOS and grub-efi for EFI/UEFI
grub-install默认安装的是i386-pc
–target=TARGET
install GRUB for TARGET platform [default=i386-pc]; available targets: arm-efi, arm-uboot, arm64-efi, i386-coreboot, i386-efi,
i386-ieee1275, i386-multiboot, i386-pc, i386-qemu, i386-xen, ia64-efi, mips-arc, mips-qemu_mips, mipsel-arc, mipsel-loongson,
mipsel-qemu_mips, powerpc-ieee1275, sparc64-ieee1275, x86_64-efi, x86_64-xen
但是我指定--target=x86_64-efi
又说不存在/usr/lib/grub/x86_64-efi/modinfo.sh
USE的PE文件系统里确实没有这个,只有i386-pc,那怎么得来x86_64-efi呢? apt即可获得,同样有
root@ubuntu:~# apt search grub | grep bin
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
grub-coreboot-bin/bionic-security,bionic-updates 2.02-2ubuntu8.23 amd64
GRand Unified Bootloader, version 2 (Coreboot binaries)
grub-efi-amd64-bin/xenial-updates,bionic-security,bionic-updates,now 2.04-1ubuntu44.1.2 amd64 [installed,automatic]
grub-efi-ia32-bin/bionic-security,bionic-updates 2.02-2ubuntu8.23 amd64
GRand Unified Bootloader, version 2 (EFI-IA32 binaries)
grub-ieee1275-bin/bionic-security,bionic-updates 2.02-2ubuntu8.23 amd64
GRand Unified Bootloader, version 2 (Open Firmware binaries)
grub-pc-bin/bionic-security,bionic-updates 2.02-2ubuntu8.23 amd64
GRand Unified Bootloader, version 2 (PC/BIOS binaries)
grub-xen-bin/bionic-security,bionic-updates 2.02-2ubuntu8.23 amd64
GRand Unified Bootloader, version 2 (Xen binaries)
可以看到有grub-efi-amd64-bin,也有 grub-pc-bin,grub-install手册的–target描述的就是这些
mkdir grub-efi-amd64-bin
apt download grub-efi-amd64-bin # 得grub-efi-amd64-bin_2.04-1ubuntu44.1.2_amd64.deb
dpkg-deb -R grub-efi-amd64-bin_2.04-1ubuntu44.1.2_amd64.deb grub-efi-amd64-bin
这样就得到了x86_64-efi文件夹,里面都是一些mod文件,复制至cp grub-efi-amd64-bin/usr/lib/grub/x86_64-efi/ usr/lib/grub/ -r
于是再次安装
grub-install --target=x86_64-efi --boot-directory=/mnt/ubuntu/boot --boot-directory=/mnt/ubuntu/boot/efi
(注意我前面说了我root、boot、esp在不同的分区,已经提前按序挂载好),但是又提示说/mnt/ubuntu/boot/efi/EFI/xxx
无法写入,尝试往这个分区写文件,只有很小的配置文件才能写入,efi文件(1.6M大)写不进去,所以命令安装也失败了
Boot-Repair是个万能工具,但是我没卸载旧的grub成功,打算重新安装操作系统,旧的文件全会被清理掉(准备重新安装时我的前两种安装方式都是报红警告,即会清理用户文件,正常情况下只有第二个是红的,提示清理全盘文件。。。)
于是翻到之前DiskGenuine制作的另一个BootRepair备份镜像,老外把BootRepair专门做了个ISO便于启动恢复,就不用在PE上再安装BootRepair了,我之前做过并且备份了U盘镜像,最后一搏,U盘复制这个备份镜像进行恢复,叮,重新安装GRUB成功。
镜像地址:https://sourceforge.net/projects/boot-repair-cd/files/
以后得记得用这个了。
重新配置好后,reboot多次分别进入Ubuntu和windows,表现正常,但是grub启动列表中有多个EFI,如何去除不需要的?https://askubuntu.com/questions/823514/remove-useless-entries-from-messed-up-grub
grep -i EFI /etc/grub.d/*
一下发现EFI都在 /etc/grub.d/25_custom
配置,编辑,注释掉不需要的menuentry
,然后修改/etc/default/grub
中默认启动序号,用 grep menuentry /boot/grub/grub.cfg
来选定确定序号,submenu也算一个!
最后update-grub
即可,会生成文件/boot/grub/grub.cfg
这个文件是不能直接编辑的,是由/etc/grub.d/
下的配置文件组合生成,并且cfg文件中有相应注释解释menuentry来自哪个配置
在不同启动系统时,我在计算grubx64.efi md5时报了stdin error故障,所以我怀疑是grubx64.efi文件损坏导致不能进入grub,进而启动失败;
ESP分区不能写文件不知是挂载的原因,还是啥?mount -oremount,wr
也不管用吶
另一个异常现象是是grub/grub.cfg
文件内容的变化,正常启动时如下引用,异常时hd0,gpt3,但是并不明白这个含义,似乎和sda3是指一个东西
jimmy@ubuntu:/boot/efi/EFI$ cat grub/grub.cfg
search.fs_uuid fcbe35eb-89f4-4ac2-b799-5556e999d5ca root hd1,gpt6
set prefix=($root)‘/grub’
configfile $prefix/grub.cf
Boot/BOOTX64.EFI就是ubuntu/grubx64.efi
jimmy@ubuntu:/boot/efi/EFI$ md5sum */*.EFI */*.efi | sort
02b611e62d8a6ca3e730c468d88cf70f grub/shimx64.efi
4dc205f9b8b7c72708fb49706e2d83e9 grub/grubx64.efi
621356d82b109cd860ad92cdf241c58b Boot/BOOTX64.EFI # 重点
621356d82b109cd860ad92cdf241c58b ubuntu/grubx64.efi # 重点
958ceee3668f4eff01fb29d03518b49e Boot/bkpbootx64.efi
d41d8cd98f00b204e9800998ecf8427e Boot/fbx64.efi # 空文件
d41d8cd98f00b204e9800998ecf8427e ubuntu/mmx64.efi
d41d8cd98f00b204e9800998ecf8427e ubuntu/shimx64.efi # 安全启动时,用来启动GRUB
https://askubuntu.com/questions/342365/what-is-the-difference-between-grubx64-and-shimx64
虽然解决了问题,基本熟悉了一些概念,并未深入其中的概念与作用关系;计算机启动这一套流程不少,都已经是成文标准了。
基本达成目标,不重装系统。
元旦假,断断续续两天,干了个这。
jimmy@ubuntu:/boot/efi/EFI$ cat grub/grub.cfg
search.fs_uuid fcbe35eb-89f4-4ac2-b799-5556e999d5ca root hd1,gpt6
set prefix=($root)‘/grub’
configfile $prefix/grub.cfg
这次失败能进入grub但是,启动时报错:
系统都进不进去,敲什么systemctl
?于是尝试Advance使用以前的内核、紧急模式的内核,都不行,以前的内核会闪一下ubuntu的紫色界面然后直接持续黑屏,紧急模式居然是乱码的,按键都不管用。
于是,从下往上看,蓝牙启动失败?那就启动时不要启动蓝牙了,采用了很多方式:
https://askubuntu.com/questions/67758/how-can-i-deactivate-bluetooth-on-system-startup
均不管用!
接着往上看,是不是什么Couldn't get size
造成的? 网上又说是修改fstab造成的,我在能关机前真的通过软件修改过,为了自动挂载windows下的分区,于是进入boot-repair 恢复fstab文件,当然也无效的
再往上这个错误呢?
有说是因为显卡驱动造成的,于是grub boot参数加 nouveau.blacklist=1
不管用
又进入PE,chroot
到sdb5,看看system log(/var/log/syslog、 /var/log/kernerl.log、dmesg)都停在了最后的正常关机时间,通过find 找修改的文件时间也没有线索;
可以在grub启动参数移除quiet splash
来看详细启动日志,日志滚得太快,还得录视频
可是后来启动启动着,这个日志又没了,于是通过grub自行加载内核,在此时才知道原来grub就是一个基础版的Linux:
grub> boot
error: you need to load the kernel first.
# 注意linux命令后面的root不能是(hd1,gpt5) 因为这个目录是grub系统下的一个目录
grub> linux (hd1,gpt6)/vmlinuz-4.15.0-202-generic root=/dev/sdb5
grub> initrd (hd1,gpt6)/initrd.img-4.15.0-202-generic
grub> boot
能看到启动日志,很明显能看到可以进入系统,systemd启动一些服务,好多失败,因为后面的hostname服务启动失败了
同时学习到grub启动页面进行edit(按e),各选项主要也都是上面的grub命令构成。
搜这句或说是Linux 5.10 引入的bug,可是我这4.15为什么也会错呢,算了,既然说是内核的bug那就重装吧… https://lists.ubuntu.com/archives/foundations-bugs/2021-June/453636.html
我基本都是双系统下遇到问题,于是有如下总结
apt upgrade
, 升级你需要升级的包就行; uname -r
其他软件包管理更新参见:when I use a new host.