Arch Linux 软件包与系统维护

本文适用于使用 pacman 管理官方仓库包、使用 paru 管理 AUR 包的 Arch Linux 系统。Btrfs 章节仅适用于根目录或家目录位于 Btrfs 子卷的环境。

参考:ArchWiki System maintenanceArchWiki pacmanArchWiki Arch User Repository

环境与维护原则

Arch Linux 是滚动发行版。仓库中的软件包按同一时期的库版本构建,系统只支持完整升级,不支持长期混用新旧仓库状态。

日常维护遵循以下原则:

  • 官方仓库包优先于 AUR 包。
  • 安装 AUR 包前审核 PKGBUILD.SRCINFO
  • 不单独执行 pacman -Sy
  • 不用 --overwrite--nodeps--skipinteg 掩盖问题。
  • 修改文件前先确认文件是否由包管理器管理。
  • 重要更新前准备备份或快照,并确认恢复方法。
  • 重要工作开始前不执行无法预留排障时间的系统升级。

确认管理工具

检查 pacmanparupacman-contrib 是否可用:

command -v pacman command -v paru command -v checkupdates command -v paccache command -v pacdiff

预期每条命令输出对应的可执行文件路径。checkupdatespaccachepacdiffpacman-contrib 提供。

缺少 pacman-contrib 时安装:

sudo pacman -Syu pacman-contrib

命令会同步仓库数据库、完成系统升级并安装 pacman-contrib,避免先刷新数据库再单独安装造成部分升级。

识别文件归属

修改或删除系统文件前,先查询文件属于哪个软件包:

pacman -Qo <FILE_PATH>

例如,<FILE_PATH> 替换为 /usr/bin/example。命令输出应包含包名和版本;如果提示没有软件包拥有该文件,它可能是用户手动创建的文件。

安装软件包

从官方仓库安装

搜索包名和描述:

pacman -Ss <KEYWORD>

查看仓库中的包信息:

pacman -Si <PACKAGE>

确认仓库、版本、依赖和安装大小后,执行完整升级并安装:

sudo pacman -Syu <PACKAGE>

成功标准:

pacman -Q <PACKAGE>

输出应包含已安装包名和版本。

如果系统刚刚完成 pacman -Syu,且同步数据库未被单独刷新,也可以使用 sudo pacman -S <PACKAGE>。不确定当前数据库状态时,使用 -Syu 更稳妥。

审核 AUR 包

AUR 内容由用户维护,不等同于官方仓库。安装前先查看元数据:

paru -Si <PACKAGE>

该命令不会在当前目录生成文件,但也不能代替完整审核。

在独立临时目录中下载构建文件:

mkdir -p ~/tmp/aur-review cd ~/tmp/aur-review paru -G <PACKAGE>

paru -G 会创建:

./<PACKAGE>/ ├── PKGBUILD ├── .SRCINFO └── .git/

审核文件:

less <PACKAGE>/PKGBUILD less <PACKAGE>/.SRCINFO

重点确认:

  • source 是否指向上游官方地址。
  • 校验和是否存在,是否被设置为 SKIP
  • prepare()build()package() 是否执行异常命令。
  • 是否下载或执行来源不明的脚本。
  • 是否修改用户家目录、启动项、sudoers 或系统服务。
  • dependsmakedependsoptdepends 是否合理。
  • 预编译 -bin 包是否确实下载上游官方 Release。

审核结束后删除临时副本:

cd ~ rm -rf -- ~/tmp/aur-review/<PACKAGE>

确认目录已经删除:

test ! -e ~/tmp/aur-review/<PACKAGE> && echo "审核目录已清理"

安装 AUR 包

安装前先完成系统升级:

sudo pacman -Syu

再构建并安装:

paru -S <PACKAGE>

安装过程中再次检查 paru 显示的差异。不要因为此前看过旧版 PKGBUILD,就跳过新版变化。

预编译 -bin 包通常安装更快、构建缓存更小;源码包则由本机编译。两者都必须审核。

安装后验证

查看已安装版本:

pacman -Q <PACKAGE>

查看本地包信息:

pacman -Qi <PACKAGE>

检查包记录的文件:

pacman -Qk <PACKAGE> pacman -Qkk <PACKAGE>

完整安装通常会显示文件总数,并报告没有缺失文件。pacman -Qkk 报告文件被修改不一定表示损坏;用户合法修改的配置文件也会被识别为变化。

列出包安装的文件:

