包管理器是 Linux 的灵魂——它决定了你如何安装软件、如何维护系统、如何回滚灾难、甚至如何思考"系统状态"本身。现代 Linux 包管理的版图已经远超传统的 apt/dnf/pacman/apk。笔者前面已经详细介绍了四大传统派系(Debian、Alpine、Arch、RHEL)的包管理,除了这些,还有四大新兴范式正在重塑 Linux 软件分发和系统管理。

前文回顾:

https://vortex.blog.csdn.net/article/details/158283915

https://vortex.blog.csdn.net/article/details/161191607

https://vortex.blog.csdn.net/article/details/160510567

https://vortex.blog.csdn.net/article/details/161192400


现代 Linux 包管理全景图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


一、通用包格式:跨发行版的"一次打包,处处运行"

传统包管理最大的痛点是发行版碎片化——同一个软件需要为 Debian、Fedora、Arch 分别打包。通用包格式试图解决这个问题。

1.1 Flatpak(社区主导,桌面首选)

# 安装 Flatpak(大多数发行版已预装)
sudo apt install flatpak              # Debian/Ubuntu
sudo dnf install flatpak              # Fedora
sudo pacman -S flatpak                # Arch

# 添加 Flathub 仓库(应用商店)
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

# 安装应用
flatpak install flathub com.visualstudio.code
flatpak install flathub org.mozilla.firefox

# 运行
flatpak run com.visualstudio.code

# 管理
flatpak list                          # 列出已安装
flatpak update                        # 更新所有
flatpak uninstall com.visualstudio.code   # 卸载
flatpak info com.visualstudio.code    # 显示详情

核心机制

  • 运行时(Runtime):共享基础库(如 org.freedesktop.Platform),减少重复
  • 沙盒:默认隔离,通过 Portal 机制安全访问文件、摄像头等
  • 权限控制flatpak override --user --filesystem=home com.app.Name

1.2 Snap(Canonical 主导,Ubuntu 主推)

# 安装 Snap(Ubuntu 预装)
sudo apt install snapd                # 其他发行版

# 安装应用
sudo snap install code --classic      # --classic 解除严格沙盒(IDE 需要)
sudo snap install firefox
sudo snap install docker

# 管理
snap list                             # 列出
snap refresh                          # 更新
snap remove firefox                   # 卸载
snap info firefox                     # 详情
snap services                         # 查看后台服务

核心机制

  • 自动更新:后台守护进程 snapd 自动更新
  • 严格沙盒:AppArmor + Seccomp 隔离
  • 原子更新:更新失败自动回滚
  • 争议:启动慢、中心化控制、强制更新

1.3 AppImage(便携之王,零安装)

# 下载 + 赋予权限 + 运行(三步搞定)
wget https://example.com/app.AppImage
chmod +x app.AppImage
./app.AppImage

# 可选:集成到系统
./app.AppImage --appimage-extract     # 解压
appimaged                             # 守护进程,自动注册 .desktop

核心机制

  • 单文件:内含所有依赖,无需运行时
  • FUSE 挂载:运行时挂载为临时只读文件系统
  • 无 root:完全用户级
  • 缺点:无自动更新(需 AppImageUpdate 工具)、无沙盒

1.4 通用格式对比

特性 Flatpak Snap AppImage
安装方式 需 Flatpak 运行时 需 snapd 守护进程 无需安装
沙盒 是(Bubblewrap) 是(AppArmor) 否(可选 Firejail)
自动更新 可选 强制自动 手动 / AppImageUpdate
共享依赖 运行时共享 完全自包含 完全自包含
体积 中等
启动速度 慢(首次)
中心化 Flathub(社区) Snap Store(Canonical)
适用场景 桌面应用 服务器+桌面 便携/测试

二、函数式包管理:Nix 与 Guix

传统包管理是命令式的(“安装这个、删除那个”),而函数式包管理是声明式的(“我的系统应该长这样”)。

2.1 Nix(最激进的包管理革命)

# 安装 Nix(任何 Linux/macOS)
curl -L https://nixos.org/nix/install | sh

# 临时使用包(不污染系统)
nix-shell -p python39 nodejs git    # 进入含这些包的 shell
nix-shell -p python39 --run "python --version"   # 单次运行

# 安装到用户环境
nix-env -iA nixpkgs.htop
nix-env -e htop                     # 卸载
nix-env --rollback                  # 回滚
nix-env --list-generations          # 查看历史

# 查询
nix search nixpkgs firefox
nix-env -q                          # 列出已安装

核心概念

概念 说明
/nix/store/ 所有包的"墓地",每个包有唯一哈希路径
nix-shell 临时环境,退出即消失
nix-env 命令式安装(不推荐长期使用)
configuration.nix NixOS 声明式系统配置
flake.nix 现代 Nix 项目配置(可复现)

NixOS 声明式系统配置示例

# /etc/nixos/configuration.nix
{ config, pkgs, ... }:
{
  # 系统级包
  environment.systemPackages = with pkgs; [
    vim git htop docker
  ];
  
  # 服务配置
  services.openssh.enable = true;
  services.nginx = {
    enable = true;
    config = ''
      server { listen 80; root /var/www; }
    '';
  };
  
  # 系统设置
  system.stateVersion = "24.11";
}
sudo nixos-rebuild switch           # 应用配置
sudo nixos-rebuild switch --rollback  # 回滚

