cachyos 从 GRUB 切换到 rEFInd

29 阅读4分钟

从 GRUB 到 rEFInd:CachyOS 引导器迁移实录

📝 背景与动机

GRUB 长期占据 Linux 引导器的主导地位,但在 UEFI 与 Btrfs 普及之后,它的短板越来越明显:grub.cfg 由脚本生成,手改困难且容易被更新覆盖;UEFI 下仍带着一层不够原生的引导逻辑;界面也偏朴素。

我使用的 CachyOS 采用 Btrfs 多子卷布局,ESP 分区只有 512MB。为了追求更干净、更直观、且不浪费 ESP 空间的引导方案,我决定把引导器换成 rEFInd。


📊 核心架构:为什么不把内核塞进 ESP?

官方常见做法是把 /boot 格式化为 FAT32 并挂载到 ESP,让 UEFI 直接读取内核。但在 512MB 的 ESP 下,多个内核(Bore + LTS)加上各自的 initramfs 会迅速吃紧,而且内核会脱离 Btrfs 快照的保护。

因此我采用另一条路:

  • 保持原有 Btrfs 结构:/boot 仍在根子卷 @ 内。
  • 让 rEFInd 读 Btrfs:加载 btrfs_x64.efi 驱动,跨文件系统读取内核。
  • 空间与安全兼顾:ESP 只放几 MB 引导文件,内核全部受 snap-pac 快照保护。

🛠️ 实施步骤

1. 安全第一:备份与快照

动手之前先建安全网:

# 手动创建 Btrfs 快照
sudo snapper create -d "Before rEFInd migration"

# 备份 UEFI 启动项列表和 ESP 目录(ESP 不在快照保护范围内)
sudo efibootmgr -v > ~/efibootmgr_backup.txt
sudo tar -czvf ~/efi_backup.tar.gz /boot/efi/EFI

2. 安装与自动配置

sudo pacman -S refind
sudo refind-install

refind-install 会自动检测 Btrfs,把 btrfs_x64.efi 驱动装进 ESP,并创建 NVRAM 启动项。

3. 配置 rEFInd:自动扫描 + 默认高亮

一开始我尝试过“手动接管”:用 dont_scan_files 屏蔽自动扫描的 Bore 内核,再手写 menuentry 硬编码 initrd 和 options。这套方案能跑,但维护成本高——内核路径、initramfs 文件名、参数都要自己跟着改,和 rEFInd“开机自动扫描”的设计初衷相悖。

最终我改回纯自动扫描模式,refind.conf 只保留两行有效配置:

# 关闭内核折叠,让 Bore、LTS 等内核平铺显示
fold_linux_kernels false

# 默认高亮选中 Bore 内核
default_selection "linux-cachyos-bore"

同时确保文件里没有 dont_scan_files 屏蔽任何内核,也没有手写的 menuentry 块。

内核启动参数统一交给 /boot/refind_linux.conf 提供。这个文件由 refind-install 首次生成,我删掉了脚本模板里对 Btrfs 不适用的 "minimal options" 行(它缺少 rootflags=subvol=@,误选会挂到顶层子卷),保留两行:

"Boot with standard options"  "root=UUID=4dbf44a5-f09e-4bad-a3be-d6b793fd638a rw rootflags=subvol=@ nowatchdog nvme_load=YES loglevel=3"
"Boot to single-user mode"    "root=UUID=4dbf44a5-f09e-4bad-a3be-d6b793fd638a rw rootflags=subvol=@ nowatchdog nvme_load=YES loglevel=3 single"

这样,rEFInd 开机自动扫描 /boot 下所有内核,每个内核都套用这两组参数,subvol=@ 由这里统一提供。内核升级后 rEFInd 自动发现新文件,不需要任何引导配置改动。


🧹 彻底清理 GRUB(排雷记录)

确认 rEFInd 能正常引导后,开始卸载 GRUB。过程中遇到两个坑:

坑一:连带卸载快照工具

直接运行 sudo pacman -Rns grub grub-btrfs 时,pacman 提示要连带卸载 snap-pac 和 cachyos-snapper-support。

危险! snap-pac 是系统更新自动打快照的关键组件,绝不能删。解决办法是去掉 -s,只精准卸载 GRUB 家族:

sudo pacman -Rn grub grub-btrfs grub-hook grub-btrfs-support

坑二:依赖变孤儿

卸载后 snap-pac 变成孤儿包,未来可能被清理工具误删。把它标记为显式安装:

sudo pacman -D --asexplicit snap-pac cachyos-snapper-support

清理物理残留

# 删除 NVRAM 中的 GRUB 启动项(编号以 efibootmgr 实际输出为准)
sudo efibootmgr -b 0000 -B

# 删除磁盘上的 GRUB 目录
sudo rm -rf /boot/efi/EFI/cachyos
sudo rm -rf /boot/efi/EFI/grub
sudo rm -rf /boot/grub

🎉 最终效果

重启后直接进入 rEFInd 界面:

  1. 主界面平铺显示:Bore 与 LTS 等内核独立列出,不再折叠隐藏。
  2. 默认高亮 Bore:default_selection "linux-cachyos-bore" 按子串匹配生效。
  3. 自动探测不丢失:插上 U 盘,rEFInd 自动扫出 USB 启动项。
  4. 开机更快:无缝衔接 UEFI 固件,省去 GRUB 的脚本加载延迟。

当前系统架构:

  • 引导器:rEFInd(Btrfs 驱动直读内核,纯自动扫描)
  • 文件系统:Btrfs(多子卷,snap-pac 自动快照)
  • ESP 状态:只放 EFI 引导文件,不受内核体积膨胀影响
  • 安全防线:Snapper 快照覆盖内核更新,外加 efi_backup.tar.gz 物理兜底