Linux 与系统

Linux 包管理器:apt、dnf、pacman、nix、flatpak、snap 与 AppImage

刚切到 Linux 的人,第一波困惑几乎都来自包管理器:为什么 Debian 用 apt、Fedora 用 dnf、Arch 用 pacman,又为什么会冒出来 snap / flatpak / appimage 这种横向工具?再加上 nix、brew 这两个不属于任何发行版的体系——很容易陷入「到底该装哪个?」的选择麻痹。

刚切到 Linux 的人,第一波困惑几乎都来自包管理器:为什么 Debian 用 apt、Fedora 用 dnf、Arch 用 pacman,又为什么会冒出来 snap / flatpak / appimage 这种横向工具?再加上 nix、brew 这两个不属于任何发行版的体系——很容易陷入「到底该装哪个?」的选择麻痹。

这篇把它们的关系、定位、优劣一次梳理清楚。

一、关系图谱:先把“前端 / 底层”分清楚

Linux 包管理生态分三层。底层工具负责真正把一个包文件解开、复制文件、跑脚本;前端工具负责仓库、依赖、升级;横向工具则不依赖任何发行版的体系,自成一派。

mermaid21 行
graph LR
subgraph 传统发行版体系
A1[dpkg
底层] --> 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 的关系:

mermaid11 行
graph BT
AUR[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 在意磁盘占用

plaintext2 行

原生包(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 依赖、配置文件要手动处理

六、几条实用经验

最后给几条我自己实际用下来的判断:

  1. 服务器 / 命令行用原生包管理器(apt / dnf / pacman),别用 snap、flatpak——它们在 server 场景下没有任何优势,反而占资源。
  2. 桌面应用优先 Flatpak,比 Snap 启动快、隔离做得好;Snap 在 Ubuntu 上推得过猛,很多人反感。
  3. 想要“开发环境可复现”,无脑选 Nix——但学习曲线确实陡,周末两小时拿不下来。
  4. AUR / AppImage 装的东西,自己心里有数:AUR 是社区脚本,AppImage 是上游随便打包,安全性都不如发行版官方仓库,敏感场景慎用。
  5. 同一台机器尽量不要混用多套包管理器(除非真的有必要),混用最后排查问题非常痛苦。

理解到这里,再去看任何“Linux 该用什么发行版”的争论,你都能直接跳过 90% 的口水仗——你真正要选的是发行版背后的仓库策略 + 社区,命令行工具只是个入口。

← 返回文章