深色模式
Linux 分类与包管理
概述
Linux 相关资料里,最容易把人讲晕的往往不是命令本身,而是名字之间的关系。Debian、Ubuntu、RHEL、CentOS、Fedora 是发行版;deb、rpm 是包格式;dpkg、rpm 是底层包管理工具;apt、dnf、yum 又是更上一层的前端工具。它们经常一起出现,但不是同一层概念。
如果这几层没分开,遇到安装软件的问题时就会很容易发懵:到底该下 rpm 包还是 deb 包,当前系统该用 apt 还是 yum,dpkg 和 apt 到底谁管谁。把这张关系图理顺以后,很多问题其实都很好判断。
先说清 Linux 里的“分类”在分什么
平时说 Linux 分类,通常不是在分 Linux 内核本身,而是在分 Linux 发行版。
发行版可以理解成“在 Linux 内核之上,配好用户空间、软件仓库、安装方式和系统工具的一整套系统”。所以日常真正打交道的往往不是抽象的 Linux,而是某个具体发行版,例如:
- Debian
- Ubuntu
- Fedora
- RHEL
- Rocky Linux
- AlmaLinux
- openSUSE
不同发行版之间,桌面环境、服务管理方式、默认配置习惯会有差异,但最常影响日常操作的,通常还是包管理体系。
包管理为什么这么重要
Linux 上安装软件,常见方式当然不只一种,源码编译、脚本安装、二进制解压都算。
但对大多数系统来说,最稳定、最省心的方式还是通过发行版自己的包管理体系安装。原因很直接:
- 依赖关系会一起处理
- 升级和卸载更规范
- 文件放置路径更符合系统习惯
- 安全更新更容易统一管理
所以讨论 Linux 分类时,经常会顺带落到包管理上,因为这正是最有操作意义的一层。
先分两大常见体系
从包管理体系看,最常见的主线可以先分成两类:
deb系rpm系
这不是说 Linux 世界只有这两种,只是它们覆盖了最常见的服务器和桌面发行版,足够作为入门主线。
deb 系常见发行版
deb 系的代表通常是 Debian 一脉,常见发行版有:
- Debian
- Ubuntu
- Linux Mint
这类系统的软件包格式通常是:
text
.deb底层包管理工具通常是:
text
dpkg而日常更常直接使用的前端工具通常是:
text
apt如果只想先记一句最常用的判断,那就是:看到 Debian 或 Ubuntu,大概率先想到 apt。
rpm 系常见发行版
rpm 系的代表通常是 Red Hat 一脉,常见发行版有:
- RHEL
- CentOS
- Fedora
- Rocky Linux
- AlmaLinux
这类系统的软件包格式通常是:
text
.rpm底层包管理工具通常是:
text
rpm而日常更常直接使用的前端工具,则常见是:
yumdnf
如果只记一个实用判断,那就是:看到 RHEL、CentOS、Fedora 这一路,通常先想到 rpm 系工具。
包格式、底层工具、前端工具不是一回事
这是最值得单独拎出来讲清的一点。
可以先这样看:
| 层次 | deb 系 | rpm 系 |
|---|---|---|
| 包格式 | .deb | .rpm |
| 底层工具 | dpkg | rpm |
| 常用前端 | apt | dnf / yum |
这张表里的三层不要混。
例如在 Debian / Ubuntu 上:
dpkg更偏底层,负责直接安装、卸载、查询本地.deb包apt更偏日常,负责和软件仓库打交道、处理依赖、更新包索引
在 RHEL / Fedora 一系里也类似:
rpm更偏底层dnf或yum更偏日常使用
所以“apt 基于 dpkg”这种说法是对的,但不能把它们当成同一层工具。
为什么平时更常直接用 apt、dnf、yum
因为真正日常安装软件时,麻烦通常不在“把一个包文件塞进系统”,而在“这个包还依赖哪些别的包、仓库里有没有更新、升级时要不要一起处理其他依赖”。
这类事情,前端包管理工具更擅长。
例如在 Debian / Ubuntu 上,日常更常见的是:
sh
sudo apt update
sudo apt install nginx而不是直接手敲:
sh
sudo dpkg -i nginx.deb同理,在 Fedora / RHEL 一系上,日常更常见的是:
sh
sudo dnf install nginx或者在旧一点的系统上:
sh
sudo yum install nginx因为这类命令会顺手帮忙解决依赖关系,不需要自己一个个补包。
apt 和 dpkg 的关系
可以把它理解成:
dpkg管本地.deb包apt管仓库、依赖和更高层的安装体验
例如:
sh
sudo dpkg -i package.deb适合“手里已经有一个本地 .deb 文件,想直接装进去”。
而:
sh
sudo apt install nginx更适合“从仓库里安装一个软件,并让系统帮忙处理依赖”。
这也是为什么很多时候安装本地 .deb 包后,如果依赖没补齐,还得再跑一轮 apt 来修依赖。
rpm 和 yum / dnf 的关系
这一组也类似:
rpm更偏底层yum/dnf更偏高层包管理
例如:
sh
sudo rpm -ivh package.rpm适合手头有本地 .rpm 包时直接安装。
但日常从仓库装软件时,更常见的是:
sh
sudo dnf install nginx或者:
sh
sudo yum install nginx这里还要补一句现实情况:在较新的 Fedora、RHEL、Rocky Linux、AlmaLinux 环境里,dnf 更常见;yum 更多出现在旧版系统或兼容语境里。
一个最常见的实际问题:当前系统到底该用哪个命令
最直接的判断方式通常不是猜,而是看发行版信息:
sh
cat /etc/os-release如果输出里明显是 Debian / Ubuntu,一般优先考虑:
sh
apt如果输出里明显是 Fedora / RHEL / Rocky / AlmaLinux,一般优先考虑:
sh
dnf或在老系统里考虑:
sh
yum这比背一堆家谱更实用。多数时候,先把当前系统认对,命令就不会选错。
不要把源码包和系统包混为一谈
很多文章讲包管理时,喜欢顺手提一句“也支持 tar 包”。这句话不算错,但很容易把层次讲乱。
像:
text
.tar.gz这类源码包或通用压缩包,和 .deb、.rpm 不是同一层概念。它们通常不属于发行版原生包管理体系本身。
解压源码包、编译安装,当然也是 Linux 常见做法,但那已经是另一条安装路径,不等于“系统包管理器支持它们,就和 .deb、.rpm 完全同类”。
一张够用的判断表
| 看到什么 | 先想到什么 |
|---|---|
| Debian / Ubuntu | apt、.deb、dpkg |
| Fedora / RHEL / Rocky / AlmaLinux | dnf 或 yum、.rpm、rpm |
手里是本地 .deb 文件 | 可能会用 dpkg 或 apt 安装 |
手里是本地 .rpm 文件 | 可能会用 rpm、dnf 或 yum 安装 |
| 要从官方仓库装软件 | 优先用 apt、dnf、yum 这类高层工具 |
如果这张表已经能顺手用出来,Linux 包管理这件事就已经过了最容易混淆的阶段。