pacman -Ql <PACKAGE>

查看安装事务:

grep '<PACKAGE>' /var/log/pacman.log

<PACKAGE> 替换为实际包名。日志应包含安装或升级时间和版本。

更新系统

查看待更新版本

安全检查官方仓库更新:

checkupdates

输出格式:

包名 当前版本 -> 最新版本

checkupdates 使用独立临时数据库,不修改 pacman 当前同步数据库,因此不会制造部分升级状态。没有待更新包时,它可能不输出内容并返回状态码 2

统计待更新数量:

checkupdates | wc -l

保存更新清单:

checkupdates | tee ~/updates-$(date +%Y%m%d).txt

单独查看基础组件:

checkupdates | grep -E '^(linux|linux-firmware|systemd|glibc|mesa|nvidia|wayland) '

检查 AUR 更新:

paru -Qua

阅读更新说明

升级前检查:

  • Arch Linux News 是否要求人工干预。
  • 内核、显卡驱动、systemd、glibc 等基础组件是否存在已知问题。
  • 软件上游 Release Notes 是否包含不兼容变化。
  • 当前是否有重要任务不允许中断。

部分软件包附带 changelog:

pacman -Qc <PACKAGE>

没有输出时,查看软件上游发布说明。不要把包版本号变化直接等同于兼容性结论。

预下载更新

只下载待更新包:

checkupdates -d

下载文件进入:

/var/cache/pacman/pkg/

该命令不会修改 pacman 当前同步数据库,稍后仍通过完整升级安装。

完整升级

执行:

sudo pacman -Syu

不要执行:

sudo pacman -Sy

pacman -Sy 只更新仓库数据库,保留旧系统文件。后续安装单个包可能混入新库版本,形成 Arch 不支持的部分升级状态。

如果 pacman -Syu 在同步数据库后失败,先解决错误,再继续:

sudo pacman -Syu

完整升级完成前不安装其他包。

更新后检查

处理新旧配置差异:

sudo pacdiff

检查失败的 systemd 单元:

systemctl --failed

查看本次启动中的高优先级日志:

journalctl -b -p warning

涉及内核、显卡驱动、systemd 或 glibc 时,升级后重启是最稳妥的选择:

sudo systemctl reboot

重启后再次执行 systemctl --failed,确认没有新增失败单元。

使用代理下载

检查代理连通性

远端机器使用代理前,先探测端口:

ncat -zv -w 1 <PROXY_IP> <PROXY_PORT>

预期输出应包含连接成功。代理程序在另一台机器上启动,不代表允许局域网访问;代理端通常需要类似配置:

allow-lan: true bind-address: "*" mixed-port: <PROXY_PORT>

如果端口拒绝连接,先检查监听地址、端口和主机防火墙,不要先写入全局代理配置。

为单次命令设置代理

只让当前命令使用代理:

http_proxy=http://<PROXY_IP>:<PROXY_PORT> \ https_proxy=http://<PROXY_IP>:<PROXY_PORT> \ HTTP_PROXY=http://<PROXY_IP>:<PROXY_PORT> \ HTTPS_PROXY=http://<PROXY_IP>:<PROXY_PORT> \ <COMMAND>

命令结束后变量失效,不会修改 Git 或系统全局配置。下载 AUR Release 时,makepkg 使用的 curl 需要看到 http_proxyhttps_proxy

配置 Git 全局代理

开启:

git config --global http.proxy http://<PROXY_IP>:<PROXY_PORT> git config --global https.proxy http://<PROXY_IP>:<PROXY_PORT>

验证:

git config --global --get-regexp 'proxy$'

输出应包含 http.proxyhttps.proxy

关闭:

git config --global --unset http.proxy git config --global --unset https.proxy git config --global --remove-section http 2>/dev/null git config --global --remove-section https 2>/dev/null

再次验证:

git config --global --get-regexp 'proxy$'

没有输出表示 Git 全局代理已关闭。Git 代理只影响 Git,不一定影响 makepkg 使用的 curl。

处理中断与校验错误

下载阶段中断

出现以下输出时,通常还在下载阶段:

Retrieving packages... Retrieving sources... Downloading ...

此时按 Ctrl+C 可能留下:

