记一次修复 GRUB 启动加载器

本文最后更新于:2022年5月23日 上午

背景

双系统的便利之处在于,可以使用 Linux 作为主力系统,而又随时可以使用 Windows 下的 AutoCAD、CATIA 等专业软件。不便之处在于,对一个系统的修改可能潜藏着对另一个系统的破坏。

之前将笔电的 bios 升级到了 2.07,解决了困扰已久的Linux 下无法挂起问题。这也同时为 Windows 系统开启了 BitLocker 功能。虽然可以提供更好的数据安全保护,但也使得 Linux 系统无法访问硬盘上 Windows 分区的数据。在安全性(Windows 作为备用操作系统,敏感数据几乎没有)和便捷性间权衡,将 BitLocker 功能手动关闭了。

GRUB

问题与解决

然而,再一次重启电脑进入 Arch Linux 时,却只有 GRUB 的报错:

1
2
error: unknown filesystem
Entering rescue mode...

GRUB 进入了 rescue 模式,需要将配置改正才能正常启动。

修复与启动

1
2
3
4
5
6
grub rescue> ls #列出所有磁盘分区
(hd0) (hd0,gpt1) (hd1) (hd1,gpt6) (hd1,gpt5) (hd1,gpt4) (hd1,gpt3) (hd1,gpt2) (hd1,gpt1)
grub rescue> set #查看当前设置
cmdpath=(hd1,gpt1)/EFI/arch
prefix=(hd1,gpt5)/boot/grub
root=hd1,gpt5

可以看到用来安装操作系统的 hd1 盘有 6 个分区,而此时设置为 Linux 根目录挂载点在第 5 个分区。根据记忆,根目录应该在最后一个分区。尝试调整 GRUB 设置:

1
2
3
4
5
6
7
grub rescue> set prefix=(hd1,gpt6)/boot/grub
grub rescue> set root=hd1,gpt6
# 使设置生效
grub rescue> insmod normal
# 这次没有报错,设置正确了
# 进入 GRUB 普通模式
grub rescue> normal

此时就出现了熟悉的 GRUB 启动项选择菜单,可以正常启动 Arch Linux 了。

重新安装 GRUB

经几番尝试,其他方式均告失败,只有进入 Arch Linux 系统后运行 grub-install,才成功彻底修复了上述问题。

1
2
3
# nvme0n1 是本机 Linux 安装所在硬盘设备,注意根据个人情况替换
sudo grub-install /dev/nvme0n1
sudo grub-mkconfig -o /boot/grub/grub.cfg

问题原因

完成修复后,打开「磁盘」功能查看磁盘分区,发现了问题所在:

磁盘分区情况

对于安装 Windows 和 Linux 系统盘的这块 512 GB 三星硬盘,分区 3 为 Windows 的系统盘,分区 5 为 Linux Swap,分区 6 为 Linux 根目录挂载点。而新增的分区 4 是此次 Windows 创建的恢复环境,导致原本处于第 5 分区的 Linux 根目录挂载点变成了第 6 个分区。

添加 Windows 启动项

由于 Windows 10 使用 NTFS 文件系统,首先需要安装 NTFS-3G 以使 Arch Linux 能够识别其分区:

1
sudo pacman -S ntfs-3g

然后安装 os-prober 这个工具来探测其他操作系统:

1
sudo pacman -S os-prober

检查 /etc/default/grub 中关于 os-prober 的配置,该配置项默认为被注释状态,取消注释,(如没有该行就在文件末尾添加),变成如下状态即可:

1
2
3
$ sudo vim /etc/default/grub
...
GRUB_DISABLE_OS_PROBER=false

确保挂载包含 Windows 的分区,再次运行 grub-mkconfig:

1
2
3
4
5
6
7
8
9
10
11
$ sudo grub-mkconfig -o /boot/grub/grub.cfg

正在生成 grub 配置文件 ...
找到 Linux 镜像:/boot/vmlinuz-linux-lts
找到 initrd 镜像:/boot/amd-ucode.img /boot/initramfs-linux-lts.img
Found fallback initrd image(s) in /boot: amd-ucode.img initramfs-linux-lts-fallback.img
警告: os-prober will be executed to detect other bootable partitions.
Its output will be used to detect bootable binaries on them and create new boot entries.
找到 Windows Boot Manager 位于 /dev/nvme0n1p1@/EFI/Microsoft/Boot/bootmgfw.efi
Adding boot menu entry for UEFI Firmware Settings ...
完成

由输出提示可以看到,os-prober 正常工作并探测出了 Windows 启动项,下一次启动时即可看到 Windows 选项了。

GRUB 美化

GRUB 支持替换背景图片等自定义外观样式。事实上,在 GNOME-LOOKpling上收录了许多 GRUB 美化主题,可以根据喜好下载。此处选择了 vimix 这个主题。

vimix

根据 README 提示运行安装脚本即可,在此不作赘述。

参考资料

Arch Linux Wiki - GRUB

grub error: unknown filesystem的解决办法 - Linux公社

碎碎念

使用 Linux 的过程是不断折腾的过程,似乎每隔三五天就需要一小修,每三五月一大修。而我非常享受这个「发现问题 - 解决问题 - 记录学习」的过程,对现代操作系统和许多其他计算机编程知识有了更多更 “实用” 的了解。

一年多的 Ubuntu 使用经验,让我对 Linux 有了非常粗浅的认知,理解了一些概念、熟悉了一些命令。切换到 Arch Linux 后,立即被其部分优秀特性吸引(这正是 Arch Linux 用户们津津乐道的):滚动构建而使所有软件版本保持最新、Wiki 文档详细全面汉化程度高、虽然没有了许多软件的官方支持,但 AUR 强大全面更新快……在 Ubuntu 22.04 上问题频发的 GNOME 42 (Wayland) 也终于在 Arch 上有了应有的惊艳表现。


记一次修复 GRUB 启动加载器
https://muzing.top/posts/c1455a44/
作者
Muzing
发布于
2022年5月21日
更新于
2022年5月23日
许可协议