grub 突然坏了,开机直接进到 bios 的引导修复页面,不知道是强制关机的原因还是啥,幸好还有保留 arch 的u盘系统。

重新挂载

u盘启动到系统,重新挂载根目录和 /boot 目录,因为是 btrfs,所以命令有点不一样:

mount -t btrfs -o subvol=/@,compress=zstd /dev/nvmen0p3 /mnt

mount /dev/nvmen0p1 /boot/efi
## 因为之前是创建了 /boot/efi 的目录,所以这个不是直接挂载 /boot,之前装得有点不太一样。

chroot 以及执行 grub

arch-chroot /mnt

grub-install —target=x86_64-efi —efi-directory=/boot --bootloader-id=ARCH
# 这个命令的意思是将 grub 的主目录设置在 /boot/grub,并且在启动管理器创建一个名为 ARCH 的条目。
# 可以通过命令: efibootmgr -uv 查看创建的条目,这里应该已经有了。

grub-mkconfig -o /boot/grub/grub.cfg
# 重新生成grub配置文件

重新生成 fstab 文件

如果你的 fstab 文件和之前有出入,现在就可以重新生成了,如果没有就不用了。

# 先退出 chroot
exit

# 挂载上 swap 和 home 目录
swapon /dev/nvmen0p2
mount -t btrfs -o subvol=/@home,compress=zstd /dev/nvmen0p3 /mnt/home

genfstab -U /mnt > /mnt/etc/fstab

# 最后拔掉U盘重启就好了。

arch 系统的启动流程

先介绍一下几个东西:

BIOS: BIOS 或基本输入输出系统在大多数情况下存储在主板本身的闪存中,独立于系统存储。

UEFI: 统一可扩展固件接口支持读取分区表和文件系统。无论主引导记录(MBR)是否存在,UEFI 都不会从主引导记录启动任何引导代码,而是依靠 NVRAM 中的引导条目启动。UEFI 启动 EFI 应用程序,如启动加载程序、启动管理器、UEFI shell 等。这些应用程序通常以文件形式存储在 EFI 系统分区中。每个供应商都可以将其文件存储在 EFI 系统分区的 /EFI/vendor_name 目录下。这些应用程序可通过在 NVRAM 或 UEFI shell 中添加启动项来启动。

UEFI 规范通过其兼容性支持模块(CSM)支持传统 BIOS 启动。如果在 UEFI 中启用了 CSM,UEFI 将为所有硬盘生成 CSM 启动项。如果选择从 CSM 启动项启动,UEFI 的 CSM 将尝试从硬盘的 MBR 引导代码启动。

UEFI 的设计目的是消除对 GRUB 等中间引导程序的需求。如果您的主板具有良好的 UEFI 实施,就有可能将内核参数嵌入 UEFI 启动项,并让主板直接启动 Arch。可以使用 efibootmgr 或 UEFI Shell v2 修改主板的启动项。

过程: BIOS:

  1. 开机自检
  2. BIOS 初始化启动所需的硬件(磁盘、键盘控制器等)
  3. BIOS 启动 BIOS 磁盘顺序中第一个磁盘的前 440 字节(主引导记录(MBR)引导代码区)
  4. MBR 中的代码会从下面中的一个启动到第二阶段:
    • MBR 之后的下一个磁盘扇区,即所谓的后 MBR 间隙(仅适用于 MBR 分区表)
    • 分区或无分区磁盘的卷启动记录 (VBR)
    • 对于在 GPT 分区上的 GRUB,专门的 BIOS 启动分区(用于替代 GPT 中不存在的后 MBR 间隙)
  5. 实际的 boot loader(比如grub) 开始启动。
  6. boot loader 通过链式加载或直接加载操作系统内核来加载操作系统。

UEFI:

  1. 开机自检
  2. UEFI 初始化启动所需的硬件(磁盘、键盘控制器等)
  3. 固件读取 NVRAM 中的启动项,以确定启动哪个 EFI 应用程序以及从哪里启动(例如从哪个磁盘和分区启动)
    • 启动项可能只是一个磁盘。在这种情况下,固件会在该磁盘上查找 EFI 系统分区,并尝试在后备启动路径 \EFI\BOOT\BOOTx64.EFI (在使用 IA32(32 位)UEFI 的系统上为 BOOTIA32.EFI)中查找 EFI 应用程序。这就是 UEFI 可启动移动媒体的工作原理。
  4. 固件启动 EFI 应用程序
    • 这可能是 boot loader(grub) 或者使用 EFISTUB 引导的 Arch 内核本身。
    • 可能是其他 EFI 应用程序,如 UEFI shell 或 boot manager,如 systemd-boot 或 rEFInd。

如果启用了安全启动,启动过程将通过签名验证 EFI 二进制文件的真实性。