// Linux · 2026-04-25

Arch 系包管理器完全指南:从 pacman 到 AUR

一、Arch 系包管理器体系架构全景

Arch Linux 的包管理器 pacman 以极简高效和滚动更新著称,其核心是一个名为 libalpm(Arch Linux Package Management Library)的 C 语言库。所有上层工具最终都通过这个库与系统交互。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

核心层级

层级 工具 职责
用户层 pacman 官方包管理器,处理官方仓库(core/extra/community)
AUR 层 yay / paru AUR(Arch User Repository)助手,管理社区贡献包
构建层 makepkg 从 PKGBUILD 脚本构建 .pkg.tar.zst 包
查询层 pkgfile / namcap 包文件查询与构建质量检查
库层 libalpm C 语言库,所有工具的基础依赖解析与事务引擎
数据库层 /var/lib/pacman/ SQLite 格式的本地包数据库
包格式 .pkg.tar.zst Zstandard 压缩,含元数据、文件清单、安装脚本

关键洞察:与 APT 的分层设计(apt → apt-get → dpkg)不同,Arch 的工具链围绕 libalpm 统一构建,pacman 直接操作数据库,没有更底层的“强制安装”工具。这种设计保证了事务的原子性和一致性。


二、pacman 命令详解(核心包管理器)

pacman 使用单字母标志组合的风格(类似 tar),这是它最具辨识度的特征。记住 -S(同步/安装)、-R(删除)、-Q(查询)三大主标志,即可覆盖 90% 的日常操作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.1 同步与升级

pacman -Sy — 同步包数据库

sudo pacman -Sy                # 同步所有仓库的索引
sudo pacman -Syy               # 强制重新同步(忽略缓存)

原理:从 /etc/pacman.conf 中配置的仓库下载 core.db、extra.db、community.db 等数据库文件到 /var/lib/pacman/sync/。这些数据库是SQLite 格式,包含所有可用包的元数据。

警告:Arch 不支持部分升级。永远不要单独运行 pacman -Sy 后安装包而不升级系统,这会导致依赖断裂。必须始终使用 -Syu 组合。

pacman -Su — 升级已安装包

sudo pacman -Su                # 升级所有包(假设已同步数据库)

pacman -Syu — 同步并升级(黄金命令)

sudo pacman -Syu               # 滚动更新的唯一正确方式
sudo pacman -Syyu              # 强制完整同步 + 升级

这是 Arch 系统的生命线。由于 Arch 是滚动发行版,所有官方仓库的包始终假设处于最新兼容状态。-Syu 一次性更新整个系统,确保依赖一致性。

与 APT 的关键差异:APT 允许 apt upgrade 只升级部分包,Arch 则强制全系统升级。这是设计哲学差异——Arch 假设所有包永远兼容最新版,因此不存在“安全子集升级”的概念。

pacman -Syyu — 强制完整同步

sudo pacman -Syyu              # 双 y = 强制刷新所有数据库

用于解决镜像同步问题或数据库损坏时的恢复。


2.2 安装操作

pacman -S — 从仓库安装

sudo pacman -S nginx
sudo pacman -S nginx php php-fpm    # 批量安装
sudo pacman -S extra/nginx          # 指定仓库安装
sudo pacman -S --needed nginx       # 仅在未安装时安装(不重复安装)
sudo pacman -S --asdeps nginx       # 标记为依赖(非显式安装)

依赖解析流程:

  1. 读取仓库数据库的 depends 字段
  2. 使用 libalpm 的依赖求解器计算最小安装集
  3. 按依赖顺序下载 .pkg.tar.zst 到 /var/cache/pacman/pkg/
  4. 执行事务:检查冲突 → 下载 → 验证签名 → 解压 → 运行安装脚本

pacman -U — 安装本地包

sudo pacman -U ./package.pkg.tar.zst              # 本地文件
sudo pacman -U http://example.com/package.pkg.tar.zst   # 远程 URL
sudo pacman -U file:///path/to/package.pkg.tar.zst      # 保留在缓存中

这是安装 AUR 包或降级包的最后一步。

pacman -Sw — 仅下载不安装

sudo pacman -Sw nginx          # 下载到缓存,不安装

包组安装

sudo pacman -S gnome           # 安装整个 GNOME 组(交互式选择)
sudo pacman -S plasma-{desktop,mediacenter,nm}   # 花括号展开

2.3 卸载操作

pacman -R — 基础卸载

sudo pacman -R nginx           # 仅卸载包,保留依赖

pacman -Rs — 卸载含孤儿包

sudo pacman -Rs nginx          # 卸载包 + 不再需要的依赖

