Arch Linux 软件包与系统维护
本文适用于使用
pacman管理官方仓库包、使用paru管理 AUR 包的 Arch Linux 系统。Btrfs 章节仅适用于根目录或家目录位于 Btrfs 子卷的环境。参考:ArchWiki System maintenance、ArchWiki pacman、ArchWiki Arch User Repository。
环境与维护原则
Arch Linux 是滚动发行版。仓库中的软件包按同一时期的库版本构建,系统只支持完整升级,不支持长期混用新旧仓库状态。
日常维护遵循以下原则:
- 官方仓库包优先于 AUR 包。
- 安装 AUR 包前审核
PKGBUILD和.SRCINFO。 - 不单独执行
pacman -Sy。 - 不用
--overwrite、--nodeps或--skipinteg掩盖问题。 - 修改文件前先确认文件是否由包管理器管理。
- 重要更新前准备备份或快照,并确认恢复方法。
- 重要工作开始前不执行无法预留排障时间的系统升级。
确认管理工具
检查 pacman、paru 和 pacman-contrib 是否可用:
command -v pacman command -v paru command -v checkupdates command -v paccache command -v pacdiff
预期每条命令输出对应的可执行文件路径。checkupdates、paccache 和 pacdiff 由 pacman-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 或系统服务。
depends、makedepends和optdepends是否合理。- 预编译
-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_proxy 和 https_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.proxy 和 https.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 安装介质、救援系统或其他确保目标子卷未挂载的环境操作。错误回滚可能导致系统无法引导或丢失快照之后的数据。
回滚逻辑:
- 挂载 Btrfs 顶层子卷。
- 将当前
@改名保留为故障副本。 - 从只读快照创建新的可写
@。 - 检查
/etc/fstab、引导器和子卷名称。 - 重启并验证系统。
在救援环境中执行:
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
含义不明的备份容易在未来被错误恢复。确认不再需要后再删除。
故障排查
遇到安装、更新或卸载问题时,按以下顺序缩小范围:
- 判断问题发生在下载、构建、pacman 事务还是应用运行阶段。
- 阅读终端第一条错误,而不是只看最后一行。
- 检查网络、代理、磁盘空间和系统时间。
- 检查 pacman、paru 和 makepkg 是否仍在运行。
- 检查
/var/lib/pacman/db.lck是否为陈旧锁。 - 验证下载文件校验和。
- 使用
pacman -Qkk检查已安装文件。 - 查看
/var/log/pacman.log。 - 查询 Arch News、ArchWiki、AUR 评论和上游 Issue。
- 优先重试原事务或恢复单个配置文件。
- 只有确认影响范围后才考虑整盘回滚。
查看磁盘空间
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>
可靠维护依赖可验证的状态、明确的影响范围和可用的恢复路径,不依赖盲目清空缓存或删除无法识别的文件。