| 核心结论 | 说明 |
|---|---|
| RPM / DEB 是包格式,也是底层包管理体系 | 负责安装、卸载、查询本地包,但依赖处理能力有限 |
| YUM / DNF / APT 是仓库管理器 | 负责从远程仓库解析依赖、下载软件包、统一升级 |
| DNF 是 YUM 的下一代实现 | RHEL 8+ / Fedora 默认使用 DNF,命令兼容大部分 YUM 用法 |
| Snap / Flatpak / AppImage 偏应用分发 | 更适合桌面应用或跨发行版分发,不是传统系统包管理的完全替代 |
生产环境不建议随意 update/upgrade 全量升级 | 应固定仓库、固定版本、先测试再发布 |
1.简介
Linux 安装软件时,容易混淆几个概念:
rpm、dpkg是什么;yum、dnf、apt有什么区别;- 为什么手动安装
.rpm/.deb经常报依赖错误; - 为什么同一个软件在 CentOS、Ubuntu、Fedora 上安装命令不同;
- Snap、Flatpak、AppImage 和传统包管理器是什么关系。
本文按“包格式 → 本地包管理器 → 仓库管理器 → 应用分发方式”的顺序梳理。
2.说明
2.1 包管理分层
Linux 包管理可以分为三层:
| 层级 | 作用 | RPM 系 | Debian 系 |
|---|---|---|---|
| 包文件格式 | 单个软件包文件 | .rpm | .deb |
| 本地包管理器 | 安装、卸载、查询本地包 | rpm | dpkg |
| 仓库管理器 | 解析依赖、下载、升级 | yum / dnf | apt |
.rpm / .deb 时,依赖通常需要自己解决;通过 yum/dnf/apt 安装时,依赖由仓库管理器解析。2.2 RPM 系:CentOS / RHEL / Fedora
2.2.1 rpm:底层包管理器
rpm 负责安装、卸载、升级、查询 RPM 包。它会维护本机软件包数据库,记录软件版本、文件列表、依赖关系等信息。
常用命令:
| 命令 | 作用 |
|---|---|
rpm -ivh package.rpm | 安装 RPM 包 |
rpm -Uvh package.rpm | 升级 RPM 包,如果未安装则安装 |
rpm -Fvh package.rpm | 只升级已安装的软件包 |
rpm -e package | 卸载软件包 |
rpm -qa | 列出已安装的所有 RPM 包 |
rpm -qi package | 查看已安装包信息 |
rpm -ql package | 查看软件包安装了哪些文件 |
rpm -qf /path/file | 查询某个文件属于哪个 RPM 包 |
rpm -qpi package.rpm | 查看未安装 RPM 包的信息 |
rpm -qpl package.rpm | 查看未安装 RPM 包包含哪些文件 |
rpm -V package | 校验已安装文件是否被修改 |
常见问题:
| |
原因:rpm 知道依赖缺失,但不会自动从远程仓库把依赖全部下载并安装。
2.2.2 yum:仓库管理器
yum 在 rpm 之上增加了仓库和依赖解析能力。用户只需要声明要安装的软件,yum 会根据仓库元数据计算依赖并下载。
常用命令:
| 命令 | 作用 |
|---|---|
yum repolist | 查看启用的仓库 |
yum repolist all | 查看所有仓库 |
yum list installed | 查看已安装软件包 |
yum list available | 查看仓库可安装软件包 |
yum info package | 查看软件包信息 |
yum install package | 安装软件包 |
yum reinstall package | 重新安装软件包 |
yum update package | 升级指定软件包 |
yum update | 升级所有可升级软件包 |
yum remove package | 卸载软件包 |
yum clean all | 清理缓存 |
yum makecache | 重建仓库缓存 |
yum provides */command | 查询哪个包提供某个命令或文件 |
yum history | 查看安装/升级历史 |
仓库配置文件通常位于:
| |
示例:
| |
2.2.3 dnf:YUM v4
dnf 是 yum 的下一代实现,RHEL 8+、Fedora 默认使用。相比传统 yum,dnf 依赖解析更稳定,性能更好,API 也更清晰。
多数命令可直接替换:
| |
在 RHEL 8+ 中,很多系统上的 yum 实际已经是 dnf 的兼容入口。
2.3 Debian 系:Debian / Ubuntu
2.3.1 dpkg:底层包管理器
dpkg 负责安装、卸载、查询 .deb 包。它类似 RPM 系中的 rpm。
常用命令:
| 命令 | 作用 |
|---|---|
dpkg -i package.deb | 安装 DEB 包 |
dpkg -r package | 卸载软件包,保留配置 |
dpkg -P package | 卸载软件包并删除配置 |
dpkg -l | 查看已安装包列表 |
dpkg -s package | 查看包状态和信息 |
dpkg -L package | 查看软件包安装了哪些文件 |
dpkg -S /path/file | 查询文件属于哪个 DEB 包 |
常见依赖问题:
| |
修复方式:
| |
apt -f install 会尝试修复依赖关系,安装缺失依赖或移除不完整包。
2.3.2 apt:仓库管理器
apt 是 Debian 系常用的仓库管理器,负责解析依赖、下载软件包、升级系统。
常用命令:
| 命令 | 作用 |
|---|---|
apt update | 更新仓库索引 |
apt install package | 安装软件包 |
apt reinstall package | 重新安装软件包 |
apt remove package | 卸载软件包,保留配置 |
apt purge package | 卸载软件包并删除配置 |
apt upgrade | 升级已安装软件包,不主动移除包 |
apt full-upgrade | 升级系统,必要时可移除或安装包 |
apt autoremove | 删除不再需要的依赖包 |
apt search keyword | 搜索软件包 |
apt show package | 查看软件包信息 |
apt list --installed | 查看已安装包 |
仓库配置文件:
| |
Ubuntu 22.04 常见源格式:
| |
需要注意:
apt update只更新索引,不升级软件;apt upgrade才会升级软件;apt full-upgrade可能移除包,生产环境需要谨慎;- 脚本中更建议使用
apt-get,交互使用可以用apt。
2.4 Snap / Flatpak / AppImage
这些工具更偏应用分发,不是传统系统包管理器的完全替代。
| 工具 | 特点 | 常见场景 |
|---|---|---|
| Snap | Canonical 主导,应用和依赖打包,沙箱运行 | Ubuntu 桌面应用、跨发行版应用 |
| Flatpak | 桌面应用分发,依赖运行时 | Linux 桌面应用 |
| AppImage | 单文件运行,不强依赖系统安装 | 便携式桌面软件 |
它们解决的问题:
- 不同发行版依赖版本不一致;
- 软件需要快速分发到多个发行版;
- 桌面应用不想依赖系统仓库版本。
它们带来的问题:
- 体积更大;
- 与系统服务集成不如原生包;
- 沙箱权限、自动更新、路径管理需要额外关注。
2.5 常见排查命令
2.5.1 查询命令来自哪个包
RPM 系:
| |
Debian 系:
| |
apt-file 需要额外安装并更新索引:
| |
2.5.2 查询包安装了哪些文件
RPM 系:
| |
Debian 系:
| |
2.5.3 查询本机安装了哪些包
RPM 系:
| |
Debian 系:
| |
2.5.4 清理缓存
RPM 系:
| |
Debian 系:
| |
区别:
| 命令 | 说明 |
|---|---|
apt clean | 删除本地所有已下载 .deb 缓存 |
apt autoclean | 只删除已经无法从仓库下载的旧包缓存 |
2.6 镜像源与离线源
生产环境常见两类需求:
| 场景 | 目标 | 典型做法 |
|---|---|---|
| 使用镜像源 | 加速下载、降低外网依赖 | 替换为公司内网源或可信公共镜像源 |
| 自建离线源 | 无外网环境安装软件 | 缓存完整软件包和仓库元数据 |
2.6.1 使用镜像源
镜像源本质是把包管理器的远程仓库地址换成更近、更稳定、可控的地址。
Debian / Ubuntu 修改 APT 源:
| |
示例格式:
| |
RHEL / CentOS 修改 YUM / DNF 源:
| |
示例格式:
| |
需要注意:
- 不建议混用多个发行版源,例如 Ubuntu 22.04 混入 20.04 源;
- 不建议随意关闭
gpgcheck,除非是临时排障; - 生产环境建议固定镜像源快照,避免今天装和明天装的软件版本不同。
2.6.2 缓存 RPM 离线源
RPM 系离线源需要两部分:
- RPM 包文件;
- 仓库元数据,也就是
repodata/。
在线机器下载包和依赖:
| |
如果只下载指定软件及其依赖,可以使用:
| |
生成仓库元数据:
| |
离线机器配置本地仓库:
| |
刷新缓存并安装:
| |
2.6.3 缓存 DEB 离线源
Debian / Ubuntu 离线安装也需要两部分:
.deb包文件;Packages索引文件。
在线机器下载指定软件及依赖:
| |
上面方式适合简单依赖,复杂场景建议使用 apt-mirror、aptly 或在同版本干净机器上执行 apt-get --download-only install。
| |
生成本地索引:
| |
离线机器配置本地源:
| |
刷新索引并安装:
| |
2.7 生产环境建议
| 场景 | 建议 |
|---|---|
| 安装服务 | 优先使用发行版官方仓库或可信内部仓库 |
| 固定版本 | 使用版本号安装,避免无意升级 |
| 批量机器 | 建议建设内部镜像源,减少外网依赖 |
| 容器镜像 | Dockerfile 中固定基础镜像版本和包版本 |
| 安全更新 | 先测试,再分批升级 |
| 离线环境 | 准备完整依赖包和仓库元数据,不要只拷贝单个 rpm/deb |
不建议生产环境直接执行:
| |
更稳妥的方式:
- 确认升级范围;
- 在测试环境验证;
- 备份配置和数据;
- 分批升级;
- 保留回滚方案。
3.总结
- RPM / DEB 是软件包格式,
rpm/dpkg是底层包管理器,主要负责本地包安装、卸载、查询; yum/dnf/apt是仓库管理器,核心价值是依赖解析、远程下载、统一升级;- RHEL 8+ 默认使用 DNF,Ubuntu / Debian 使用 APT;
- Snap / Flatpak / AppImage 更偏应用分发,适合桌面软件或跨发行版分发;
- 镜像源用于加速和统一来源,离线源必须同时准备软件包和仓库元数据;
- 生产环境安装软件时,重点不是命令本身,而是仓库来源、版本固定、升级策略和回滚方案。