惚兮恍兮其中有象

更新于
使用 Live CD 修复 debian grub 引导

孔德之容,唯道是从。道之为物,唯恍唯忽。 忽兮恍兮,其中有象;恍兮忽兮,其中有物。 窈兮冥兮,其中有精,其精甚真,其中有信。 自古及今,其名不去,以阅众甫,吾何以知众甫之然哉。以此。

使用 Live CD 修复 debian grub 引导。

错误操作导致找不到引导项

看到几次 debian 的软件商店提示有一个 Secure Boot dbx 的更新,但是点击更新又提示失败。于是搜了一下:

大概是这样的,看起来是和装了 Windows 双系统有关 : 来源

Screenshot

搜到这一串命令:

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

首先下载 镜像,然后制作 U盘 安装介质

# 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

重启,能正常进到系统了。