Linux下安装包格式及deb、rpm、tar.gz等安装包格式的区别

type
status
date
slug
summary
tags
category
icon
password
一份尽可能详尽、实用且条理清晰的 Linux 安装包格式详解。 详细介绍 Linux 各种安装包格式(.deb、.rpm、.pkg.tar.zst、AppImage、Snap、Flatpak 等)的结构、使用场景、优缺点及命令示例

快速对照表(简明)

格式
典型生态
管理器
可移植性
沙箱/安全
优点
缺点
.deb
Debian/Ubuntu
dpkg + APT
否(仓库签名)
仓库成熟、依赖管理好
发行版绑定强
AppImage
桌面
无(单文件)
可(有限)
便携易用
无系统级管理、体积大
.tar.zst (pacman)
Arch
pacman
简单快速、AUR
滚动发行版注意稳定性
.rpm
RHEL/Fedora
rpm + dnf/yum
否(包/仓库签名)
企业工具链成熟
发行版差异
.apk
Alpine
apk
轻量、适合容器
生态小
源码 tarball
通用
none
高(需编译)
最大灵活性
需处理依赖、维护复杂
Snap
多发行版
snapd
是(AppArmor)
自动更新、统一商店
体积、性能问题
Flatpak
桌面
flatpak
是(bubblewrap)
桌面集成好、runtime共享
运行时体积、需 flatpak 支持
OSTree / rpm-ostree
原子系统
rpm-ostree
N/A
是(只读系统)
原子升级、回滚
不适合频繁更改系统级软件
Nix/Guix
可重复构建
nix/guix
高(可重现)
是(隔离)
可重复、并行安装多个版本
学习成本高
 

省流:如何选择

  • 系统级、企业与依赖管理 → 用发行版原生包(.deb / .rpm / apk / pacman)。
  • 桌面跨发行版分发 → Flatpak(首选),AppImage(轻量单文件),Snap(如果你目标用户多为 Ubuntu)。
  • 嵌入式/容器 → Alpine .apk 或直接用容器镜像。
  • 需要原子升级/回滚 → OSTree / rpm-ostree 或 Nix。
  • 需要可重复/可回溯构建 → Nix / Guix。
 

1. 传统二进制包(分发式包管理系统)

这些包由发行版维护的仓库提供,包管理器负责依赖解析、安装/升级/删除、数据库管理。

