我有一个使用 lvm 的 arch linux 设置,多年来一直更新良好,直到两周前。两周前更新时,我对根卷的旧快照运行了 lvremove,命令挂起了。我关闭了机器,从那以后它就无法启动了。我刚刚通过实时 USB 启动,试图弄清楚发生了什么,我的 fdisk -l 输出显示 /dev/nvme0n1(这是我唯一的驱动器)带有分区 p1 p2 p3,p1 是我的 efi 分区,p2 是我的启动分区,p3 是我的 lvm 分区。
因此,我在启动实时 USB 时执行以下操作来挂载和 chroot 到我的系统:
vgchange -ay
mount /dev/vg0/lv_root /mnt
mount /dev/nvme0n1p2 /mnt/boot
mount /dev/nvme0n1p1 /mnt/boot/efi
mount /dev/vg0/lv_home /mnt/home
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt /bin/bash
那里的一切看起来都很“正常”(就像我的主页上的所有文件一样,基本上就像我正常启动一样)。由于我不知道为什么它无法启动,我尝试通过重新安装 grub,grub-install --target=x86_64-efi --bootloader-id=grub_uefi --recheck
但此命令抱怨错误:
“此系统不支持 EFI 变量 此系统不支持 EFI 变量 grub-install:错误:efibootmgr 无法注册启动项:没有此文件或目录”
(是的,第一个错误消息出现了两次)。首先,运行 grub-install 感觉就像是一种“猜测和检查”方法(但我不知道还能尝试什么)...其次,当我在 Google 上搜索此错误时,大多数结果都表明我可能已在传统模式下启动,但如果我运行,我会看到值为 64 cat /sys/firmware/efi/fw_platform_size
,所以我知道情况并非如此(当我启动到实时媒体时,括号中还显示 UEFI),所以我不明白为什么我似乎无法使用 grub-install(我不确定这是否会解决问题,但值得一试,因为我不知道还能检查什么)
编辑 1:发现此线程EFI 变量在此系统上不受支持,并通过传递标志让 grub-install 运行--no-nvram
,然后执行grub-mkconfig -o /boot/grub/grub.cfg
(没有注意到之前生成的 grub.cfg 中存在很大差异)。不幸的是,仍然无法启动,当我尝试从驱动器启动时,它直接返回到 bios 菜单,我不确定如何查看“错误”以了解发生了什么。
编辑 2:根据下面@grawity 的回答,我添加了我的挂载命令 mount -t efivarfs efivarfs /mnt/sys/firmware/efi/efivars
,然后我使用了arch-chroot /mnt
而不是chroot /mnt /bin/bash
- 这次运行时grub-install --target=x86_64-efi --bootloader-id=grub_uefi --recheck
它成功了!我接着grub-mkconfig -o /boot/grub/grub.cfg
运行,然后efibootmgr -v
我看到我的第一个启动顺序指向grub_uefi HD(1,GPT,some_guid)\EFI\grub_uefi\grubx64.efi
了正确的位置。然后我确实exit; umount -R /mnt; shutdown now
移除了 USB 并能够重新启动到我的系统!
我很好奇,当我的电脑卡在“lvremove”时,我粗暴地关闭了电脑,怎么会把电脑搞砸呢……不过,我很高兴电脑能再次正常工作
您忘记在 /sys/firmware/efi/efivars 进行挂载
efivarfs
。arch-chroot
在 chrooting 之前手动使用或者挂载它。这很可能是“旧式启动”选项(即运行该驱动器的 MBR 的选项)。当调用 Grub-install 安装 EFI 引导加载程序时,它不会安装旧式 MBR。
或者,如果启动选项以“UEFI:”为前缀,则它将运行该
bootx64.efi
文件 - grub-install 默认不会安装该文件。(您需要使用该选项--removable
在该“默认”位置获取 GRUB 的副本。)无论哪种方式,如果您没有专用的启动项并使用“启动整个磁盘”选项,那么您将启动几年前遗留下来的东西,而不是全新的 GRUB 安装。