孔德之容,唯道是从。道之为物,唯恍唯忽。 忽兮恍兮,其中有象;恍兮忽兮,其中有物。 窈兮冥兮,其中有精,其精甚真,其中有信。 自古及今,其名不去,以阅众甫,吾何以知众甫之然哉。以此。
使用 Live CD 修复 debian grub 引导。
错误操作导致找不到引导项
看到几次 debian 的软件商店提示有一个 Secure Boot dbx 的更新,但是点击更新又提示失败。于是搜了一下:
大概是这样的,看起来是和装了 Windows 双系统有关 : 来源
搜到这一串命令:
sudo fwupdmgr refresh && sudo fwupdmgr get-updates
sudo fwupdmgr update
如此一来,还是报错:
Blocked executable in the ESP, ensure grub and shim are up to date
找到这一条,看到 别人提到 可以输入:fwupdmgr refresh --force 这边输入了,还是报错,于是 灵机一动 改成了 sudo fwupdmgr update --force 重启电脑,找不到 debian 的引导项了……
修复过程
参考这里:https://wiki.debian.org/GrubEFIReinstall
# cp debian.iso /dev/sdX
# sync
运行完之后,将 u盘插到有问题的电脑上:
- 首先检查是不是以 UEFI 模式启动,看了一下,
/sys/firmware/efi/efivars不为空,所以跳过这一步。 - 我自己的电脑并没有 boot 的分区,也没有 LUKS 加密的分区,所以这里使用文档上的 另一个例子:
将原来系统的根节点:( 即下面的 /dev/nvme1n1p2 )挂载到 /mnt/
将原来的 ESP 分区 挂载到 /mnt/boot/efi ,如果有多块硬盘,应该是第一块的分区,尝试过用一个新分区挂载不成功。
mount /dev/nvme1n1p2 /mnt/
mount /dev/nvme0n1p1 /mnt/boot/efi
如果挂载错了,可以卸载分区 umount -v /dev/nvme1n1p2
- 接下来这一步,直接按照文档的来,绑定挂载虚拟文件系统:
for i in /dev /dev/pts /proc /sys /sys/firmware/efi/efivars /run; do sudo mount -B $i /mnt$i; done
- 然后进入到损坏的系统,重新安装的 GRUB 到对应的盘(没有分区号),生成 GRUB 配置文件:
chroot /mnt
grub-install /dev/nvme0n1p
update-grub
重启电脑,就好了。
修复后续
安装成功后有了 debian 的引导,但是 grub 之后,检测磁盘出现一个错误提示,类似这种
dev/sda1: clean, 552599/6111232 files, 7119295/24414464 blocks
[TIME] Timed out waiting for device xxxx.device
这是由于修改了 ESP 分区,然后 uuid 发生改变,导致找不到磁盘。
首先输入 root 密码,然后运行 fdisk -l 找到 EFI 文件系统的设备号,比如:
Device Start End Sectors Size Type
/dev/nvme0n1p1 2048 206847 204800 100M EFI System
然后通过 ls -l /dev/disk/by-uuid 找到对应的 uuid
lrwxrwxrwx 1 root root 15 Jul 18 14:57 7E8A-087A -> ../../nvme0n1p1
然后编辑 vi /etc/fstab 将 EFI 改成对应的 uuid
UUID=7E8A-087A /boot/efi vfat umask=0077 0 1
重启,能正常进到系统了。