包管理
在 Linux 上"装软件"和在 Windows 上"双击安装包"是两种完全不同的体验: 你几乎不会从网站下载 .exe, 而是告诉系统"我要 nginx", 由包管理器去仓库拉取、 解决依赖、 写好配置、 注册到数据库里。 这就是包管理的核心—— 它不只是下载器, 更是依赖解析器 + 版本数据库 + 卸载回滚器。 理解了这一点, 你才能理解为什么 apt 和 dnf 修依赖的方式不同、 为什么 Arch 的 pacman -Syu 不能只做一半、 以及为什么直接 rpm -ivh 绕过包管理器会留下一堆烂摊子。
本章并列讲解三大发行版家族的包管理器: APT(Debian/Ubuntu)、 DNF/YUM(RHEL/CentOS/Rocky/Fedora)、 pacman(Arch/Manjaro)。 读任何一个子页时,请先对照本页的六维速查表,明确自己手上的发行版该用哪一列。
为什么包管理是 Linux 第一课
三个几乎无法回避的现实:
- 几乎所有任务的第一步都是"装个东西"。 要装 Docker? 要装
htop? 要装编译器? 都要先过包管理器这一关。 包管理不熟, 后面的系统管理、 网络、 服务器章节会寸步难行——command not found会成为你的每日问候。 - 依赖问题只能靠包管理器解决。 软件 A 依赖库 B, 库 B 又依赖库 C, 手工下载安装几乎必然死循环。 APT 的
apt --fix-broken install、 DNF 的自动依赖解析、pacman的完整依赖树处理, 都是在替你做人肉不擅长的事。 - 升级与安全补丁是运维的日常。
sudo apt upgrade、sudo dnf upgrade、sudo pacman -Syu背后是完全不同的更新哲学: Debian/RHEL 系追求"版本稳定、 只回移植修复", Arch 系追求"仓库永远只有一个当前版本、 升级即前进"。 Arch 上只执行pacman -Sy(刷新数据库但不升级)会制造"部分升级"的半残状态, 是官方明确警告的高危操作, 要么-Syu全升, 要么什么都别动。
鸟哥的教程把包管理比作"软件的户籍管理": 每个包由数据库登记(dpkg -l / rpm -qa / pacman -Q), 文件清单可查、 依赖关系可查、 卸载可追溯。 绕过户籍管理系统(直接解压二进制到 /usr/local 而不留记录)短期方便, 长期会让你彻底失去"这台机器装了什么"的答案。
示例输出来自真实 Ubuntu 26.04 环境,见文末参考资料。
学习目标
- 三系基本操作无障碍: 见到 APT 系发行版会用
apt, 见到 RPM 系会用dnf, 见到 Arch 会用pacman, 且知道"更新源索引"和"升级已装软件"是两个不同动作(apt update≠apt upgrade;pacman -Sy≠pacman -Syu)。 - 查询与溯源: 能回答"这个包是否已装""这个命令属于哪个包""这个文件是谁装的"——
apt/dpkg -S、dnf provides、pacman -Qo三系各来一遍。 - 底层工具心中有数: 理解
dpkg/rpm是底层安装器、apt/dnf/pacman是上层管理器, 知道什么时候必须下沉到底层(离线装.deb/.rpm、 修复数据库)。 - 仓库配置能独立完成:会添加/禁用软件源、更换国内镜像、安装 EPEL/PPA,理解仓库签名(GPG)报错的含义。
- 排障有章法: 遇到锁文件、 依赖冲突、 缓存损坏、 部分升级残留时, 能按"查进程 → 修数据库 → 清缓存 → 重试"的顺序处理, 而不是反复
Ctrl+C。 - 版本控制意识: 会锁定关键软件版本(
apt-mark hold/dnf versionlock/pacman -D --ignore), 避免一次全量升级把生产环境炸掉。
子页导读
- 包管理命令 — 三大包管理器的完整操作手册:APT 的
install/remove/search与dpkg底层、DNF/YUM 的install/remove/repoquery与rpm底层、pacman 的-S/-R/-Q/-Syu全套用法,以及软件源配置、版本锁定、本地仓库搭建、锁文件与依赖故障排查、三系命令对照表。
建议: 先在本页记住六维对照表的"安装/升级/卸载"一行, 再进子页按自己的发行版精读对应章节, 最后把另外两系扫一遍—— 运维很少只接触一种发行版。
三系差异速览(apt / dnf / pacman 六维对照)
下面六行覆盖了包管理 95% 的日常操作。横着看是一个维度在三系的写法,竖着看是一个发行版的完整工具箱。
| 维度 | APT(Debian/Ubuntu) | DNF/YUM(RHEL/CentOS/Rocky) | pacman(Arch) |
|---|---|---|---|
| ① 安装 / 升级 / 卸载 | sudo apt update 刷新索引sudo apt upgrade 升级已装包sudo apt install 包名 安装sudo apt remove 包名 卸载(保留配置用 purge) | sudo dnf makecache 刷新缓存sudo dnf upgrade 升级已装包sudo dnf install 包名 安装sudo dnf remove 包名 卸载 | sudo pacman -Sy 仅刷新数据库(勿单独使用)sudo pacman -Syu 刷新并全量升级sudo pacman -S 包名 安装sudo pacman -Rns 包名 卸载(连带未用依赖与配置) |
| ② 查询与搜索 | apt search 关键词apt show 包名apt list --installedapt list --upgradable | dnf search 关键词dnf info 包名dnf list installeddnf check-update | pacman -Ss 关键词 搜仓库pacman -Si 包名 看远端信息pacman -Qs 关键词 搜已装pacman -Qi 包名 看已装详情 |
| ③ 底层工具与本地包 | dpkg -i 包.deb 装本地包dpkg -l 列已装dpkg -S 文件 查归属apt --fix-broken install 修依赖 | rpm -ivh 包.rpm 装本地包rpm -qa 列已装rpm -qf 文件 查归属dnf reinstall 包名 重装修复 | pacman -U 包.pkg.tar.zst 装本地包pacman -Q 列已装pacman -Qo 文件 查归属pacman -Dk 检查孤立依赖 |
| ④ 软件源配置 | /etc/apt/sources.list/etc/apt/sources.list.d/*.list改完执行 apt update | /etc/yum.repos.d/*.repo改完执行 dnf makecache | /etc/pacman.conf/etc/pacman.d/mirrorlist改完执行 pacman -Sy(并立即 -Syu) |
| ⑤ 第三方扩展生态 | PPA(add-apt-repository)、backports | EPEL(dnf install epel-release)、RPM Fusion、CRB/PowerTools | AUR(官方仓库不含,用 yay/paru 等助手从 PKGBUILD 构建;pacman 本身不感知 AUR) |
| ⑥ 版本锁定 / 回滚 / 缓存 | apt-mark hold 包名 锁定apt-mark unhold 解锁apt clean 清缓存apt history 看历史 | dnf versionlock add 包名(需插件)dnf history 查/回滚事务dnf clean all 清缓存 | pacman -D --ignore 包名 本次升级忽略pacman -Qq + 时间戳辅助回查pacman -Sc/-Scc 清缓存 |
六维之外的三条黄金法则:
- 索引 ≠ 升级。
apt update、dnf makecache、pacman -Sy都只是"让本地知道仓库有什么", 不改变已装软件版本。 真正动版本的是apt upgrade、dnf upgrade、pacman -Syu。 - Arch 只做一半最危险。
pacman -Sy之后去装一个新包, 可能出现"新包依赖的新版本库"与"系统里还是旧版本库"的错配(部分升级)。 Arch Wiki 的建议是: 任何安装/升级都写成pacman -Syu 包名一步到位。 - 卸载语义不同。
apt remove默认保留配置,apt purge才删配置;pacman -Rns默认连未用依赖和配置一起清(n清依赖、s清配置文件);dnf remove会移除"仅被该包依赖"的依赖包, 但保留配置。 迁移习惯时别想当然。
常见坑
- 在 Arch 上执行
pacman -Sy 包名做部分升级。 索引已刷新到最新而只装目标包, 新包依赖的库可能已升级、系统里其他旧软件还链着旧库, 造出一堆error while loading shared libraries。 正确写法是sudo pacman -Syu 包名一步完成; Arch Wiki 的官方立场是永远不要 partial upgrade。 - 把
apt update当成升级。update/makecache/-Sy只刷新本地索引(看最新菜单), 真正动版本的是apt upgrade、dnf upgrade、pacman -Su。 新换镜像源后必须先 update 再 install, 否则会提示找不到包或版本对不上。 - 直接删
/var/lib/dpkg/lock-frontend解锁。 锁文件存在说明另一个 apt/dpkg 正在跑(或上次被中断留下半配置状态)。 先ps确认并等它结束, 残留状态用sudo dpkg --configure -a修; 硬删锁会损坏 dpkg 数据库, 修复成本远高于等待。 - 生产环境不看变更列表就
apt full-upgrade/dnf upgrade -y。 大版本跳跃可能移除被依赖的包、改配置文件、重启服务。 先用apt list --upgradable/dnf check-update/pacman -Qu看清单, 重要包先apt-mark hold/dnf versionlock add钉死, 再在维护窗口执行。 - 无审阅安装 AUR/PPA 包。 AUR 是 PKGBUILD 构建脚本而非预编译二进制, PPA 同理由第三方维护。 安装前打开 PKGBUILD/包说明过目构建步骤; 生产服务器建议只用官方仓库 + EPEL 这类发行版背书的扩展源。
- 忘了三系包管理器互不通用。
apt只在 Debian/Ubuntu 上有、dnf/yum只在 RHEL 系、pacman只在 Arch。 拿着一系的命令到另一系只会得到command not found。 到陌生机器先cat /etc/os-release看ID字段再选工具, 或用本篇的六维对照表现场查。
常见问题
Q: Unable to lock the administration directory (/var/lib/dpkg/lock-frontend) 怎么办?
APT 被另一个进程占着。 先 ps aux | grep -E 'apt|dpkg' | grep -v grep 找出残留进程(常见于上次安装被 Ctrl+C 打断), 确认后结束它, 再执行 sudo dpkg --configure -a 和 sudo apt --fix-broken install。 不要直接删锁文件—— 那会损坏 dpkg 数据库。 DNF 对应锁是 /var/run/dnf.pid//var/cache/dnf/ 下的锁; pacman 报 unable to lock database 时同样先查有没有另一个 pacman 在跑。
Q:apt update 报 GPG error / NO_PUBKEY?
本地缺仓库的签名公钥, 说明源配置换过但没导入密钥。 Debian/Ubuntu 常见处理是 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 密钥ID(或按源文档把 .gpg 放进 /etc/apt/keyrings/ 并在 sources 里指定 signed-by=)。 Arch 若报 signature from ... is unknown trust, 检查系统时间是否正确(时间错乱会导致所有签名验证失败), 或按提示 pacman-key --populate archlinux。
Q:apt --fix-broken install 或 dnf distro-sync 也救不回来怎么办?
先确认故障范围: 是单个包的依赖环, 还是全系统状态错乱。 单包问题可尝试 dpkg -r --force-depends 包名 后重装; 全系统问题在 Debian 上可 apt full-upgrade, 在 RHEL 系可 dnf distro-sync --allowerasing, 在 Arch 上若因部分升级导致, 通常只能 pacman -Syu 把系统推到仓库当前状态(必要时从安装介质救援)。 动手前记录报错原文, 必要时做快照。
Q:装同一个软件,三系包名不一样怎么办?
很常见(如 iptables 在 Debian 叫 iptables, 文档示例包名可能对应 nmap/ripgrep 等在不同仓库略有差异)。 用各系的搜索命令先确认: apt search 关键词、 dnf search 关键词、 pacman -Ss 关键词; 不确定时以发行版官方 wiki/手册的包名为准, 不要照抄别的发行版教程。
Q:为什么 pacman -Ss 搜得到 AUR 里的软件,但 -S 装不了?
pacman 只认识官方仓库。 AUR 是社区构建脚本仓库, 需要 yay -S 软件名、 paru -S 软件名 这类助手, 或克隆 PKGBUILD 后 makepkg -si 手动构建。 AUR 包没有官方审核, 构建前务必过目 PKGBUILD 内容, 生产服务器谨慎使用。
Q:国内环境下更新源很慢?
三系都换国内镜像即可: Debian/Ubuntu 改 /etc/apt/sources.list(或 Ubuntu 的 sources.list.d/ubuntu.sources), RHEL 系改 /etc/yum.repos.d/*.repo 的 baseurl, Arch 改 /etc/pacman.d/mirrorlist(可用 reflector 自动筛选)。 换完记得刷新索引(apt update / dnf makecache / pacman -Syu)。
参考资料
- 鸟哥的私房菜 - 软件管理(RPM/DPKG/YUM) — linux.vbird.org
- Arch Wiki - Pacman — wiki.archlinux.org(含
-Syu、部分升级警告、缓存管理) - Arch Wiki - AUR — wiki.archlinux.org
- Arch Wiki - Mirrors — wiki.archlinux.org
- Debian 手册 - APT — debian.org
- Ubuntu - apt(8) 与包管理文档 — ubuntu.com
- Red Hat 文档 - Managing software with the DNF tool — docs.redhat.com
- Rocky Linux 文档 - 软件管理 — docs.rockylinux.org
- Fedora 文档 - DNF — docs.fedoraproject.org
man apt,man dpkg,man dnf,man rpm,man pacman