LinuxNotes

第 05 章:软件包管理

zjc 于 2026-01-05 发布

这是《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 的配置命令参数有差异,以当前系统文档为准。

生产原则:

  1. 使用可信内部镜像源;
  2. 固定基础镜像;
  3. 关键组件版本显式声明;
  4. 避免混用不稳定第三方仓库;
  5. 仓库变更走配置管理;
  6. 保留离线安装包。

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

源码安装的问题:

  1. 不进入包管理数据库;
  2. 依赖和补丁难治理;
  3. 升级和卸载成本高;
  4. 编译参数容易漂移;
  5. 安全漏洞难跟踪。

如果必须源码安装,应记录:

源码版本
下载地址与校验值
编译参数
编译环境
安装路径
回滚方式

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/*

原则:

  1. 基础镜像固定摘要或版本;
  2. 清理包缓存;
  3. 合并安装层;
  4. 不在运行容器里长期手工装包;
  5. 镜像构建可重复;
  6. 依赖变更走代码评审。

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 的命令不同,但都要回答版本、来源、依赖、配置文件和回滚方式。生产环境应使用可信仓库、固定关键版本、锁定不需要自动升级的包,并通过测试和监控完成升级闭环。

思考题

  1. 为什么日常安装优先用 apt / dnf 而不是 dpkg / rpm
  2. removepurge 的区别是什么?
  3. 如何查询某个文件属于哪个包?
  4. 版本锁定有哪些收益和风险?
  5. 设计一个 Nginx 安全补丁的升级和回滚流程。