“孤儿包”判定:与 APT 的 autoremove 类似,但 pacman -Rs 在卸载时一并处理,无需单独命令。

pacman -Rns — 完全卸载(推荐)

sudo pacman -Rns nginx         # 卸载 + 依赖 + 配置文件

-n 标志:删除配置文件(.pacsave 备份除外)。这是 Arch 中最彻底的卸载方式。

pacman -Rc — 级联卸载(危险)

sudo pacman -Rc nginx          # 卸载包及其所有依赖,包括被其他包需要的

警告:-Rc 是递归的,可能意外删除大量包。仅在明确知道后果时使用。

pacman -Rdd — 强制卸载(忽略依赖)

sudo pacman -Rdd nginx         # 不检查依赖,强制删除

2.4 查询操作

pacman 的查询分为三大命名空间:-S(远程仓库)、-Q(本地已安装)、-F(文件数据库)。

搜索命令

pacman -Ss nginx               # 搜索远程仓库(包名 + 描述)
pacman -Ss '^vim-'             # 正则搜索包名
pacman -Qs nginx               # 搜索本地已安装包
pacman -Fy && pacman -F nginx  # 搜索远程包中的文件(需先同步文件数据库)

详情命令

pacman -Si nginx               # 显示仓库包详情
pacman -Qi nginx               # 显示本地包详情
pacman -Qii nginx              # 显示详情 + 备份文件状态

文件查询

pacman -Ql nginx               # 列出包安装的所有文件
pacman -Fl nginx               # 列出远程包的所有文件
pacman -Qo /usr/bin/nginx      # 查询文件属于哪个包(超级实用!)
pacman -Qk nginx               # 验证包文件完整性(k = check)
pacman -Qkk nginx              # 彻底校验(包括 MD5/SHA256)

状态查询

pacman -Qdt                    # 列出孤儿包(依赖但无父包)
pacman -Qet                    # 列出显式安装且非依赖的包
pacman -Qd                     # 列出所有作为依赖安装的包
pacman -Qe                     # 列出所有显式安装的包
pacman -Qm                     # 列出所有本地/foreign 包(非仓库来源,如 AUR)

2.5 缓存管理

sudo pacman -Sc                # 删除未安装包的缓存
sudo pacman -Scc               # 完全清空缓存(包括已安装包的旧版本)

# 更智能的缓存管理(pacman-contrib 包)
sudo paccache -r               # 保留最近 3 个版本,删除其余
sudo paccache -rk1             # 只保留 1 个旧版本
sudo paccache -ruk0            # 删除所有未安装包的缓存

建议:使用 paccache 而非 pacman -Scc,因为保留旧版本缓存是 Arch 降级包的唯一途径(Arch Linux Archive 除外)。


三、AUR 与 AUR 助手

AUR(Arch User Repository)是 Arch 的灵魂。它不包含二进制包,只托管 PKGBUILD 脚本,用户通过 makepkg 自行构建。

3.1 手动安装 AUR 包(理解原理)

# 1. 安装构建依赖
sudo pacman -S --needed base-devel git

# 2. 克隆 AUR 仓库
git clone https://aur.archlinux.org/yay.git
cd yay

# 3. 检查 PKGBUILD(安全!)
less PKGBUILD
less .SRCINFO

# 4. 构建
makepkg -si                    # -s = 安装依赖, -i = 构建后安装

# 5. 或者分步执行
makepkg -s                     # 仅构建
sudo pacman -U yay-*.pkg.tar.zst   # 手动安装

安全警告:AUR 包是用户生成的内容,未经过官方审核。安装前务必检查 PKGBUILD 中的 source 数组和 package() 函数,警惕恶意代码。

3.2 yay — 最受欢迎的 AUR 助手

yay(Yet Another Yogurt)用 Go 编写,语法与 pacman 高度兼容。

安装 yay

sudo pacman -S --needed git base-devel
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si

常用命令

yay                            # 等同于 yay -Syu(升级官方 + AUR)
yay -S package                 # 安装包(自动搜索官方和 AUR)
yay -S package --aur           # 仅从 AUR 安装
yay -S package --repo          # 仅从官方仓库安装
yay -Ss keyword                # 搜索(官方 + AUR)
yay -Si package                # 显示详情
yay -Qu                        # 查询可升级包
yay -Syu --devel               # 升级 + 检查 VCS 开发包更新
yay -Yc                        # 清理不需要的依赖
yay -Ps                        # 打印系统统计
yay -G package                 # 下载 PKGBUILD(不构建)
yay --editmenu -S package      # 构建前编辑 PKGBUILD

交互式搜索安装(yay 的杀手功能)

yay google-chrome              # 模糊搜索,交互式选择版本

