引言
装软件是 Linux 管理的日常,但「装得上、升级好、卸得净、依赖不打架」是另一回事。三大发行版系各有包管理器:apt(Debian/Ubuntu 系)、dnf(RHEL/CentOS/Fedora 系)、pacman(Arch 系)。本文不罗列命令清单,而是讲透包管理的四件事:日常命令(装/升/卸/查)→ 软件仓库与镜像源 → 依赖解析与冲突 → GPG 签名与包安全,并覆盖 deb/rpm 自定义打包,最后给一张跨发行版的速查表。
前置:/linux-user-permissions/(安装需要 root)。装包权限与用户管理见该文;排错时的进程问题见 [[linux-process-management]]。
目录
- 1. 包管理系统全景:三大系对比
- 2. apt 实战:Debian/Ubuntu 系
- 3. dnf 实战:RHEL/CentOS/Fedora 系
- 4. pacman 实战:Arch 系
- 5. 软件仓库与镜像源配置
- 6. 依赖解析与冲突处理
- 7. GPG 签名与包安全
- 8. 自定义打包:deb 与 rpm
- 9. 排错:锁、损坏与残留
- 10. 速查表
- 延伸阅读
1. 包管理系统全景:三大系对比
包管理器把「软件 + 依赖 + 元数据」打包成可安装的单元,三大系三套命令:
| 发行版系 | 包格式 | 包管理器 | 仓库文件 |
|---|---|---|---|
| Debian/Ubuntu | deb | apt(dpkg 之上) | /etc/apt/sources.list |
| RHEL/CentOS/Fedora | rpm | dnf(rpm 之上) | /etc/yum.repos.d/ |
| Arch | pkg.tar.zst | pacman | /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 update | dnf makecache | pacman -Sy |
| 安装 | apt install x | dnf install x | pacman -S x |
| 卸载 | apt remove x | dnf remove x | pacman -R x |
| 搜索 | apt search x | dnf search x | pacman -Ss x |
| 全量升级 | apt upgrade | dnf upgrade | pacman -Syu |
| 列已装 | apt list --installed | dnf list installed | pacman -Q |
| 修复 | --fix-broken | history undo | 手动重装 |
| 底层 | dpkg -i | rpm -ivh | pacman -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]] — 容器替代包管理做环境隔离
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。