下面这篇算是一篇"科普 + 入门扫盲",会分块来讲,方便你理解和以后查阅:
一、为什么会出现 rpm 系和 debian 系这两个大阵营?
1.1 背景:Linux 只是内核,不是"完整系统"
- Linux 严格来说只是内核(kernel),没有软件管理、没有桌面、没有包管理。
- 真正给你能用的"系统"是各种发行版(distribution),比如:
- Debian、Ubuntu、Linux Mint...
- Red Hat、CentOS、Fedora、openSUSE...
- 这些发行版要解决一个核心问题:如何统一地安装、升级、卸载软件?
→ 于是就有了"包管理系统"。
1.2 两大主流:RPM 系与 Debian 系
历史上,各家厂商和社区在设计"包管理系统"时,走了两条主路线:
-
Debian 系
- 包格式:
.deb - 底层包工具:
dpkg - 典型发行版:Debian、Ubuntu、Linux Mint、Kali、Raspbian 等
- 起源:Debian 项目是最早的社区驱动发行版之一,非常注重自由软件理念和社区规范。
- 包格式:
-
RPM 系
- 包格式:
.rpm - 底层包工具:
rpm - 典型发行版:Red Hat Enterprise Linux (RHEL)、CentOS Stream、Fedora、openSUSE、AlmaLinux、Rocky Linux 等
- 起源:最早由 Red Hat 提出并开源,后来被 SuSE 等其他发行版采用。
- 包格式:
为什么会有两套?
本质上是历史演进 + 社区/公司各自独立发展:
- 早期并没有统一标准,各家自己发挥;
- Debian 有自己的一套规范(Debian Policy),Red Hat 也有自己对企业市场的考量(稳定性、商业支持);
- 两边都积累了庞大的生态、工具链和用户群,很难也没必要强行统一。
目前的现实:
- Linux 发行版绝大部分都属于这两个阵营之一。
- 学会这两套,你基本上就能搞定主流 Linux 世界的包管理。
二、rpm 系和 debian 系的核心差异:从"包"讲起
2.1 包格式与底层工具
-
Debian 系
- 包:
.deb - 底层工具:
dpkg - 高层前端:
apt、apt-get、aptitude等
- 包:
-
RPM 系
- 包:
.rpm - 底层工具:
rpm - 高层前端:
yum(较旧)、dnf(新一代)、zypper(openSUSE)
- 包:
可以这么理解:
dpkg/rpm:纯粹对"本地包文件"做安装/卸载,不自动解决依赖。apt/yum/dnf/zypper:在dpkg/rpm之上做"依赖解析 + 仓库管理"。
2.2 包内部结构与元数据(粗略理解即可)
两家在"包里面存什么信息"上有异曲同工之处,都包含:
- 二进制文件/库文件
- 配置文件
- 依赖信息(需要哪些包)
- 安装前/安装后脚本(preinst/postinst、pre/post scripts)
只是格式和规范不同:
.deb:基于 ar 格式的归档,里边有control.tar.*、data.tar.*等。.rpm:有 spec 描述文件,构建后生成 rpm,元数据用自己的结构存储。
对普通用户来说:知道"这俩互不兼容"就够了。
Deb 系不直接安装 .rpm,RPM 系不直接安装 .deb。
(虽然有 alien 之类的转换工具,但不推荐在正式环境这么干)
三、两大阵营在使用上的主要区别
下面用"日常运维/开发者视角"来比较:
3.1 软件安装与升级命令
Debian 系(以 Ubuntu 为例)
bash
# 更新软件源索引
sudo apt update
# 升级已经安装的软件
sudo apt upgrade
# 安装软件
sudo apt install nginx
# 卸载软件(保留配置文件)
sudo apt remove nginx
# 卸载软件并删除配置文件
sudo apt purge nginx
# 安装本地 .deb 文件
sudo dpkg -i xxx.deb
RPM 系(以 RHEL/CentOS/Fedora 为例)
bash
# 更新软件包索引 + 升级(yum/dnf 习惯上合在一起)
sudo dnf update
# 或更接近旧习惯的
sudo yum update
# 安装软件
sudo dnf install nginx
# 卸载软件
sudo dnf remove nginx
# 安装本地 .rpm 文件
sudo rpm -ivh xxx.rpm
可以看到:
- 概念上类似:都有"底层工具 + 高级前端"。
- 语法风格略有不同,但本质都在做:包查询 → 依赖解析 → 下载 → 安装。
3.2 仓库与软件源配置方式
Debian 系
- 配置文件主要在:
/etc/apt/sources.list/etc/apt/sources.list.d/*.list
- 官方源 + PPA(Ubuntu 特有) + 第三方源(比如 Docker 的源、NodeSource 等)。
例子(Ubuntu):
text
deb http://cn.archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
RPM 系
- RHEL/CentOS/Fedora:源配置在:
/etc/yum.repos.d/*.repo
- SUSE/openSUSE:
zypper使用/etc/zypp/repos.d/*.repo
例子(CentOS/RHEL 系):
ini
[base]
name=CentOS-$releasever - Base
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
enabled=1
gpgcheck=1
差异在于:
- Debian 系世界常说"apt 源 / 软件源";
- RPM 系世界常说"repo"(仓库配置文件
[name]段)。
本质上是类似的概念,只是文件格式与命名习惯不同。
3.3 依赖解决与冲突管理
- 两边都有依赖解决机制:
- apt 使用
libapt-pkg - yum/dnf 使用
libsolv等进行 SAT 求解
- apt 使用
- 实际使用体验上,都可以做到:
- 自动拉依赖
- 自动卸载不需要的依赖(
apt autoremove、dnf autoremove)
细微差别:
- RPM 系在某些复杂依赖和冲突场景下解决策略不同,因此老一代 RHEL/CentOS 上有时候会碰到"依赖地狱"的印象,但随着
dnf的采用,这方面已经改善很多。 - Debian/Ubuntu 上
apt的一大优势是生态极其庞大、包统一程度高、依赖元数据普遍比较规范。
但对普通用户而言:
只要用官方源 + 常见第三方源,两边体验差异不大。
四、理念和生态层面的区别
4.1 社区驱动 vs 企业驱动(传统印象)
Debian 系:
- Debian 本身完全社区驱动,有严格的社会契约、自由软件指导原则。
- Ubuntu 由 Canonical 公司主导,但仍然建立在 Debian 基础上。
- 整体更"社区化",常被用于个人桌面、科研、开发、教育等场景。
RPM 系:
- RHEL 是 Red Hat(现已属于 IBM) 的企业产品,有明确的商业支持和认证体系。
- CentOS 历史上是 RHEL 源码重编译的社区版,现在变成了 CentOS Stream,更偏向"RHEL 下游/上游中间态"。
- openSUSE 与 SUSE Linux Enterprise 形成类似关系。
- 更传统地面向企业服务器、数据中心、生产环境。
如今这种边界越来越模糊:
- 企业也在用 Ubuntu LTS 做服务器;
- 很多个人用户会用 Fedora、openSUSE 做桌面系统。
但历史印象和"生态定位"还是有点差异:
- 想做"严肃的企业环境、要官方认证支持" → 往 RPM 家族(RHEL/SUSE)偏。
- 想要广泛的开源社区生态、包多、教程多 → Debian/Ubuntu 世界非常强势。
4.2 默认配置风格和打包哲学
整体来说(有一定概括性,不是绝对):
-
Debian 系:
- 打包时倾向于尽可能贴近"上游项目"的默认配置;
- 注重自由软件原则,有严格的分区:main / contrib / non-free;
- 为了兼容性、稳定性,经常会长期维护旧版本(stable)。
-
RPM 系(特别是 RHEL):
- 更侧重稳定、可预测性和企业支持,有大量回移补丁(backport);
- 包版本号有时较旧,但会补上安全修复;
- 配置和布局更多考虑"企业场景"的一致性。
举个开发者常碰到的例子:
- 在 Ubuntu 上包版本会更"新",对开发者友好;
- 在 RHEL 上包版本可能偏旧,但足够稳定,适合生产环境,只要你不强求"最新特性"。
五、rpm 系和 debian 系的相同点(很重要)
不要被"阵营"迷惑,两者本质上有一堆共同点:
- 都是"二进制包 + 元数据 + 仓库 + 依赖解析"的包管理体系;
- 都支持从源码构建包,并形成可复现构建;
- 都有"基础系统 + 第三方仓库(epel、PPA、COPR等)"的扩展机制;
- 都强调:
- 可升级
- 可回滚(通过版本管理和日志)
- 安全更新渠道(security updates)
从"学习成本"的角度:
- 如果你已经会用
apt,再学dnf/yum非常简单; - 真正需要注意的,反而是各个发行版自己对 systemd、网络、firewalld 等工具的封装区别。
六、一些延伸相关知识
6.1 包管理 vs 容器(Docker)与跨发行版问题
很多人会问:
既然 rpm 和 deb 两套不兼容,那软件发布要打几个包?
现实中开发者的做法越来越多样:
-
传统方式:
- 分别为
.deb和.rpm打包; - 提供 apt/yum 源;
- 这对于需要跟系统深度集成的软件(数据库、中间件等)仍然很常见。
- 分别为
-
容器方式:
- 不关心宿主机是 Debian 系还是 RPM 系;
- 都通过 Docker 镜像发布(镜像内部仍然是某个发行版,比如
ubuntu:22.04或almalinux:9); - 对用户来说:
docker pull即可。
-
通用发布方式:
- 静态编译二进制 + 解压即用(如 Go 程序);
- 使用 Flatpak、Snap、AppImage 等"跨发行版"打包。
这也是 rpm/deb 两系长期共存又共处的原因之一:
上层发布渠道在变,下层大家各用各的生态即可。
6.2 "系"不等于"发行版完全一样"
-
Debian 系 ≠ 所有操作都和 Debian 一模一样:
- Ubuntu 会加自己的一套工具(
add-apt-repository、PPA 等); - Kali 会有安全工具仓库、默认策略不同;
- Linux Mint 有自己的桌面环境和默认配置。
- Ubuntu 会加自己的一套工具(
-
RPM 系内部差别同样存在:
- RHEL / CentOS Stream / Alma / Rocky 在兼容性上高度一致;
- Fedora 更激进,版本更新更快;
- openSUSE 用
zypper和YaST,风格跟 RHEL 家族就有差距。
它们只是"底层包格式和工具链相同、打包体系类似",
但每个发行版还有很多上层差异。
6.3 新一代通用包管理与构建系统
了解一下名字即可:
- Nix / Guix:函数式包管理,强调可复现、原子升级、回滚等,完全不同于 rpm/deb。
- Spack / Conda:更偏向科学计算、Python/数据科学生态。
- Flatpak/Snap:应用级容器包。
这些不会取代 rpm/deb 的系统级角色,但在某些场景(桌面应用、科研环境)会叠加使用。
七、作为用户/运维/开发者应该怎么选和学?
如果你是:
-
桌面/日常使用者:
- 推荐:Ubuntu / Linux Mint(Debian 系),资料最多,上手简单。
-
准备做运维/后端开发,接触公司生产环境:
- 要至少熟悉两边:
- Ubuntu Server(Debian 系)
- AlmaLinux/Rocky Linux(RHEL 兼容的 RPM 系)
- 学会:
apt/dpkg基本用法dnf/rpm基本用法
- 要至少熟悉两边:
-
对打包有兴趣:
- Debian 系:了解
debuild,dpkg-buildpackage,debian/目录和control文件。 - RPM 系:了解
.spec文件、rpmbuild、SRPM。
- Debian 系:了解
八、总结一下(帮你记忆)
你可以用这几句话快速记住要点:
-
为什么有 rpm 系和 debian 系?
因为不同社区/公司在早期各自设计了包管理系统和格式,后来都发展成大生态,没法也没必要统一。
-
最大实用差异?
- 包格式不同:
.debvs.rpm - 工具命令不同:
apt/dpkgvsdnf/yum/rpm - 生态侧重点:Debian/Ubuntu 偏社区和开发者,RHEL/SUSE 偏企业和稳定支持。
- 包格式不同:
-
本质共同点?
- 都是"包 + 仓库 + 依赖管理"的完整体系;
- 功能上高度相似,只是实现和习惯不同。