起因

brokenmemory

如图所示,我的硬盘出现了故障。

开机后系统报错提示 3F0:Operating System Not Found,显然是启动盘已经损坏。进一步检查后确认,一块 SSD 硬盘损坏,导致无法引导系统。

值得幸运的是,我的 Arch Linux 系统本身并不在这块硬盘上。但遗憾的是,GRUB 引导程序是安装在这块出问题的硬盘上的。更换硬盘后,虽然系统数据仍在,但失去了引导项,自然也就无法启动 Arch Linux。

修复思路

本质上,这是一个典型的引导损坏问题。解决方法是通过 Live 系统重新安装 GRUB,并生成引导配置。

以下是完整的修复过程,包含了很多网上教程略过的细节,尤其是涉及 btrfs 文件系统的挂载方式。


修复步骤

1. 进入 Arch Linux Live 环境

使用 Arch Linux 安装镜像制作启动 U 盘,进入 Live 系统。

2. 挂载原系统分区

我的 Arch Linux 安装在 btrfs 文件系统中,因此挂载方式与 ext4 略有不同:

mount -t btrfs -o subvol=@ /dev/nvme1n1p3 /mnt   # 挂载根子卷(@ 为子卷名)
mount /dev/nvme0n1p1 /mnt/boot                  # 挂载 boot 分区

确保 /mnt/mnt/boot 分别挂载到系统根目录和引导分区。

3. 切换到原系统环境

使用 arch-chroot 切换到已挂载的系统环境:

arch-chroot /mnt

此时已获得对原系统的完全控制权限。

4. 重装 GRUB 引导程序

执行以下命令将 GRUB 安装到 EFI 分区:

grub-install --target=x86_64-efi --efi-directory-id=ARCH

5. 安装微码与内核镜像(关键步骤)

很多教程忽略了这一点:如果是全新硬盘或曾经清理过 /boot,需要重新安装微码和内核镜像:

pacman -S intel-ucode
pacman -S linux
建议使用 iPhone 或其他智能手机通过 USB 开启热点,使系统在 Live 环境下能够联网,避免手动配置网络。

6. 生成 GRUB 配置文件

grub-mkconfig -o /boot/grub/grub.cfg

生成日志中应能看到已检测到内核镜像文件。

此时如果系统存在双系统(如 Windows 安装在另一块硬盘上),但未被识别,不用担心,等会重复生成 GRUB 配置即可。


处理 Windows 启动项未识别问题

首次生成 GRUB 配置时,如未识别 Windows 启动项,可在图形界面环境下重新生成一次:

  1. 确保 /boot/boot/efi 正确挂载;
  2. 再次执行:
sudo grub-mkconfig -o /boot/grub/grub.cfg

这里我是没有找到 Windows 的,因为我的 Windows 装在另一块硬盘上,没有检测到,我们通过引导程序进入 Linux 图形化界面之后再引导一遍即可。当然需要先将已经挂载的盘符解除挂载 umount 再重启。

为了再次引导并且能够找到 Windows 启动程序,我们需要再次把 boot 分区挂载到/mnt/efi,再执行,结果如下。再重启就可以看到熟悉的 grub 引导界面了,可以成功引导进入 Arch Linux 和 Windows。
image.png

此时应能识别到 Windows 启动项,重启后即可在 GRUB 界面中看到熟悉的双系统启动菜单。

经验总结

我之前对于挂载 mount 其实一直不太理解,现在学了操作系统的文件系统的设计和实现之后,然后现在又操作了一波,mount 就是把某个盘符,挂载到某个目录下,我们通过被挂载的目录可以直接访问被挂载的目录。

Arch Linux 出意外了可以通过一块 Arch Linux 启动盘,通过挂载系统盘再 arch-chroot,获取到对 Arch Linux 的控制权。