从 GRUB 到 rEFInd
📝 背景与动机
在 Linux 发行版中,GRUB 一直是绝对的霸主。但在现代 UEFI 系统和 Btrfs 文件系统的普及下,GRUB 的弊端愈发明显:
- 配置逻辑复杂 :
grub.cfg由脚本生成,手改困难且容易在更新时被覆盖。 - 硬编码第一阶段引导:在 UEFI 下依然显得臃肿,不够原生。
- 界面朴素:缺乏现代引导器的图形化美感。
我使用的是 CachyOS ,文件系统为 Btrfs(多设备子卷布局) ,ESP 分区仅 512MB 。为了追求更极简、直观、且不占用宝贵 ESP 空间的引导方案,我决定将引导器切换为 rEFInd。
📊 核心架构分析(为何不把内核放进 ESP?)
在切换前,我研究了官方推荐的安装方式:官方通常会将 /boot 格式化为 FAT32 并挂载,直接让 UEFI 读取内核。 但在 512MB 的 ESP 容量下,如果存放多个内核(Bore + LTS)及其 initramfs,容量会迅速吃紧,且失去 Btrfs 快照对内核的保护。
因此,我采用了更高级的方案:
- 保持原有 Btrfs 结构 :
/boot依然位于 Btrfs 根子卷@中。 - 利用 rEFInd 驱动 :让 rEFInd 加载
btrfs_x64.efi驱动,跨界读取 Btrfs 分区中的内核。 - 空间与安全双赢 :512MB 的 ESP 只放引导文件(几 MB),内核全部受
snap-pac快照保护。
🛠️ 实施步骤
1. 安全第一:备份与快照
在动刀之前,必须建立安全网:
bash
# 手动创建 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. 安装与自动配置
安装 rEFInd 并让脚本自动完成基础部署:
bash
sudo pacman -S refind
sudo refind-install
此时,refind-install 会自动检测到 Btrfs,并将 btrfs_x64.efi 驱动安装到 ESP 中,同时创建好 NVRAM 启动项。
3. 手搓主菜单:refind.conf(硬核接管)
为了在主界面平铺显示主用的 Bore 内核,同时保留自动探测的 LTS 内核和 U 盘,编辑 /boot/efi/EFI/refind/refind.conf,在文件末尾追加以下配置:
conf
# 关闭内核折叠,让自动扫出来的 LTS 独立显示
fold_linux_kernels false
# 设置默认高亮选中项
default_selection "Bore"
# 【关键】自动探测时,忽略 bore 内核,防止和下面手搓的重复
dont_scan_files +vmlinuz-linux-cachyos-bore
# 手搓的唯一主菜单项:CachyOS (Bore)
menuentry "CachyOS (Bore)" {
icon /EFI/refind/icons/os_linux.png
volume "@"
loader /boot/vmlinuz-linux-cachyos-bore
initrd /boot/intel-ucode.img /boot/initramfs-linux-cachyos-bore.img
options "root=UUID=4dbf44a5-f09e-4bad-a3be-d6b793fd638a rw rootflags=subvol=/@ quiet nowatchdog splash nvme_load=YES loglevel=3"
submenuentry "Boot to single-user mode" {
add_options "single"
}
submenuentry "Boot with fallback initramfs" {
initrd /boot/intel-ucode.img /boot/initramfs-linux-cachyos-bore-fallback.img
}
}
注:这里完全在 menuentry 中硬编码了 initrd 和 options,完全接管了主内核的启动流程。而自动扫描出的 LTS 内核,rEFInd 会依靠内置机制自动处理,无需额外修改 refind_linux.conf。
🧹 彻底清理 GRUB(排雷记录)
确认 rEFInd 可以完美引导后,开始卸载 GRUB。这里遇到了两个核心"坑":
坑一:连带卸载快照工具
直接运行 sudo pacman -Rns grub grub-btrfs 时,pacman 提示要连带卸载 snap-pac 和 cachyos-snapper-support。 危险! snap-pac 是系统更新自动打快照的守护神,绝不能删。 解决:使用不带 -s 的参数,只精准卸载 GRUB 家族。
bash
sudo pacman -Rn grub grub-btrfs grub-hook grub-btrfs-support
坑二:依赖变孤儿
卸载后,snap-pac 变成了孤儿包。为了防止未来被清理工具误删,将其标记为显式安装:
bash
sudo pacman -D --asexplicit snap-pac cachyos-snapper-support
清理物理残留
bash
# 删除 NVRAM 中的 GRUB 启动项 (假设编号为 0000)
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 秒):
- 主界面平铺显示 :手搓的
CachyOS (Bore)与自动探测的CachyOS (LTS)并排展示。 - 自动探测不丢失:插上 U 盘,rEFInd 会自动扫出 USB 图标。
- 极致开机速度:无缝衔接 UEFI 固件,没有了 GRUB 的脚本加载延迟。
当前系统架构总结:
- 引导器:纯血 rEFInd(Btrfs 驱动直读内核)
- 文件系统 :Btrfs(多设备子卷,含
snap-pac自动快照) - ESP 状态:极度干净(仅存放 EFI 引导文件,不受内核体积膨胀影响)
- 安全防线 :Snapper 快照覆盖内核更新,外加
efi_backup.tar.gz作为物理兜底。