系统更新与快照回滚
Linxira OS 是滚动发行:安全补丁上游一发布即可获得,不用等版本周期。配套的安全网也是自动的——系统每小时静默检查更新,每个 pacman 事务前自动创建 Timeshift 快照,真出问题时重启在 GRUB 菜单里选一下快照就能回滚。本文覆盖这套机制的日常用法,以及可选的「全自动更新」开关 EnableAutoApply。
1. 自动检查:默认开启,无需动手
装好系统后不需要装任何「更新管理器」,检查机制随 linxira-update 包自动生效:
- 随首次登录自动启用:包自带 systemd 用户 preset(
/usr/lib/systemd/user-preset/80-linxira-update.preset),用户首次登录时linxira-update.timer自动启用。 - 检查节奏:开机 2 分钟后先查一次,之后每 1 小时一次;
Persistent=true,关机错过的检查会在下次开机补跑。 - 检查动作:每小时执行
linxira-update --check,底层调用checkupdates(超时 120 秒,硬错误自动重试一次),只查询不安装。 - 结果落盘:检查结果原子写入
~/.local/state/linxira-update/status.json。 - 三处入口读同一份结果:Welcome 的更新卡片、系统托盘图标、桌面通知(
notify-send)都读这个文件,不做二次查询。
想立刻手动查一次:
linxira-update --check status.json(version 1)的字段:
| 字段 | 说明 |
|---|---|
check_status | ok(检查成功)/ error(检查失败)/ incomplete(有包查不到来源,未谎报最新) |
pre_snapshot_id | 可选,字符串。自动应用更新前创建的快照 ID(见第 5 节) |
auto_apply | 可选,布尔。本次是否执行了全自动更新,拒绝时附带原因(见第 5 节) |
2. 更新系统的几种方式
Welcome 一键更新:打开 Linxira Welcome,更新卡片会显示检查结果,点击即可启动更新(Welcome 只是启动器,实际执行的是 linxira-update --launch,没有内嵌第二套更新逻辑)。
命令行更新:终端直接运行 linxira-update,交互式确认后执行。
linxira-update 手动 pacman 同样安全:sudo pacman -Syu 随时可用。自动快照由 pacman 钩子实现,对任何 pacman 事务生效(见第 3 节),不走 linxira-update 也有快照保护。
更新范围与边界
- 默认更新全部已配置的 pacman 仓库:签名仓库
[linxira]+ Arch 官方core/extra,一次到位、不做部分升级。 - AUR 与 Flatpak 默认不碰,需要在配置里显式开启(
EnableAUR/EnableFlatpak)。 linxira-*自有包永远不会被送给 AUR helper——它们只来自签名仓库。- 某个包查不到来源时,检查结果记为
incomplete,不会谎报「已是最新」。
3. 快照:每个 pacman 事务前自动执行
系统内置 pacman 钩子 /etc/pacman.d/hooks/linxira-timeshift-autosnap.hook:PreTransaction 阶段、匹配 Upgrade/Install/Remove 全部操作、目标 *——也就是说,任何 pacman 事务(系统升级、装组件、甚至你手敲的 pacman -R)动手改系统之前,都会先执行 timeshift --create --tags O 记录当前状态。
- 成本近零:btrfs 快照写时复制,初始几乎不占空间,之后只有被改动的数据产生增量。
- 自动修剪:保留最近 20 个快照,旧的自动清理,不用手动管空间。
- 软门控(刻意设计):系统未配置 Timeshift(无
/etc/timeshift/timeshift.json)时静默跳过;快照失败也不会阻塞事务——PreTransaction 返回非零会中止整个事务,把它做成硬依赖反而会让「保底手段」变成「单点故障」。
定时快照
除了「事务前」,还有「按时间/按开机」的周期快照。安装时已由安装器自动配置(btrfs 模式,每日 3 份 + 每次开机 3 份);运行期随时用 linxira-config 查看 or 开关,底层与安装期是同一个幂等脚本:
linxira-config timeshift status # 查看当前配置
linxira-config timeshift enable # 启用(幂等)
linxira-config timeshift disable # 停用 4. 出问题怎么办:重启,在 GRUB 里选快照
快照不是摆设,grub-btrfsd 服务(--timeshift-auto 模式)会自动探测 Timeshift 快照并生成对应 GRUB 启动项;grub-btrfs-overlayfs 已写入 mkinitcpio HOOKS,快照条目以只读 overlay 方式引导。
重启,在 GRUB 菜单里找到快照条目(按时间排列,选更新之前的那一个)。
只读验证:从快照条目启动的是「那个时间点的完整系统」(含当时的内核、驱动与用户态软件),但以只读方式运行、不落盘——先确认问题确实是这次更新引起的。
确认后恢复:验证无误后执行恢复(Timeshift 图形界面或 sudo timeshift --restore),系统回到更新前状态。想重试更新也没问题——下次更新前照样会自动快照。
linux-lts 备用内核启动(双内核兜底);快照回滚针对的是「用户态包更新把系统搞坏」这一类问题。两层分工详见博客《btrfs 快照与回滚》。5. 全自动更新:EnableAutoApply(默认关闭)
检查到更新后,连「点一下确认」都省掉——自动完成「快照 → 全量升级」。这个开关默认关闭,适合放在固定网络环境下、希望无人值守保持最新的机器。
开启方法
编辑 ~/.config/linxira-update/linxira-update.conf,加裸键一行(与 EnableAUR 同风格,单独一行即可):
EnableAutoApply 删掉这一行即恢复默认关闭。
硬门控:四个条件全满足才会自动动系统
开启后,--check 一旦发现更新,先做门控检查,全部满足才继续:
- 根文件系统是 btrfs;
/etc/timeshift/timeshift.json存在(Timeshift 已配置);- mkinitcpio HOOKS 包含
grub-btrfs-overlayfs(快照可引导); grub-btrfsd单元已启用(快照会进 GRUB 菜单)。
四项齐备后执行:显式创建快照并校验成功 → 非交互全量升级(pacman -Syu --noconfirm)→ 把快照 ID 写入 status.json 的 pre_snapshot_id。
拒绝与降级
任一门控不满足,或快照创建失败,本次自动应用直接拒绝:保持「只检查 + 通知」的原有行为,status.json 记 auto_apply: false 及原因。快照打不出来就不碰系统,这是硬规则,没有例外路径。
- 非 btrfs 天然不支持:服务器模式、WSL、ext4 安装都会被门控拒绝,保持手动更新。
- 自动应用不碰 AUR/Flatpak,也不做白名单式部分升级——Arch 纪律:要升就全量升,部分升级出的问题不属于支持范围。
命令速查表
| 命令 / 位置 | 作用 |
|---|---|
linxira-update --check | 立即检查更新(不安装) |
linxira-update | 交互式检查并更新 |
~/.local/state/linxira-update/status.json | 最近一次检查结果(Welcome/托盘/通知读同一文件) |
linxira-config timeshift status | 查看快照配置与状态 |
linxira-config timeshift enable / disable | 启用 / 停用周期快照(每日 3 + 开机 3) |
sudo timeshift --list | 列出现有快照 |
sudo timeshift --restore | 恢复到指定快照 |
conf 中一行 EnableAutoApply | 开启全自动更新(默认关闭,硬门控保护) |
相关页面:安装指南(btrfs + Timeshift 分区方案)、官方软件(linxira-update 与其他自研工具)、Config Hub(timeshift 子命令)、博客《btrfs 快照与回滚》(设计原理与演练建议)。