Arch Linux 安全滚动更新的几个建议

Arch Linux 安全滚动更新的几个建议(含磁盘空间检查)

Arch 滚动更新的机制决定了系统永远处于”最新”状态。这个特性既是优势也是风险——更新如果处理不当,轻则应用程序报错,重则系统无法启动。

这篇是実战总结,不是复制粘贴官方的 Pacman 指南。


先检查磁盘空间

这是最容易被忽略、后果却最严重的一步。

滚动更新经常需要下载几百 MB 甚至 GB 级别的包,尤其 GNOME、KDE 这种桌面环境的大版本升级,加上编译依赖缓存, /var/cache/pacman/pkg/ 目录膨胀速度相当可观。

排查磁盘空间的几个命令:

# 粗略看一下各分区状况
df -h

# 看具体哪个目录占空间
du -sh /var/cache/pacman/pkg/

# 更细致的排查
du -sh /* 2>/dev/null | sort -rh | head -15

你可能遇到的坑:根分区只分了 20G,装几个大软件包就满了。升级过程中空间耗尽会导致部分包安装成功、部分失败,系统处于断裂状态——这比完全没升级更难修。

Pacman 把包文件默认缓存在 /var/cache/pacman/pkg/ 下面,卸载软件包后这些文件不会自动清理:

# 清理已卸载包的缓存文件
sudo pacman -Sc

# 清理所有缓存(更激进)
sudo pacman -Scc

上面第一条是安全的,只清已经不在系统里的包。第二条会把所有版本缓存全删掉——如果你某个更新出问题想降级,这些旧包就救不了你。所以除非空间实在吃紧,不建议用 -Scc

还有个选项 paccache,更灵活:

sudo pacman -S pacman-contrib
sudo paccache -r
# 默认只保留最近 3 个版本,删掉旧缓存

我自己在 SSD 容量充足的情况下会保留 5 个版本,给回滚留空间。机械硬盘的小容量设备可以只留 2 个。

另外注意 /boot 分区的空间。内核更新频繁生成新 initramfs,EFI 分区太满可能导致更新失败。一般建议 EFI 分区至少留 512MB,实际 1G 以上比较安心。


用 Reflector 优化镜像源

Arch 官方镜像列表有几百个节点,速度慢或者不同步的源会导致下载超时、包校验失败:

sudo pacman -S reflector
sudo reflector --latest 20 --protocol https --sort rate --save /etc/pacman.d/mirrorlist

这条命令根据你的网络状况动态选最快的 20 个源。不需要手动编辑 mirrorlist,跑完直接生效。


执行更新前读公告

Arch 公告页不是摆设。https://archlinux.org/news/ 每次有重大变更都会发通知,比如:

  • glibc 大版本升级,需要重启
  • systemd 变更默认行为
  • 软件包更名或者拆包
  • 内核 ABI 不兼容导致第三方模块失效

我通常的做法是 sudo pacman -Sy 之后先跑 pacman -Qu 看有哪些包要更新,然后对着公告列表扫一眼标题。涉及核心组件(kernel、systemd、glibc、mesa 这种级别的),先不急着 -Su,看完公告说明再动手。


别在更新时开太多进程

Pacman 安装包时会替换掉旧文件。如果你的浏览器、编辑器或者其他程序正在被替换的文件还在占用,更新结束后可能行为异常。最安全的做法:

  1. 保存所有工作
  2. 退出图形界面(X11/Wayland)或者至少关闭高频读写进程
  3. 切换到 TTY(Ctrl+Alt+F3)执行更新
  4. 更新完重启

配置 pacman 的 Hook 做自动清理

不想每次都手动清理缓存,可以写一个 pacman hook,更新结束后自动执行 paccache

创建文件 /etc/pacman.d/hooks/99-paccache.hook

[Trigger]
Operation = Upgrade
Operation = Install
Operation = Remove
Type = Package
Target = *

[Action]
Description = Cleaning up package cache...
When = PostTransaction
Exec = /usr/bin/paccache -r

这样每次 pacman 操作之后都会自动清理旧包缓存,省心。


学会看报错,不要盲目 force

我见过的最危险的操作之一就是文件冲突的时候直接上 --overwrite='*'。这相当于说”不管什么文件冲突,全给我覆盖”。有个一次把我的配置文件冲掉,SSH 密钥差点丢。

正确的做法是对照报错信息逐个处理。常见的冲突类型:

  • 包 A 和包 B 争夺同一个文件路径 → 通常卸载其中一个
  • pacman 显示文件已存在但不是任何已安装包的成员 → 可能是以前手动编译安装的残留,确认后可以 --overwrite 指定那个具体文件
  • GPG 签名验证失败 → 检查系统时间对不对,或者重新同步 keyring:sudo pacman-key --init && sudo pacman-key --populate archlinux

最后一个建议

Arch 不适合”放着不管”的策略。如果你半年不更新,再滚的时候依赖图可能已经是灾难级别。我的习惯是每周至少一次 pacman -Syu,好管理,好排查。

滚动更新不是玄学,就是一套可重复、可验证的流程。磁盘检查、公告阅读、备份习惯、Hook 辅助——把这些步骤固化到肌肉记忆里,Arch 的稳定性和滚动更新的新鲜度完全可以兼得。

本文由 BOSH 的博客助手 HerMes 整理 🗜
原文链接:https://bosh.zz.ac/