这是《Linux 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 软件包管理负责安装、升级、回滚、依赖解析和仓库配置。不同发行版使用不同工具,但核心问题一致:软件从哪里来,版本是什么,依赖是否完整,升级是否可回滚。
5.1 包管理体系
| 发行版 | 底层工具 | 高层工具 | 包格式 |
|---|---|---|---|
| Debian / Ubuntu | dpkg |
apt |
.deb |
| RHEL / CentOS / Rocky / Alma | rpm |
dnf / yum |
.rpm |
| Alpine | apk |
apk |
.apk |
| openSUSE | rpm |
zypper |
.rpm |
底层工具直接操作包文件,高层工具会处理仓库和依赖。日常安装优先使用高层工具。
5.2 APT 常用操作
更新索引:
sudo apt update
查看可用升级:
apt list --upgradable
升级:
sudo apt upgrade
sudo apt full-upgrade
安装与删除:
sudo apt install nginx
sudo apt install nginx=1.24.0-1
sudo apt reinstall nginx
sudo apt remove nginx
sudo apt purge nginx
sudo apt autoremove
查询:
apt search redis
apt show nginx
dpkg -l | grep nginx
dpkg -L nginx
dpkg -S /usr/sbin/nginx
dpkg -s nginx
清理缓存:
sudo apt clean
sudo apt autoclean
保存下载包:
/var/cache/apt/archives/
5.3 DNF / YUM 常用操作
sudo dnf check-update
sudo dnf update
sudo dnf install nginx
sudo dnf reinstall nginx
sudo dnf remove nginx
sudo dnf autoremove
查询:
dnf search redis
dnf info nginx
dnf list installed | grep nginx
dnf repoquery -l nginx
dnf provides '*/nginx'
rpm -qa | grep nginx
rpm -qi nginx
rpm -ql nginx
rpm -qf /usr/sbin/nginx
历史与回滚:
sudo dnf history
sudo dnf history info <id>
sudo dnf history undo <id>
回滚会重新计算依赖,不一定总是可用。关键服务升级前必须准备独立回滚方案。
5.4 仓库与优先级
APT 配置:
/etc/apt/sources.list
/etc/apt/sources.list.d/*.list
查看仓库:
grep -R '^deb ' /etc/apt/sources.list /etc/apt/sources.list.d
DNF 配置:
/etc/yum.repos.d/*.repo
查看仓库:
dnf repolist
dnf repoinfo
启用或禁用仓库:
sudo dnf config-manager --set-enabled extras
sudo dnf config-manager --set-disabled extras
不同版本 DNF 的配置命令参数有差异,以当前系统文档为准。
生产原则:
- 使用可信内部镜像源;
- 固定基础镜像;
- 关键组件版本显式声明;
- 避免混用不稳定第三方仓库;
- 仓库变更走配置管理;
- 保留离线安装包。
5.5 本地包安装
APT:
sudo apt download nginx
sudo dpkg -i nginx.deb
sudo apt -f install
DNF:
sudo dnf download nginx
sudo dnf install ./nginx.rpm
RPM 直接安装:
sudo rpm -ivh nginx.rpm
sudo rpm -Uvh nginx.rpm
推荐使用 dnf install ./file.rpm,让工具自动处理依赖。
5.6 版本锁定
APT:
sudo apt-mark hold nginx
apt-mark showhold
sudo apt-mark unhold nginx
DNF:
sudo dnf install versionlock
sudo dnf versionlock add nginx
sudo dnf versionlock list
sudo dnf versionlock delete nginx
锁定可以防止意外升级,但不能替代变更管理。安全补丁仍需按流程评估。
5.7 验证包完整性
APT:
apt-key list
sudo apt update
新版 APT 使用签名文件,不建议继续新增 apt-key 管理密钥,具体以发行版文档为准。
DNF:
rpm --import repomd.xml.key
rpm -checksig nginx.rpm
rpm -K nginx.rpm
校验已安装文件:
rpm -V nginx
dpkg --verify nginx
输出差异可能来自配置变更,也可能是入侵痕迹。对系统二进制被修改的情况,应按安全事件处理。
5.8 源码与二进制安装
常见方式:
系统包
-> 官方二进制包
-> 容器镜像
-> 源码编译
源码编译流程:
./configure --prefix=/opt/app
make -j"$(nproc)"
sudo make install
源码安装的问题:
- 不进入包管理数据库;
- 依赖和补丁难治理;
- 升级和卸载成本高;
- 编译参数容易漂移;
- 安全漏洞难跟踪。
如果必须源码安装,应记录:
源码版本
下载地址与校验值
编译参数
编译环境
安装路径
回滚方式
5.9 生产升级流程
升级前:
1. 明确目标版本和变更窗口
2. 阅读官方 changelog 和 breaking change
3. 确认依赖影响
4. 测试环境验证
5. 备份配置和数据
6. 准备回滚包
7. 确认监控和值班人员
升级中:
dpkg -l | grep nginx
sudo cp -a /etc/nginx /etc/nginx.bak.$(date +%F-%H%M)
sudo apt install nginx
升级后:
nginx -t
systemctl status nginx
journalctl -u nginx -n 100
ss -lntp | grep ':443'
验证:
1. 进程正常
2. 端口监听
3. 健康检查通过
4. 核心接口成功
5. 错误率无异常
6. 性能指标无异常
5.10 容器中的包管理
Dockerfile 示例:
FROM ubuntu:24.04
RUN apt update && \
apt install -y --no-install-recommends curl ca-certificates && \
rm -rf /var/lib/apt/lists/*
原则:
- 基础镜像固定摘要或版本;
- 清理包缓存;
- 合并安装层;
- 不在运行容器里长期手工装包;
- 镜像构建可重复;
- 依赖变更走代码评审。
5.11 常见问题
依赖冲突
sudo dnf check
sudo apt --fix-broken install
dnf repoquery --requires nginx
apt show nginx
处理前不要强行删除基础库,应先确认冲突仓库和目标版本。
磁盘不足
df -h
sudo dnf clean all
sudo apt clean
包被进程占用
lsof | grep /usr/sbin/nginx
systemctl status nginx
多数包管理器会安排服务重启或提示。生产升级应显式控制重启时机。
本章小结
软件包管理的核心是可重复、可验证、可回滚。APT、DNF、RPM 和 dpkg 的命令不同,但都要回答版本、来源、依赖、配置文件和回滚方式。生产环境应使用可信仓库、固定关键版本、锁定不需要自动升级的包,并通过测试和监控完成升级闭环。
思考题
- 为什么日常安装优先用
apt/dnf而不是dpkg/rpm? remove和purge的区别是什么?- 如何查询某个文件属于哪个包?
- 版本锁定有哪些收益和风险?
- 设计一个 Nginx 安全补丁的升级和回滚流程。