Linux 软件包管理:apt/dnf/pacman、软件仓库与依赖解析

深入 Linux 软件包管理:apt(Debian/Ubuntu)、dnf(RHEL/CentOS/Fedora)、pacman(Arch)三大包管理器的日常命令与原理,软件仓库与镜像源配置、依赖解析与冲突处理、GPG 签名与包安全、deb/rpm 自定义打包,通过对比掌握全系发行版的装包、升级、排错与安全实践。

引言

装软件是 Linux 管理的日常,但「装得上、升级好、卸得净、依赖不打架」是另一回事。三大发行版系各有包管理器:apt(Debian/Ubuntu 系)、dnf(RHEL/CentOS/Fedora 系)、pacman(Arch 系)。本文不罗列命令清单,而是讲透包管理的四件事:日常命令(装/升/卸/查)→ 软件仓库与镜像源 → 依赖解析与冲突 → GPG 签名与包安全,并覆盖 deb/rpm 自定义打包,最后给一张跨发行版的速查表。

前置:/linux-user-permissions/(安装需要 root)。装包权限与用户管理见该文;排错时的进程问题见 [[linux-process-management]]。


目录


1. 包管理系统全景:三大系对比

包管理器把「软件 + 依赖 + 元数据」打包成可安装的单元,三大系三套命令:

发行版系包格式包管理器仓库文件
Debian/Ubuntudebapt(dpkg 之上)/etc/apt/sources.list
RHEL/CentOS/Fedorarpmdnf(rpm 之上)/etc/yum.repos.d/
Archpkg.tar.zstpacman/etc/pacman.conf

心智:apt/dnf/pacman 是「前台」包管理器,dpkg/rpm 是「底层」——日常用前台(自动处理依赖),底层留给排错(dpkg -i / rpm -ivh 手动装)。底层命令全系通用,前台命令各系不同。


2. apt 实战:Debian/Ubuntu 系

apt 是 Debian/Ubuntu 的默认包管理器,日常命令:

# 更新索引 + 升级
sudo apt update          # 拉取仓库索引(装前先跑)
sudo apt upgrade         # 升级已装包(保守)
sudo apt full-upgrade    # 升级含依赖变更(激进)

# 安装/卸载/搜索
sudo apt install nginx   # 装包(自动拉依赖)
sudo apt remove nginx    # 卸载(保留配置)
sudo apt purge nginx     # 卸载(连配置一起删)
apt search nginx         # 搜索
apt show nginx           # 看包信息
apt list --installed     # 列出已装

# 清理
sudo apt autoremove      # 清孤儿依赖
sudo apt clean           # 清下载缓存

记忆:apt 的心法是「先 update 再 install」——update 刷新索引、install 基于最新索引解析依赖。忘了 update 就可能装到旧版或报「找不到包」。


3. dnf 实战:RHEL/CentOS/Fedora 系

dnf 是 RHEL 系的包管理器(替代老的 yum,用法兼容):

# 安装/卸载/搜索
sudo dnf install nginx   # 装包(自动解析依赖)
sudo dnf remove nginx    # 卸载
sudo dnf search nginx    # 搜索
sudo dnf info nginx      # 看包信息
sudo dnf list installed  # 列出已装

# 升级
sudo dnf check-update    # 检查可升级
sudo dnf upgrade         # 升级全部

# 历史与回滚
sudo dnf history         # 看操作历史
sudo dnf history undo <id>  # 回滚某次操作

对比:dnf 与 apt 命令几乎一一对应——install/remove/search/upgrade 同名同义。唯一特色是 dnf history undo(回滚历史),生产环境失误时可以「后悔药」式还原。


4. pacman 实战:Arch 系

pacman 是 Arch 的包管理器,命令更精简(无 sudo 前缀的习惯写法带 sudo):

# 安装/卸载/搜索
sudo pacman -S nginx     # 装包(-S 安装)
sudo pacman -R nginx     # 卸载
sudo pacman -Rns nginx   # 卸载+依赖+配置
pacman -Ss nginx         # 搜索(-Ss)
pacman -Si nginx         # 看信息

# 升级
sudo pacman -Syu         # 全系统升级(-Sy 同步 + -u 升级)

# 清理
sudo pacman -Sc          # 清缓存
sudo pacman -Q           # 列出已装(-Q 查询)

心法:pacman 用「参数字母」记忆——-S 安装、-R 移除、-Q 查询、-U 装本地包。-Syu 是全系统升级的固定组合,Arch 用户每天必按。


5. 软件仓库与镜像源配置

仓库(Repository)是包管理器的「货源」——软件从仓库列表下载:

# Debian/Ubuntu:/etc/apt/sources.list
deb http://archive.ubuntu.com/ubuntu/ noble main universe
# 每行一个源;国内常换阿里/清华镜像提速

# 换镜像通用做法:
#   备份原文件 → 替换域名 → apt update
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 把 archive.ubuntu.com 换成 mirrors.aliyun.com 等
sudo apt update
# RHEL 系:/etc/yum.repos.d/*.repo
sudo vim /etc/yum.repos.d/epel.repo
# 配置 baseurl 指向镜像
sudo dnf makecache       # 重建缓存
# Arch:/etc/pacman.d/mirrorlist
# 取消所需镜像的注释,即可切换
sudo pacman -Syu

记忆:换镜像 = 换「仓库地址」+ 重新「刷新索引」。镜像源是网络加速的关键——装包慢、超时,八成是仓库源的问题。