3.3 paru — Rust 编写的新一代助手

# 安装
git clone https://aur.archlinux.org/paru.git
cd paru
makepkg -si

# 特色功能
paru                         # 升级全部
paru -S package              # 安装
paru --fm vim -S package     # 使用 vim 查看 PKGBUILD
paru -Sua                    # 仅升级 AUR 包
paru --chroot                # 在干净 chroot 中构建

yay vs paru:yay 更成熟稳定,paru 功能更丰富(如 chroot 构建、更好的搜索界面)。两者任选其一即可。


四、makepkg:包构建系统

makepkg 是 Arch 构建包的核心工具,从 PKGBUILD 脚本生成 .pkg.tar.zst。

4.1 PKGBUILD 基础结构

# PKGBUILD 示例
pkgname=hello-world
pkgver=1.0.0
pkgrel=1
pkgdesc="A hello world program"
arch=('x86_64')
url="https://example.com"
license=('MIT')
depends=('glibc')
makedepends=('gcc')
source=("https://example.com/$pkgname-$pkgver.tar.gz")
sha256sums=('SKIP')

build() {
    cd "$pkgname-$pkgver"
    ./configure --prefix=/usr
    make
}

package() {
    cd "$pkgname-$pkgver"
    make DESTDIR="$pkgdir" install
}

4.2 makepkg 命令

makepkg -s                     # 构建并自动安装依赖
makepkg -si                    # 构建 + 安装
makepkg -sri                   # 构建 + 安装 + 删除构建依赖
makepkg -c                     # 构建后清理源码目录
makepkg -f                     # 强制重新构建
makepkg --skipchecksums        # 跳过校验(测试用)
makepkg --skippgpcheck         # 跳过 PGP 验证(谨慎!)
makepkg --noextract            # 不重新解压源码(调试用)
makepkg --nobuild              # 仅准备,不构建

4.3 构建优化配置

编辑 /etc/makepkg.conf:

# 多线程编译
MAKEFLAGS="-j$(nproc)"

# 多线程压缩
COMPRESSZST=(zstd -c -z -q - --threads=0)

# 使用更快/更慢的压缩
PKGEXT='.pkg.tar.zst'          # 默认,平衡速度
PKGEXT='.pkg.tar'              # 不压缩,构建最快
PKGEXT='.pkg.tar.xz'           # 更小体积,更慢

五、仓库配置详解

5.1 /etc/pacman.conf 结构

[options]
HoldPkg     = pacman glibc
Architecture = auto
CheckSpace
ParallelDownloads = 5
Color
ILoveCandy                     # 进度条变成吃豆人动画

# 跳过升级
IgnorePkg   = linux            # 锁定内核版本
IgnoreGroup = gnome            # 跳过整个组

# 不升级特定文件
NoUpgrade   = etc/passwd