/var/cache/pacman/pkg/*.part ~/.cache/paru/clone/<PACKAGE>/

这些文件通常不会修改系统包数据库。重新执行原命令:

sudo pacman -S <PACKAGE>

或:

paru -S <PACKAGE>

Arch 默认 makepkg.conf 通常为 curl配置 -C -。服务器支持 HTTP Range、临时文件仍存在且远端文件未变化时,可以断点续传;否则会重新下载。

AUR 构建阶段中断

以下输出表示已经进入构建阶段:

Starting prepare() Starting build() Entering fakeroot environment Starting package()

中断后的构建文件位于:

~/.cache/paru/clone/<PACKAGE>/

先直接重试:

paru -S <PACKAGE>

如果构建缓存本身异常,只删除目标包缓存:

rm -rf -- ~/.cache/paru/clone/<PACKAGE> paru -S <PACKAGE>

不要因为一个包失败就清空整个 ~/.cache/paru

pacman 事务阶段中断

以下输出表示 pacman 可能正在写系统文件和本地数据库:

installing ... upgrading ... Processing package changes... Running post-transaction hooks...

单包安装中断后重新执行:

sudo pacman -S <PACKAGE>

AUR 安装中断后重新执行:

paru -S <PACKAGE>

完整升级中断后重新执行:

sudo pacman -Syu

系统升级被中断后,不要只更新一个包。

清理陈旧数据库锁

如果出现:

unable to lock database

先确认没有包管理进程:

pgrep -a pacman pgrep -a paru pgrep -a makepkg

只有三条命令都没有输出时,才能删除陈旧锁:

sudo rm -f /var/lib/pacman/db.lck

删除后重新执行原事务。不能看到锁文件就直接删除,否则可能允许两个事务同时写数据库。

处理校验失败

典型错误:

文件名 ... FAILED ERROR: One or more files did not pass the validity check!

进入目标包的构建目录:

cd ~/.cache/paru/clone/<PACKAGE> ls -lh

删除错误输出中明确点名的源文件及对应临时文件:

rm -f -- <FAILED_FILE> rm -f -- <FAILED_FILE>.part

重新安装:

paru -S <PACKAGE>

无法确认损坏文件时,删除整个目标包构建缓存:

rm -rf -- ~/.cache/paru/clone/<PACKAGE> paru -S <PACKAGE>

不要绕过校验:

makepkg --skipinteg

也不要将校验和改成:

sha256sums=('SKIP')

重新下载后仍然校验失败时停止安装,并检查:

  • AUR 包是否已过期。
  • PKGBUILD 是否仍指向正确上游版本。
  • 上游是否替换了同名 Release 文件。
  • AUR 评论中是否已有维护者说明。
  • 下载链路、代理或缓存是否改变响应内容。

卸载软件包

预览依赖关系

卸载前查看包信息:

pacman -Qi <PACKAGE>

查看反向依赖:

pactree -r <PACKAGE>

如果其他软件依赖目标包,先确认卸载影响范围。

删除包和无用依赖

执行:

sudo pacman -Rns <PACKAGE>

参数含义:

  • -R:删除目标包。
  • -s:删除不再被其他包需要的依赖。
  • -n:不把包管理器管理的配置保留为 .pacsave

不要轻易使用:

sudo pacman -Rsc <PACKAGE> sudo pacman -Rdd <PACKAGE>

-Rsc 可能递归删除依赖目标包的其他软件,-Rdd 跳过依赖检查,可能破坏系统。

验证包已经删除:

pacman -Q <PACKAGE>

预期输出为找不到该软件包。

清理用户数据

pacman 只管理软件包中记录的文件,不管理应用运行后在家目录创建的数据。常见位置:

~/.config/<APP_DIR> ~/.cache/<APP_DIR> ~/.local/share/<APP_DIR> ~/.local/state/<APP_DIR>

目录名可能与包名不同。先查清实际目录和内容,不要根据模糊匹配批量删除。

确认数据不再需要后删除:

rm -rf -- ~/.config/<APP_DIR> rm -rf -- ~/.cache/<APP_DIR> rm -rf -- ~/.local/share/<APP_DIR> rm -rf -- ~/.local/state/<APP_DIR>

各目录含义:

  • ~/.config:偏好、账号配置和插件配置。
  • ~/.cache:可以重新生成的缓存。
  • ~/.local/share:数据库、工作状态和持久数据。
  • ~/.local/state:日志和状态数据。

删除前导出或备份需要保留的内容。

卸载 Flatpak

Flatpak 应用的数据通常集中在:

~/.var/app/<APP_ID>/

连同用户数据卸载:

flatpak uninstall --delete-data <APP_ID>

如果曾为应用授予任意主目录写权限,它仍可能在沙箱目录之外创建文件,需要单独核对。

管理缓存

pacman 包缓存

下载的软件包位于:

/var/cache/pacman/pkg/

查看占用:

du -sh /var/cache/pacman/pkg

保留每个已安装包最近 3 个版本:

sudo paccache -r

启用每周自动清理:

sudo systemctl enable --now paccache.timer

验证计时器:

systemctl status paccache.timer systemctl list-timers paccache.timer

输出应显示计时器已启用,并列出下一次运行时间。保留旧版本有利于降级,不建议每次升级后清空全部缓存。

paru 构建缓存

查看总占用和各包占用:

du -sh ~/.cache/paru du -sh ~/.cache/paru/clone/* 2>/dev/null | sort -hr

构建缓存通常包含:

  • PKGBUILD 和 Git 元数据。
  • 上游源码或预编译安装包。
  • src/ 构建目录。
  • pkg/ 打包暂存目录。
  • 生成的 Arch 软件包。

安装验证完成后,可以只删除目标包缓存:

rm -rf -- ~/.cache/paru/clone/<PACKAGE>

验证:

test ! -e ~/.cache/paru/clone/<PACKAGE> && echo "目标包构建缓存已清理"

构建缓存不是系统脏数据,但可能占用大量空间。

用户缓存

查看主要占用:

du -sh ~/.cache/* 2>/dev/null | sort -hr

优先删除用途明确的单个应用缓存:

rm -rf -- ~/.cache/<APP_DIR>

只有排障确实需要时才清空全部用户缓存。先关闭图形应用或注销桌面会话,再执行:

find ~/.cache -mindepth 1 -maxdepth 1 -exec rm -rf -- {} +

删除后,应用首次启动可能重新生成索引、缩略图、字体缓存或 GPU 着色器,短时间内启动较慢。

不要把下面目录当作缓存:

~/.config ~/.local/share

使用 Btrfs 快照

确认子卷布局

检查文件系统和子卷:

findmnt / findmnt /home sudo btrfs subvolume list /

常见布局:

@ -> / @home -> /home @swap -> /swap

如果根文件系统不是 Btrfs,不要执行本章命令。ext4 没有 Btrfs 子卷快照能力。

挂载顶层子卷

先从 lsblk -f/etc/fstab 确认 Btrfs 文件系统 UUID:

lsblk -f

创建临时挂载点并挂载 subvolid=5

sudo mkdir -p /mnt/btrfs-top sudo mount -o subvolid=5 UUID=<BTRFS_UUID> /mnt/btrfs-top

验证:

findmnt /mnt/btrfs-top sudo btrfs subvolume list /mnt/btrfs-top

输出应显示顶层子卷中的 @@home 等条目。

创建只读快照

创建根子卷快照:

sudo btrfs subvolume snapshot -r \ /mnt/btrfs-top/@ \ /mnt/btrfs-top/@pre_change_$(date +%Y%m%d)

如果 /home 是独立子卷,再创建家目录快照:

sudo btrfs subvolume snapshot -r \ /mnt/btrfs-top/@home \ /mnt/btrfs-top/@home_pre_change_$(date +%Y%m%d)

验证根快照:

sudo btrfs subvolume show \ /mnt/btrfs-top/@pre_change_<SNAPSHOT_DATE>

其中 <SNAPSHOT_DATE> 使用 YYYYMMDD。输出应包含:

Flags: readonly

从快照恢复单个文件

大多数误配置不需要整盘回滚。先从快照复制目标文件:

sudo cp \ /mnt/btrfs-top/@pre_change_<SNAPSHOT_DATE>/etc/<RELATIVE_PATH> \ /etc/<RELATIVE_PATH>

复制后检查权限、所有者和应用配置语法,再重载对应服务。

恢复根子卷

根子卷正在使用时不能直接替换。应从 Arch 安装介质、救援系统或其他确保目标子卷未挂载的环境操作。错误回滚可能导致系统无法引导或丢失快照之后的数据。

回滚逻辑:

  1. 挂载 Btrfs 顶层子卷。
  2. 将当前 @ 改名保留为故障副本。
  3. 从只读快照创建新的可写 @
  4. 检查 /etc/fstab、引导器和子卷名称。
  5. 重启并验证系统。

在救援环境中执行:

sudo mv \ /mnt/btrfs-top/@ \ /mnt/btrfs-top/@broken_$(date +%Y%m%d) sudo btrfs subvolume snapshot \ /mnt/btrfs-top/@pre_change_<SNAPSHOT_DATE> \ /mnt/btrfs-top/@

回滚前确认:

  • 快照对应需要恢复的根子卷。
  • /home 是否为独立子卷。
  • 引导器是否依赖特定子卷名称。
  • 快照之后的用户数据是否需要保留。

删除快照

确认不再需要回滚后删除根快照:

sudo btrfs subvolume delete \ /mnt/btrfs-top/@pre_change_<SNAPSHOT_DATE>

删除家目录快照:

sudo btrfs subvolume delete \ /mnt/btrfs-top/@home_pre_change_<SNAPSHOT_DATE>

收尾:

sudo umount /mnt/btrfs-top sudo rmdir /mnt/btrfs-top

验证挂载点已经清理:

mountpoint /mnt/btrfs-top

预期输出表示该路径不是挂载点。Btrfs 快照不是独立备份;磁盘或文件系统损坏可能同时影响原数据和快照,重要数据仍需备份到其他介质或远端。

维护配置文件

使用独立覆盖文件

软件支持 drop-in、conf.d、用户配置或自定义覆盖文件时,优先使用独立文件,不直接修改发行版主配置。

独立覆盖有以下优势:

  • 软件更新不容易覆盖自定义内容。
  • 自定义变更边界清晰。
  • 删除覆盖文件即可恢复默认行为。
  • 主配置不会长期混入失效规则。

修改前记录文件归属:

pacman -Qo <CONFIG_PATH>

如果文件由软件包管理,先确认软件是否提供标准覆盖目录。

处理 pacnew 和 pacsave

升级后运行:

sudo pacdiff

重点处理:

*.pacnew *.pacsave

不要直接覆盖现有配置。先比较:

diff -u <CURRENT_CONFIG> <NEW_CONFIG>.pacnew

确认差异后合并需要的新选项,保留仍然有效的本地配置。

清理临时文件

操作结束后检查:

/tmp 中的测试文件和日志 ~/.config 下含义不明的 *.bak 拼写错误的旧目录 临时挂载点 重复的配置规则 空的全局配置文件或配置段 未停止的测试服务和进程

备份文件使用明确名称和日期:

<CONFIG_NAME>.snapshot-YYYYMMDD

不长期保留来源和用途不明的:

<CONFIG_NAME>.bak <CONFIG_NAME>.old <CONFIG_NAME>.new

含义不明的备份容易在未来被错误恢复。确认不再需要后再删除。

故障排查

遇到安装、更新或卸载问题时,按以下顺序缩小范围:

  1. 判断问题发生在下载、构建、pacman 事务还是应用运行阶段。
  2. 阅读终端第一条错误,而不是只看最后一行。
  3. 检查网络、代理、磁盘空间和系统时间。
  4. 检查 pacman、paru 和 makepkg 是否仍在运行。
  5. 检查 /var/lib/pacman/db.lck 是否为陈旧锁。
  6. 验证下载文件校验和。
  7. 使用 pacman -Qkk 检查已安装文件。
  8. 查看 /var/log/pacman.log
  9. 查询 Arch News、ArchWiki、AUR 评论和上游 Issue。
  10. 优先重试原事务或恢复单个配置文件。
  11. 只有确认影响范围后才考虑整盘回滚。

查看磁盘空间

df -h / df -h /home

构建 AUR 包时还需检查缓存目录所在文件系统:

du -sh ~/.cache/paru

磁盘空间不足可能表现为打包失败、写入失败或校验异常。

查看包管理日志

tail -100 /var/log/pacman.log

按包名过滤:

grep '<PACKAGE>' /var/log/pacman.log

日志用于确认事务是否真正开始、安装了哪些依赖,以及中断发生在哪一步。

检查孤儿依赖

列出作为依赖安装、现在不再被其他包需要的软件:

pacman -Qtdq

该结果只是删除候选,不代表用户本人不使用这些程序。开发工具可能仍被手工调用;确认用途后再卸载。

需要保留某个工具时,将安装原因改为显式:

sudo pacman -D --asexplicit <PACKAGE>

确认不再需要后删除:

sudo pacman -Rns <PACKAGE>

可靠维护依赖可验证的状态、明确的影响范围和可用的恢复路径,不依赖盲目清空缓存或删除无法识别的文件。