← 返回博客
2026-08-15 · 技术

btrfs 快照与 grub-btrfs:系统自愈与一键回滚

滚动更新的优点是不用等版本周期,代价是每次更新都可能有风险。Linxira 对这个代价的回答是三层保险:双内核兜底、更新前自动快照、GRUB 菜单直接回滚。本文讲清楚这三层分别防什么、怎么配合,以及一次实际的恢复演练应该怎么做。

滚动更新的风险

Arch 是滚动更新发行版:上游(含安全补丁)发布后立即同步进入仓库,系统通过 sudo pacman -Syu 持续接收更新。好处是永远最新、永远拿到安全修复;风险是坏更新可能破坏系统——某个包的新版本引入回归、依赖解析出错、甚至内核更新后无法启动。

对传统发行版,这类问题有版本周期兜底:等下一个点版本修复。对滚动发行版,修复通常也很快,但「系统当前处于坏状态」的那段时间必须自己处理。处理手段不是祈祷更新永远正常,而是让系统具备「回到更新前」的能力——快照回滚就是为此存在的。

说得具体一点:坏更新通常不是「全部坏了」,而是某一部分坏了——新内核起不来、某个库的版本与依赖它的应用不兼容、驱动更新后显卡黑屏。这些故障的共同点是事后才能发现:更新时一切正常,重启或使用中才暴露。因此「更新前先留后路」不是保守,而是滚动更新模型下唯一合理的默认策略。

双内核兜底

第一层是内核层面的冗余:系统同时安装两个 Arch 通用内核——linux 为主、linux-lts 为兜底,GRUB 平铺菜单默认启动最新内核。单一内核更新异常时(比如新内核起不来),可以从 GRUB 直接选另一个内核启动。

双内核解决的是「内核更新异常」这一类问题:它不需要任何恢复操作,重启时换个菜单项即可。它不解决「用户态包更新坏了」的问题——那是快照的职责。两层配合的边界很清楚:内核异常用双内核兜底,系统级损坏用快照回滚。

GRUB 平铺菜单在这里起关键作用:两个内核并排列出,默认指向最新内核,但旧内核始终在菜单里。这与你手头有「上一个能用的内核」在效果上等价——它没有占用任何额外恢复流程,只是在引导时多了一个可选项。linux-lts 长期支持内核的节奏更保守,正好与激进滚动的主内核形成互补。

快照机制

快照基于 btrfs 文件系统:系统安装在 btrfs 子卷上,快照记录子卷在某个时刻的完整状态,由 Timeshift 负责快照管理。这也是安装指南推荐 btrfs + Timeshift 分区方案的原因——分区方案在安装时定下,快照能力从第一天就可用,而不是装完系统再想办法补。

快照的成本很低:btrfs 快照是写时复制的,初始几乎不占空间,只有后续修改的数据才产生增量。这意味着「每次更新前拍一张快照」的开销可以忽略不计,而它买来的是「任何更新出问题都能回到更新前」的确定性。

子卷的布局决定了快照能覆盖什么:系统安装在文档化的 btrfs 子卷结构上,Timeshift 按子卷拍摄快照,数据与系统状态都在同一套机制的管理范围内。安装指南把 btrfs + Timeshift 作为推荐分区方案写进流程,正是因为分区结构在安装那一刻就决定了快照能力的边界——事后想补,往往已经来不及。

关于磁盘空间说一句,因为快照和系统在同一个 btrfs 文件系统上:得益于写时复制,每张快照的初始成本接近零,其占用的空间只随快照之后系统的变化而增长。实用结论随之而来:设置合理的保留策略(Timeshift 的调度负责这部分),就能在持续安全的同时不看着剩余空间蒸发——存储成本与你改了系统多少成正比,而不是与快照数量成正比。

GRUB 直接回滚

快照存在是一回事,恢复方便是另一回事。手动挂载、复制、修复引导的恢复流程太复杂,普通用户不会愿意在系统坏掉的时候从头学。Linxira 的答案是 grub-btrfs:把快照加入 GRUB 启动菜单。

启用后,GRUB 菜单里除了正常的内核条目,还会列出已有的快照。要回滚时不需要任何终端操作——重启,在 GRUB 里选择目标快照,系统直接从该快照启动。这层设计把「恢复」从「技术操作」变成了「菜单选择」。

从快照启动与从内核启动的差异也值得明确:快照条目启动的是「某个时刻的完整系统」,包括当时的内核、驱动与用户态软件——这正是「回到更新前」需要的语义。快照之间存在清晰的先后顺序,GRUB 菜单按时间组织,选择「更新前那一个」就是字面意义上的回滚,不需要在恢复环境里做任何额外的判断。

关于真实回滚后的一个实用提醒:快照把系统恢复到当时的完整状态,意味着出问题的更新也不在了——如果之后想重试这次更新,更新前快照机制会自动再次兜底。换句话说,回滚不是死路,而是更新周期的一次干净重启,安全网始终在位。

自动化

手动记得拍快照不可靠,所以快照的创建被自动化了:

两个工具的分工:前者保证「每次更新都有一张更新前快照」,后者保证「即使很久不更新,系统也有定期快照」。更新助手还支持更新前后自定义任务,由 systemd 用户服务驱动。

自动化的价值在于消除「忘记」这个变量:人可能赶时间跳过手动步骤,但默认开启的自动快照不需要记得。把「更新」这个动作本身变成安全操作——先留快照,再动系统——是这套体系比「出了问题再想办法」更根本的优势。这也是为什么快照流程被接进更新助手,而不是留成一个需要用户记得单独调用的工具。

把三层拼起来看一次典型更新:你执行更新(或 linxira-update 弹出提示),更新前的 Timeshift 快照已经存在,pacman 应用更新,然后重启经 GRUB 平铺菜单进入新内核。一切正常就到此为止;新内核表现异常就重启进 linux-lts;再不行就重启进快照。三层不是互相替代的选项,而是递进的应对——每一层都比上一层更便宜、更彻底。

恢复演练建议

快照体系的价值只在「真用的时候会用」时成立。建议在系统健康时做一次演练,把流程变成肌肉记忆:

演练的意义不在于「恢复」本身,而在于确认:当坏更新真的发生时,你只需要重启、选快照、继续工作——而不是在坏掉的系统上查文档。

还有一点心理层面的价值:知道「随时能回退」会改变你对待更新的态度。滚动更新的使用者常有两种极端——要么长期不更新怕出问题,要么盲目更新赌运气。快照回滚把第三种可能变成现实:放心更新,出问题就回来。系统自愈不是保证永不失败,而是保证失败有退路,而退路是事先铺好的。