从 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 界面:
- 主界面平铺显示:Bore 与 LTS 等内核独立列出,不再折叠隐藏。
- 默认高亮 Bore:
default_selection "linux-cachyos-bore"按子串匹配生效。 - 自动探测不丢失:插上 U 盘,rEFInd 自动扫出 USB 启动项。
- 开机更快:无缝衔接 UEFI 固件,省去 GRUB 的脚本加载延迟。
当前系统架构:
- 引导器:rEFInd(Btrfs 驱动直读内核,纯自动扫描)
- 文件系统:Btrfs(多子卷,
snap-pac自动快照) - ESP 状态:只放 EFI 引导文件,不受内核体积膨胀影响
- 安全防线:Snapper 快照覆盖内核更新,外加
efi_backup.tar.gz物理兜底