# 不提取特定文件
NoExtract   = usr/share/locale/*

[core]
Include = /etc/pacman.d/mirrorlist

[extra]
Include = /etc/pacman.d/mirrorlist

[community]
Include = /etc/pacman.d/mirrorlist

[multilib]                     # 32 位兼容库
Include = /etc/pacman.d/mirrorlist

[archlinuxcn]                  # 中文社区仓库
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch
SigLevel = Never

5.2 镜像列表管理

# 查看当前镜像
cat /etc/pacman.d/mirrorlist

# 使用 reflector 自动选择最快镜像
sudo pacman -S reflector
sudo reflector --country China --age 12 --protocol https --sort rate --save /etc/pacman.d/mirrorlist

# 手动添加镜像
echo 'Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch' | sudo tee -a /etc/pacman.d/mirrorlist

5.3 添加第三方仓库(安全做法)

# 1. 导入 GPG 密钥
sudo pacman-key --recv-keys KEY_ID
sudo pacman-key --lsign-key KEY_ID

# 2. 编辑 pacman.conf 添加仓库
echo '[custom-repo]' | sudo tee -a /etc/pacman.conf
echo 'Server = https://custom.repo/arch/$arch' | sudo tee -a /etc/pacman.conf

# 3. 更新
sudo pacman -Syu

六、实用技巧与故障排查

6.1 一键系统维护脚本

#!/bin/bash
# arch-maintenance.sh

set -e

echo "=== 同步并升级系统 ==="
sudo pacman -Syu

echo "=== 清理孤儿包 ==="
sudo pacman -Rns $(pacman -Qdtq) || true

echo "=== 清理缓存 ==="
sudo paccache -r

echo "=== 验证包完整性 ==="
sudo pacman -Qk

echo "=== 系统维护完成 ==="

6.2 常见故障排查

错误 1:failed to commit transaction (conflicting files)

# 检查冲突文件归属
pacman -Qo /path/to/conflicting/file

# 如果无人拥有,安全删除后重试
sudo rm /path/to/conflicting/file
sudo pacman -Syu

# 或者强制覆盖(谨慎!)
sudo pacman -S --overwrite '*' package_name

错误 2:unable to lock database

# 检查是否有其他 pacman 进程
fuser /var/lib/pacman/db.lck

# 安全删除锁文件(确认无进程后)
sudo rm /var/lib/pacman/db.lck

错误 3:invalid or corrupted package (PGP signature)

# 更新密钥环
sudo pacman -Sy archlinux-keyring
sudo pacman -Syu

# 如果 pacman 本身损坏,使用静态版本
sudo pacman -S pacman-static
sudo pacman-static -Syu pacman

错误 4:部分升级导致系统损坏

# 从 Live USB 启动,chroot 修复
sudo mount /dev/sdaX /mnt
sudo arch-chroot /mnt
pacman -Syu $(grep '\[ALPM\] upgraded' /var/log/pacman.log | cut -d' ' -f4 | tr '\n' ' ')

错误 5:降级包

# 方法 1:从缓存安装旧版本
sudo pacman -U /var/cache/pacman/pkg/package-old-version.pkg.tar.zst

# 方法 2:使用 downgrade 工具(AUR)
yay -S downgrade
sudo downgrade package

# 方法 3:从 Arch Linux Archive
sudo pacman -U https://archive.archlinux.org/packages/.../package-old.pkg.tar.zst

# 锁定版本防止再次升级
echo 'IgnorePkg = package' | sudo tee -a /etc/pacman.conf

6.3 查询与调试

# 查看包依赖树
pactree package                  # 正向依赖
pactree -r package             # 反向依赖

# 查看包变更日志
pacman -Qc package             # 需安装 pacman-contrib

# 查看待更新包
checkupdates                   # 不执行,仅列出(pacman-contrib)

# 查看文件数据库
pkgfile -u                     # 更新文件数据库
pkgfile /usr/bin/nginx         # 查询未安装包中的文件

七、pacman vs APT vs apk:设计哲学对比

维度 pacman(Arch) APT(Debian) apk(Alpine)
设计目标 滚动更新、极简高效 稳定发行版、生态丰富 容器最小化、极致轻量
更新模式 滚动更新(无版本号) 固定版本 + 点发布 固定版本
依赖解析 libalpm,中等复杂度 dpkg + apt,最复杂 简单直接
状态管理 SQLite 数据库 + 显式/依赖标记 dpkg 状态数据库 + apt-mark world 纯文本文件
缓存策略 保留旧版本(便于降级) 可清理 默认清理
社区仓库 AUR(PKGBUILD) PPA(二进制) 无
包格式 .pkg.tar.zst(Zstd) .deb(ar + tar) .apk(tar.gz)
配置文件处理 .pacnew / .pacsave .dpkg-dist / 交互式 直接覆盖
部分升级 明确禁止 支持 支持

八、命令速查表

任务 pacman 命令 AUR 助手(yay)
同步数据库 pacman -Sy —
升级系统 pacman -Syu yay / yay -Syu
安装包 pacman -S pkg yay -S pkg
安装本地包 pacman -U file.pkg.tar.zst —
仅下载 pacman -Sw pkg —
卸载包 pacman -R pkg yay -R pkg
完全卸载 pacman -Rns pkg yay -Rns pkg
搜索仓库 pacman -Ss keyword yay -Ss keyword
搜索本地 pacman -Qs keyword yay -Qs keyword
仓库详情 pacman -Si pkg yay -Si pkg
本地详情 pacman -Qi pkg yay -Qi pkg
列出文件 pacman -Ql pkg yay -Ql pkg
文件归属 pacman -Qo /path yay -Qo /path
孤儿包 pacman -Qdt yay -Yc
清理缓存 pacman -Sc / paccache -r yay -Sc
构建包 makepkg -si —
降级包 pacman -U old.pkg.tar.zst downgrade pkg

九、总结

Arch 的包管理器设计遵循**“简单即强大”**的哲学:pacman 用最小的命令集覆盖最广的场景,libalpm 提供可靠的事务引擎,AUR 通过社区力量无限扩展软件生态。

掌握 pacman -Syu(滚动更新)、pacman -Rns(彻底卸载)、pacman -Qo(文件归属)这三个命令,你就解决了 80% 的日常需求。深入理解 PKGBUILD 和 makepkg,则能让你从消费者转变为贡献者,真正融入 Arch 社区。

原文 https://blog.csdn.net/2301_79518550/article/details/160510567