Nix 的杀手锏

  • 完全可复现:同样的 flake.nix 在任何机器产生相同环境
  • 原子更新/nix/store/ 只增不改,更新失败直接切回旧路径
  • 多版本共存python38python39python310 同时存在
  • 无依赖冲突:每个包指向 /nix/store/ 中自己的依赖副本

2.2 Guix(GNU 版的 Nix)

# 安装 Guix 系统或包管理器
guix install emacs
guix install python@3.10            # 指定版本
guix shell python nodejs            # 临时环境
guix package --roll-back            # 回滚
guix system reconfigure config.scm  # 系统重建(GuixSD)

与 Nix 的区别

  • 纯 GNU 工具链,拒绝非自由软件(Nix 更包容)
  • 使用 Scheme 语言而非 Nix 表达式语言
  • 强调软件自由可引导性(bootstrapping)

2.3 Home Manager(用户级 Nix)

# ~/.config/home-manager/home.nix
{ config, pkgs, ... }:
{
  home.packages = with pkgs; [ 
    fzf ripgrep bat exa 
  ];
  
  programs.git = {
    enable = true;
    userName = "Your Name";
    userEmail = "you@example.com";
  };
  
  programs.zsh = {
    enable = true;
    oh-my-zsh = {
      enable = true;
      theme = "robbyrussell";
    };
  };
}
home-manager switch                 # 应用用户配置

意义:将点文件管理(dotfiles)提升到声明式、可版本控制、可复现的层次。


三、不可变系统(Immutable OS)

传统 Linux 的根文件系统是可读写的,软件包直接修改 /usr/bin/etc。不可变系统则让根文件系统只读,所有变更通过事务性更新完成。

3.1 Fedora Silverblue / Kinoite

# 系统级操作使用 rpm-ostree(而非 dnf)
rpm-ostree upgrade                  # 系统升级(原子性)
rpm-ostree rollback                 # 回滚到上一版本
rpm-ostree status                   # 查看当前部署

# 安装包(层叠到基础镜像)
rpm-ostree install vim htop         # 安装到系统层
rpm-ostree uninstall vim            # 卸载

# 大多数软件通过 Flatpak 安装
flatpak install flathub org.mozilla.firefox

# 开发工具通过 Toolbox(容器)使用
toolbox create                      # 创建 Fedora 工具箱
toolbox enter                       # 进入容器环境(里面可用 dnf)

核心机制

  • OSTree:Git 风格的文件系统版本控制
  • /usr 只读,/etc/var 可写
  • 每次更新是一个新的"提交",保留旧版本可启动

3.2 openSUSE MicroOS

# 事务性更新
transactional-update pkg install package
transactional-update dup            # 发行版升级
transactional-update rollback         # 回滚

# 或自动模式
transactional-update --continue run 'zypper in package'

3.3 不可变系统对比

系统 基础技术 包管理方式 适用场景
Fedora Silverblue rpm-ostree + OSTree Flatpak + 容器 桌面稳定
openSUSE MicroOS transactional-update + Btrfs Zypper(事务性) 服务器/容器主机
Ubuntu Core Snap-only Snap IoT/嵌入式
Deepin 25 Solid 原子更新 + 快照 APT(重定向) 中文桌面

四、容器化包管理:Distrobox 与 Toolbox

在不可变系统上,你需要一个可变的开发环境,但不想污染主系统。

# Distrobox:在任何发行版中运行其他发行版
distrobox create --image ubuntu:22.04 --name ubuntu-dev
distrobox enter ubuntu-dev          # 进入容器,完全隔离但共享 HOME

# Toolbox:Fedora 专用
toolbox create --distro fedora --release 39
toolbox enter fedora-toolbox-39
sudo dnf install gcc make           # 在容器里随意折腾

本质:容器不是 VM,性能损耗极小,但提供了完整的发行版环境。


五、现代 Linux 包管理的完整版图

范式 代表工具 核心哲学 适用场景
传统系统级 apt, dnf, pacman, apk, zypper 共享库,依赖解析 服务器、通用桌面
通用应用级 Flatpak, Snap, AppImage 跨发行版,沙盒隔离 第三方桌面应用
函数式声明式 Nix, Guix, Home Manager 纯函数,可复现 开发环境、DevOps
不可变系统 rpm-ostree, transactional-update 只读根,原子更新 稳定桌面、容器主机
容器开发环境 Distrobox, Toolbox 隔离但集成 不可变系统上的开发

六、如何选择?

场景 推荐方案
个人桌面日常使用 传统包管理 + Flatpak 补充
需要最新版 IDE/浏览器 Flatpak / Snap
开发环境管理 Nix + Home Manager
追求系统绝对稳定 NixOS / Fedora Silverblue
服务器部署 传统包管理 + 容器
跨团队共享环境 Nix Flakes
IoT/嵌入式 Ubuntu Core / Alpine
测试软件不污染系统 AppImage / Distrobox

现代 Linux 包管理已经不是单选题。最务实的策略是混合使用:用传统包管理维护系统核心,用 Flatpak/Snap 获取最新桌面应用,用 Nix 管理开发环境,在不可变系统上用容器完成所有可变操作。每种工具解决特定问题,掌握它们的边界和协作方式,才是现代 Linux 用户的完整技能树。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