cachyos 从 GRUB 切换到 rEFInd

从 GRUB 到 rEFInd

📝 背景与动机

在 Linux 发行版中,GRUB 一直是绝对的霸主。但在现代 UEFI 系统和 Btrfs 文件系统的普及下,GRUB 的弊端愈发明显:

  1. 配置逻辑复杂 :grub.cfg 由脚本生成,手改困难且容易在更新时被覆盖。
  2. 硬编码第一阶段引导:在 UEFI 下依然显得臃肿,不够原生。
  3. 界面朴素:缺乏现代引导器的图形化美感。

我使用的是 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 秒):

  1. 主界面平铺显示 :手搓的 CachyOS (Bore) 与自动探测的 CachyOS (LTS) 并排展示。
  2. 自动探测不丢失:插上 U 盘,rEFInd 会自动扫出 USB 图标。
  3. 极致开机速度:无缝衔接 UEFI 固件,没有了 GRUB 的脚本加载延迟。

当前系统架构总结:

  • 引导器:纯血 rEFInd(Btrfs 驱动直读内核)
  • 文件系统 :Btrfs(多设备子卷,含 snap-pac 自动快照)
  • ESP 状态:极度干净(仅存放 EFI 引导文件,不受内核体积膨胀影响)
  • 安全防线 :Snapper 快照覆盖内核更新,外加 efi_backup.tar.gz 作为物理兜底。
相关推荐
第404号工位3 小时前
40块钱二手瘦客户端,如何跑满家庭物联网中枢?(拒绝Docker爆盘实录)
linux·架构·node.js
骑着蜗牛撵大象3274 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
..Dauntless..5 小时前
【Linux】一切皆文件和缓冲区
linux·运维·服务器
QMCY_jason5 小时前
x86 ubuntu2204 无gui 安装 openeuler 2203 aarch64版本
linux·运维·服务器
重生之小比特5 小时前
【Linux系统】12 进程程序替换 自定义Shell 命令行解释器
linux·运维·服务器
あ-5 小时前
CubeSandBox配置CubeMaster CPU 超分
linux·运维·服务器
Escalating_xu5 小时前
【Linux 网络编程】TCP Socket 编程(上):从 listen、accept 到完整回显通信
linux·网络·tcp/ip
老秦包你会5 小时前
Linux第十课---------Linux信号
linux
北风toto6 小时前
Linux 服务器如何判断 CPU 是否支持 x86-64-v2 指令集
java·linux·服务器