1.1 .deb(Debian / Ubuntu 等)

  • 对应包管理器:dpkg(低层),APT(高级工具:apt, apt-get, aptitude)
  • 常见发行版:Debian、Ubuntu 及其衍生(Mint、Pop!_OS 等)
  • 文件扩展名.deb
  • 内部结构
    • .deb 实际上是一个 ar(Unix archive)格式容器,通常包含:
      • debian-binary(文件格式版本号)
      • control.tar.gzcontrol.tar.xz(包元数据:control 文件,依赖、版本、维护者、描述;以及 maintainer scripts)
      • data.tar.gz / data.tar.xz(实际文件树要安装到系统的内容)
  • 元数据与依赖
    • control 文件里有 Package, Version, Depends, Recommends, Suggests, Conflicts, Provides, Architecture 等字段
  • 安装脚本
    • /var/lib/dpkg/info/<pkg>.postinst.prerm.preinst.postrm(由 dpkg 在不同阶段运行)
  • 签名/验证
    • 单个 .deb 没有内建签名机制,仓库通过 Release 文件/GPG 签名保证仓库一致性(APT 会验证)
  • 优点
    • 仓库生态成熟、工具链完善(APT)
    • 细粒度依赖描述、回滚(部分工具)
  • 缺点
    • 与发行版绑定较紧(打包规则、文件路径约定)
  • 示例命令
    • 安装:sudo dpkg -i package.deb(若缺依赖:sudo apt-get -f install
    • 查询:dpkg -L packagedpkg -s package
    • 构建:dpkg-deb --build、使用 debhelper / dh 工具链、pbuilder/sbuild 等构建环境

1.2 .rpm(Red Hat、Fedora、CentOS、openSUSE 等)

  • 对应包管理器rpm(低层),yum/dnf/zypper(高级)
  • 常见发行版:RHEL、CentOS、Fedora、openSUSE、AlmaLinux、Rocky 等
  • 文件扩展名.rpm
  • 内部结构
    • RPM 有自己的二进制/数据库格式,存储文件清单、依赖、脚本段(pre/post)和压缩的 payload(通常 cpio + gzip/xz)
  • 元数据与依赖
    • 使用 Requires, Provides, Obsoletes, Conflicts
  • 安装脚本
    • %pre, %post, %preun, %postun(写在 .spec 文件中)
  • 签名/验证
    • RPM 支持包签名(GPG): rpm --import 公钥,rpm -K package.rpm 验证
    • 仓库通常也有 GPG 签名(dnf/yum 验证)
  • 优点
    • 强大且成熟的元数据系统,适合企业发行版
    • 可签名包,企业级管理工具(Satellite、Spacewalk)
  • 缺点
    • 不同发行版之间的 ABI/路径/依赖差异可能导致二进制包不可移植
  • 示例命令
    • 安装:sudo rpm -i package.rpmsudo dnf install package.rpm
    • 查询:rpm -ql packagerpm -qpi package.rpm
    • 构建:使用 rpmbuild,基于 .spec 文件(用 Mockkoji 做干净构建)

1.3 pacman 包(Arch Linux)

  • 格式/管理器:pacman,包文件通常是 .pkg.tar.zst(以前是 .pkg.tar.xz / .pkg.tar.gz
  • 发行版:Arch Linux 及衍生(Manjaro)
  • 内部:tarball(cpio/tar)加上压缩与元数据(pkgbuild 脚本生成)
  • 依赖与数据库:pacman 管理本地数据库 /var/lib/pacman/local/,通过 Depends 字段处理依赖
  • 安装脚本:PKGBUILD 可定义 install 脚本(打包时放入 .install
  • 特点:滚动更新(rolling release),简单、轻量,AUR 社区包系统(源包构建)

1.4 .apk(Alpine Linux)

  • 包管理器apk(Alpine package keeper)
  • 格式:轻量单文件包,元数据在包内
  • 特点:面向小巧、静态链接或 musl 的系统,适合容器场景
  • 示例命令apk add package

1.5 .ipk(OpenWrt / embedded)

  • 对应:Opkg(基于 ipkg)
  • 用处:路由器/嵌入式设备(空间限制、交叉编译环境)
  • 结构:类似 ar / tar 包含控制和数据

2. 源代码包(源码分发 / 编译安装)

  • 形式.tar.gz / .tar.bz2 / .tar.xz,也有 .zip,或 Git 仓库
  • 典型安装流程
    • ./configure(或 cmake)、makemake install(或 meson/ninja
  • 优点
    • 最大灵活性、可针对平台优化编译选项
    • 适合需要定制或运行在特殊环境(老系统、交叉编译)
  • 缺点
    • 无统一依赖管理(除非使用 distribution packaging),无法被系统包管理器跟踪(手动卸载困难)
    • 安全与可维护性差:升级、补丁需要人工跟踪
  • 常用工具
    • checkinstall(把源码安装打包成 .deb/.rpm),stow(管理 /usr/local 安装)

3. 独立可执行包 / 单文件分发(无需安装或沙箱)

近年来为了解决依赖地狱和跨发行版兼容性出现了多种格式:

3.1 AppImage

  • 理念:单文件便携应用,可在大多数主流发行版上运行(以 FUSE 或直接挂载 squashfs)
  • 结构:一个可执行文件,内部包含 squashfs 压缩的应用文件系统(含所有依赖库)
  • 优点
    • 方便分发、无需 root、与发行版无关
    • 用户体验像 macOS 的 .dmg/.app
  • 缺点
    • 无自动更新(除非内置更新机制)
    • 仍可能由于内置库冲突导致问题(但一般可用)
    • 不被系统包管理器管理(除非配合 AppImageLauncher 等)
  • 使用:下载后 chmod +x appimage && ./appimage

3.2 Snap(Canonical)

  • 管理器/生态:snapd + Snap store
  • 格式:snap(包含 squashfs + metadata)
  • 特点
    • 沙箱化(基于 AppArmor),权限通过 interface 管理(如访问网络、音频、removable-media)
    • 自动更新(后台)
    • 需要 snapd 守护进程
  • 优缺点
    • 优点:跨发行版、自动更新、集中商店
    • 缺点:体积可能大(包含多个 runtime),启动慢,依赖 snapd,与传统包管理器整合有限
  • 命令snap install foo

3.3 Flatpak

  • 理念:应用沙箱化并由 runtime(如 GNOME runtime)提供共享依赖,应用打包为 .flatpak 或通过仓库分发
  • 组件:flatpak runtime + application bundle
  • 安全:基于 Bubblewrap、namespace 等实现沙箱
  • 优点
    • GUI 应用友好、跨发行版、良好的权限控制、能够共享 runtime 减少重复
  • 缺点
    • 运行时体积、需要 Flatpak 支持(桌面发行版通常支持)
  • 命令flatpak install flathub org.example.App

4. 事务性 / 原子更新系统

这些系统为了解决系统级一致性与原子升级问题而发展。

4.1 OSTree / rpm-ostree(Fedora Silverblue、OSTree)

  • 理念:把操作系统文件系统当作 Git 样式的不可变树,升级时做原子切换(像 git checkout
  • 特点
    • 系统镜像式部署(更像容器镜像),易回滚,安全稳定
    • 应用通过 Flatpak 等在上面运行(客户端程序分离)
  • 优缺点
    • 优点:原子升级、简单回滚
    • 缺点:不适合频繁在系统级安装软件的场景(传统包安装复杂)

5. 源码构建系统 / 元包管理(Gentoo / Portage、Nix)

5.1 Gentoo(Portage / ebuild)

  • 理念:源代码分发为主,使用 ebuild 脚本描述如何获取、配置、编译与安装
  • 优点
    • 极高可定制性(USE flags),可编译出极为优化的系统
  • 缺点
    • 编译耗时、维护成本高

5.2 Nix / Guix(纯函数式包管理)

  • 特点
    • 每个包安装到独立的唯一路径(/nix/store/...),用哈希表示构建输入 -> 完全可重现
    • 支持事务、回滚、多个版本共存
  • 优点/缺点
    • 非常适合可重复构建与隔离,但学习曲线陡峭,生态与传统系统集成需适配

6. Container images(不是传统“包”,但常用于交付)

  • 格式:OCI/Docker 镜像(层级的 tar 压缩层)
  • 适用场景:服务/微服务部署,避免在宿主机安装大量软件
  • 区别:镜像是运行环境打包(包括操作系统层),而非把软件安装到宿主系统的包。

7. 细节对比(内部结构 / 元数据 / 签名 / 依赖 / 升级行为)

下面按几个常关心的维度比较:
  1. 内部结构
      • .deb:ar -> control.tar.* + data.tar.*(清晰分离元数据与数据)
      • .rpm:自有格式,payload 通常是 cpio + 压缩
      • pacman .pkg.tar.zst:tarball + metadata
      • AppImage:squashfs 嵌入到单可执行文件
      • Snap:squashfs + snap.json metadata
      • Flatpak:类似于 OSTree / runtime + app bundle
      • 源码包:压缩源码树 + 构建脚本
  1. 依赖管理
      • 强:.deb、.rpm、pacman、apk(发行版仓库)
      • 弱/无:AppImage(自包含)、源代码(依赖需手动解决)
      • 特殊:Flatpak 使用 runtimes;Snap 自包含或依赖 snapcraft 内容
  1. 签名与安全
      • 仓库签名(APT、YUM/DNF)是主流方式;RPM 支持包级签名;dpkg 本身不验证包签名但 APT 会验证仓库
      • Snap/Flatpak 有自己的发布与验证流程,且有沙箱机制(Snap、Flatpak)
  1. 安装可逆性 & 原子升级
      • 传统包管理器可做回滚但通常不是原子(除非特定设计)
      • OSTree/rpm-ostree、Nix 提供原子升级与回滚
      • Snap/Flatpak 提供应用级回滚(部分实现)
  1. 跨发行版可移植性
      • 高:AppImage、Flatpak、Snap(有守护进程/ runtime 的要求)
      • 低:.deb/.rpm/.pkg(受 libc、路径、依赖版本影响)
  1. 体积与重复库
      • 传统包:共享系统库,节省空间
      • 自包含格式(AppImage/Snap/Flatpak):可能重复包含库,导致体积增大(但 Flatpak 通过 runtime 部分共享减轻)

8. 打包脚本与打包工具

  • Debiandebian/ 目录 + control + rules(Makefile 风格),使用 debhelperdpkg-deblintian 检查,pbuilder/sbuild 做 chroot 构建
  • RPM.spec 文件(定义打包、编译、依赖、脚本段),rpmbuildmock(隔离构建)、koji(Fedora 构建系统)
  • ArchPKGBUILD(脚本,定义 source、build、package 函数),makepkg 构建,AUR 社区
  • Snapsnapcraft.yamlsnapcraft 构建
  • Flatpakflatpak-builder + manifest(JSON/YAML)
  • AppImage:使用 appimagetool 或 AppImageKit 打包(通常从一个 AppDir 开始)

9. 常见问题 / 实务建议

  • 如果你要发布桌面应用(面向多数 Linux 发行版非开发者用户):优先考虑 Flatpak(桌面生态兼容性好)或 AppImage(单文件分发)或 Snap(若目标是 Ubuntu 及其用户)。Flatpak 对 GUI 权限与桌面集成更友好。
  • 如果你在做服务器软件 / 系统级软件 / 企业部署:用对应发行版的包格式(.deb / .rpm / apk),并通过仓库 + GPG 签名分发以便统一管理与自动更新。
  • 想在容器中部署应用:把应用打包成容器镜像(OCI/Docker),这样能保证运行时一致性。
  • 嵌入式/路由器:用 .ipk(OpenWrt)或 Alpine 的 .apk,注重体积与 musl 支持。
  • 需要可回滚、可追溯的系统:考虑 Nix、Guix 或 OSTree / rpm-ostree 这样能做原子切换与精确可重现构建。
  • 跨发行版的二进制包兼容性:通常不可保证。若要兼容,优先使用自包含格式(AppImage/Snap/Flatpak),或使用容器。

10. 实用命令速查(最常用)

  • Debian/Ubuntu:
    • sudo apt update && sudo apt install packagename
    • sudo dpkg -i package.deb
    • dpkg -L packagename 列文件
  • RHEL/Fedora:
    • sudo dnf install packagename(或 yum 在旧系统)
    • sudo rpm -ivh package.rpm
  • Arch:
    • sudo pacman -S packagename
    • makepkg -si 构建并安装 AUR 包
  • Alpine:
    • sudo apk add packagename
  • AppImage:
    • chmod +x App.AppImage && ./App.AppImage
  • Snap:
    • sudo snap install packagename
  • Flatpak:
    • flatpak install flathub org.example.App
  • 源码编译:
    • ./configure && make && sudo make install(或 meson/cmake 流程)

 

参考资料

  • Ubuntu使用记录:安装deb软件方法以及apt、apt-get和dpkg的区别_apt安装本地deb-CSDN博客
  • Linux下软件包的分类及deb、rpm、tar.gz的区别 - 圆柱模板 - 博客园
Prev
VSCode/Cursor C#扩展安装后报错
Next
Ubuntu UFW防火墙规则与命令示例
Loading...