Linux 包管理器横评:apt / dnf / pacman / nix / flatpak / snap / appimage
刚切到 Linux 的人,第一波困惑几乎都来自包管理器:为什么 Debian 用 apt、Fedora 用 dnf、Arch 用 pacman,又为什么会冒出来 snap / flatpak / appimage 这种横向工具?再加上 nix、brew 这两个不属于任何发行版的体系——很容易陷入「到底该装哪个?」的选择麻痹。
这篇把它们的关系、定位、优劣一次梳理清楚。
一、关系图谱:先把”前端 / 底层”分清楚
Linux 包管理生态分三层。底层工具负责真正把一个包文件解开、复制文件、跑脚本;前端工具负责仓库、依赖、升级;横向工具则不依赖任何发行版的体系,自成一派。
底层] --> A2[apt / aptitude
前端] B1[rpm
底层] --> B2[dnf / yum
前端] C1[libalpm
底层] --> C2[pacman
前端] C2 --> C3[yay / paru
AUR helper] end subgraph 横向独立体系 D1[snap] D2[flatpak] D3[nix] D4[Homebrew] D5[AppImage] end
关键观察:
apt/dnf/pacman三者本质上都只是”前端”,真正决定你装得到新软件的,是发行版的仓库策略,而不是命令本身。
举个例子,apt 在 Debian Stable 上稳但旧,在 Ubuntu + PPA 上就能装到挺新的版本;dnf 在 Fedora 上很激进,在 RHEL 上反而偏保守。所以下面这种话基本都是误解:
| 误解 | 实际情况 |
|---|---|
| ”apt 装的软件太旧” | Debian Stable 仓库本身就偏旧,换 Ubuntu / Debian Testing 就能很新 |
| ”dnf 比 apt 新” | dnf 在 Fedora 上新,在 RHEL 上同样保守 |
| ”Arch 因为用 pacman 所以软件多” | 真正多的是 AUR 社区仓库,pacman 只是入口 |
二、Arch 体系单独说一下
Arch 的设计有点特殊,初学者经常分不清 pacman / yay / paru / AUR 的关系:
用户社区仓库
提供 PKGBUILD 构建脚本] YAY[yay / paru
AUR helper] PAC[pacman
官方包管理器
只管官方仓库] AUR --> YAY YAY --> PAC
-
pacman:Arch 自带,只管官方仓库,不碰 AUR。
-
AUR(Arch User Repository):用户社区维护,里面是
PKGBUILD构建脚本,不是二进制仓库。安装流程是下载 PKGBUILD → 本地编译 → 用 pacman 安装。 -
yay / paru:AUR helper,本质上是 pacman 的封装,能自动跑 PKGBUILD、解依赖、调 pacman 完成安装。两者功能相近:
工具 语言 特点 yay Go 出现早、用户多 paru Rust 更现代、依赖冲突提示更清晰
三、横向独立体系:snap / flatpak / nix / brew / AppImage
这五个跟发行版无关,它们的共同思路是**“自带依赖,跨发行版分发”**:
| 工具 | 主打 | 关键机制 |
|---|---|---|
| snap | 通用应用分发 | 单文件 squashfs 镜像,自带依赖,由 snapd 管理 |
| flatpak | Linux 桌面应用 | 共享 runtime + sandbox,Flathub 是主仓库 |
| nix | 可复现环境 | 函数式包管理,多版本并存,generation + GC |
| Homebrew | 跨平台开发工具 | 用户态前缀(macOS/Linux 通用) |
| AppImage | 便携分发 | 一个文件就是一个应用,挂载即跑 |
提示:AppImage 严格说不算包管理器,它只是一种应用打包格式——没有仓库、没有依赖管理,纯粹”下载即跑”。
四、十几个工具一张大表
下面这张表把所有维度横在一起,看完基本不再纠结:
| 工具 | 依赖处理 | 仓库更新 | 覆盖度 | 安装体积 | 适用范围 | 删除干净 | 适合场景 |
|---|---|---|---|---|---|---|---|
| dpkg | 低,手工为主 | 不适用 | 不适用 | 小 | Debian/Ubuntu 系 | 中(需 purge) | 手工装 .deb、底层排障 |
| apt | 高 | 看 Debian/Ubuntu 分支 | 大 | 小 | Debian 系 | 较好(autoremove + purge) | 通用系统包管理 |
| aptitude | 很高,交互式 | 同 apt | 同 apt | 小 | Debian 系 | 较好 | 复杂依赖冲突 |
| rpm | 低到中 | 不适用 | 不适用 | 小 | RPM 系 | 中 | 手工装 .rpm |
| yum | 中到高 | 新系统等同 dnf | 大 | 小 | 老 RHEL/CentOS | 较好 | 维护老系统 |
| dnf | 高 | Fedora 快、RHEL 稳 | 大 | 小 | Fedora/RHEL/Rocky | 较好 | 现代 RPM 主力 |
| pacman | 高,简洁直接 | 很快(rolling) | 官方中等 | 小 | Arch 系 | 较好(-Rns 关键) | Arch 官方包 |
| yay | 高(官方 + AUR) | 很快 | 很大 | 中偏大 | Arch 系 | 较好 | 官方 + AUR 一把梭 |
| paru | 高(官方 + AUR) | 很快 | 很大 | 中偏大 | Arch 系 | 较好 | 同上,交互更现代 |
| nix | 很高(思路独特) | 取决于 channel/flake | 很大 | 中偏大(可 GC) | Linux + macOS | 理论上很干净 | 可复现环境、多版本并存 |
| snap | 高(自带依赖) | 较快、自动刷新 | 中到大 | 偏大 | 各 Linux(需 snapd) | 较好(可能留 snapshot) | 桌面/服务端通用分发 |
| flatpak | 高(runtime + sandbox) | 较快 | 桌面很强 | 中偏大(runtime 共享) | 各 Linux | 较好(--unused 清 runtime) | Linux 桌面应用 |
| Homebrew | 高 | 较快 | CLI/开发强 | 中 | macOS + Linux | 较好(在自己 prefix) | 跨平台开发工具 |
| AppImage | 应用自带 | 看上游 | 取决于作者 | 偏大 | 各 Linux 桌面 | 删文件即可(配置可能残留) | 便携、免安装 |
五、按需求选工具
光看表还是抽象,按你实际想做什么来反查:
5.1 装的软件想新一点
- 最快:Arch 官方仓库 + AUR、Fedora、Nix unstable
- 中等偏快:Homebrew、Flatpak/Flathub
- 稳但旧:Debian Stable、RHEL
5.2 找冷门软件 / 社区包
- AUR、Nixpkgs 几乎无敌
- 桌面 GUI 应用:Flatpak、Snap、AppImage 都很方便
- 系统级基础包:apt / dnf / pacman 原生仓库依然最稳
5.3 在意磁盘占用
原生包(apt/dnf/pacman) < flatpak(runtime 可共享) < nix(多代但可 GC) < snap / AppImage(强调自带依赖)5.4 想”装完能干净删除”
| 工具 | 干净度 | 注意点 |
|---|---|---|
| AppImage | 极高 | 删文件即可;~/.config 下配置文件可能残留 |
| nix | 高 | 必须懂 generation 和 nix-collect-garbage |
| flatpak | 高 | 记得 flatpak uninstall --unused 清 runtime |
| snap | 中 | 删除后可能保留 snapshot |
| apt / dnf / pacman | 中 | orphan 依赖、配置文件要手动处理 |
六、几条实用经验
最后给几条我自己踩过坑得来的判断:
- 服务器 / 命令行用原生包管理器(apt / dnf / pacman),别用 snap、flatpak——它们在 server 场景下没有任何优势,反而占资源。
- 桌面应用优先 Flatpak,比 Snap 启动快、隔离做得好;Snap 在 Ubuntu 上推得过猛,很多人反感。
- 想要”开发环境可复现”,无脑选 Nix——但学习曲线确实陡,不是周末两小时能拿下的。
- AUR / AppImage 装的东西,自己心里有数:AUR 是社区脚本,AppImage 是上游随便打包,安全性都不如发行版官方仓库,敏感场景慎用。
- 同一台机器尽量不要混用多套包管理器(除非真的有必要),混用最后排查问题非常痛苦。
理解到这里,再去看任何”Linux 该用什么发行版”的争论,你都能直接跳过 90% 的口水仗——你买的不是包管理器,你买的是发行版背后的仓库策略 + 社区。