6. 依赖解析与冲突处理

依赖(dependency)是「装 A 要先装 B」——包管理器自动解析依赖树:

依赖解析流程:
  请求装 nginx
  → 发现需要 libc、openssl 等依赖
  → 递归解析每个依赖的依赖
  → 形成「安装计划」→ 下载 → 依次安装

常见依赖问题与解法:

问题现象解法
依赖冲突装 A 需要 libX 旧版,B 需要新版dnf history undo / 找兼容版
缺依赖手动装的包报「缺 xxx.so」安装对应开发包
循环依赖A 依赖 B,B 依赖 A两个包一起装(一次命令)
半安装中断导致依赖不完整sudo apt --fix-broken install
# 修复残缺依赖(apt 系)
sudo apt --fix-broken install
# 检查依赖(rpm 系)
rpm -q nginx && rpm -V nginx   # 校验已装包

心法:依赖冲突大多是「版本诉求不同」。包管理器能自动解的会解,解不了的看冲突提示——常是某个包锁了版本,先 dnf history / 检查 hold 状态再动。


7. GPG 签名与包安全

包管理器用 GPG 签名校验「包没被篡改」——每个仓库配一把公钥,下载的包验签:

包安全链路:
  软件官方签名 → 仓库发布 → 客户端下载 → GPG 验签 → 通过才安装
  验签失败 = 包可能被篡改 → 拒绝安装
# 导入仓库公钥(装第三方仓库时必须)
# Debian 系:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <KEY>
# 或用更现代的 .asc/.gpg 文件方式
curl -fsSL <url> | sudo gpg --dearmor -o /usr/share/keyrings/<name>.gpg

# Arch 系:
sudo pacman-key --recv-keys <KEY>
sudo pacman-key --lsign-key <KEY>

记忆:GPG 是包的「防伪标签」——装第三方仓库报「签名无效」,第一反应该是确认来源可信,而不是绕过验签(--no-check 是把安全关进黑洞,别用)。


8. 自定义打包:deb 与 rpm

自己打包 = 把编译好的程序+配置+脚本打包成可分发单元:

# deb 打包最小结构(Debian 系)
mydir/
  ├── DEBIAN/
  │   └── control        # 包名/版本/依赖元数据
  └── usr/
      └── bin/
          └── myapp      # 程序本体

# 构建
dpkg-deb --build mydir myapp_1.0.0_amd64.deb
# 安装
sudo dpkg -i myapp_1.0.0_amd64.deb
# rpm 打包(RHEL 系,用 rpmbuild)
rpmbuild -ba myapp.spec
# 安装
sudo rpm -ivh myapp-1.0.0-1.x86_64.rpm

记忆:打包的骨架 = 文件放对位置 + 元数据(control/spec)写对。团队内部分发内部工具,打一个小 deb/rpm 比散装源码省心得多。


9. 排错:锁、损坏与残留

包管理排错三板斧:

# 1. 锁问题(另一个 apt 在跑)
sudo rm /var/lib/dpkg/lock*    # 确认无其他进程才删锁
# 或等前一个进程结束(apt 有自锁,耐心等)

# 2. 损坏修复(apt 系)
sudo dpkg --configure -a       # 修复未完成配置
sudo apt --fix-broken install  # 修复依赖断裂

# 3. 残留清理
sudo apt autoremove            # 清孤儿依赖
# rpm 系:rpm -qa | grep <name> 查残留
# 看包文件装到了哪(定位排查)
dpkg -L nginx       # apt 系列文件
rpm -ql nginx       # rpm 系列文件
现象原因解法
锁被占用上次安装未完成确认后删锁/等结束
部分配置dpkg 中断dpkg --configure -a
依赖断裂手动删包apt --fix-broken
装到旧版没 update先 apt update 再装

记忆:排错顺序 = 锁(并发)→ 损坏(中断)→ 残留(孤儿)。绝大多数「包管理坏掉」都是这三类,按序排查比重装系统快。


10. 速查表

操作apt(Debian)dnf(RHEL)pacman(Arch)
更新索引apt updatednf makecachepacman -Sy
安装apt install xdnf install xpacman -S x
卸载apt remove xdnf remove xpacman -R x
搜索apt search xdnf search xpacman -Ss x
全量升级apt upgradednf upgradepacman -Syu
列已装apt list --installeddnf list installedpacman -Q
修复--fix-brokenhistory undo手动重装
底层dpkg -irpm -ivhpacman -U

一句话记忆:apt/dnf/pacman 是同一件事的三种方言——装(install/-S)、卸(remove/-R)、升(upgrade/-Syu)、查(search/-Ss);仓库、依赖、GPG 校验三大机制全系通用,会一个系就能举一反三。


延伸阅读

  • /linux-user-permissions/ — root 权限与 sudo 管理
  • /linux-security-hardening/ — 系统安全加固(含包更新策略)
  • /linux-process-management/ — 装包后服务/进程管理
  • /linux-performance-tuning/ — 更新换代与性能
  • [[docker]] — 容器替代包管理做环境隔离

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「linux」更多文章

  1. Linux 日志管理:rsyslog 集中收集、logrotate 轮转与日志分析
  2. Linux SSH 服务与隧道:sshd 配置、密钥认证、端口转发与安全加固
  3. Linux DNS 与 DHCP 服务:BIND/dnsmasq、zone 文件与解析排错