强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Flatpak 应用打包完整教程 / 第 1 章:Flatpak 概述

第 1 章:Flatpak 概述

本章目标:理解 Flatpak 的设计哲学、核心技术架构,以及它在 Linux 打包生态中的定位。


1.1 什么是 Flatpak

Flatpak(读作 “flat-pack”)是一个用于构建、分发和运行桌面应用的框架。它由 Alexander Larsson 于 2015 年发起(最初名为 xdg-app),现由 Flatpak 社区 维护,被 Fedora、Linux Mint、Endless OS 等主流发行版默认采用。

核心设计目标

设计目标说明
跨发行版同一个 Flatpak 包可在 Ubuntu、Fedora、Arch 等任意发行版运行
沙箱隔离应用运行在独立沙箱中,限制对宿主系统的访问
运行时复用通过共享运行时 (Runtime) 避免重复依赖
去中心化不绑定特定商店,任何人可托管仓库
版本独立应用可携带或锁定特定版本的依赖

Flatpak 的名字来源

flatpak = flat (扁平化) + pack (打包)

寓意:将复杂的依赖关系"扁平化"为一个独立、自包含的包。


1.2 沙箱模型

Flatpak 的核心安全机制是基于 Bubblewrap 的 Linux 命名空间 (Namespace) 沙箱。

沙箱提供的隔离层

┌─────────────────────────────────────────────┐
│                Flatpak 应用                  │
│  ┌────────────────────────────────────────┐  │
│  │          应用代码 + 依赖库              │  │
│  ├────────────────────────────────────────┤  │
│  │          运行时 (Runtime)               │  │
│  ├────────────────────────────────────────┤  │
│  │          Bubblewrap 沙箱               │  │
│  │  • PID 命名空间 (进程隔离)              │  │
│  │  • Mount 命名空间 (文件系统隔离)        │  │
│  │  • Network 命名空间 (网络隔离)          │  │
│  │  • IPC 命名空间 (D-Bus 过滤)            │  │
│  └────────────────────────────────────────┘  │
│               ↕ Portal API                   │
│  ┌────────────────────────────────────────┐  │
│  │          宿主系统 (Host)               │  │
│  └────────────────────────────────────────┘  │
└─────────────────────────────────────────────┘

沙箱默认行为

资源默认权限说明
文件系统❌ 不可访问只能访问应用私有目录和 ~/.var/app/<app-id>/
网络✅ 允许默认可访问网络(可通过 --unshare=net 禁用)
宿主命令❌ 不可执行无法直接调用宿主系统命令
D-Bus受限会话总线 (Session Bus) 受过滤,系统总线 (System Bus) 默认不可访问
设备❌ 不可访问默认无法访问 GPU、摄像头等设备(可通过权限声明开启)

Portal API

Portal 是 Flatpak 沙箱应用与宿主系统交互的标准化接口。它由 xdg-desktop-portal 提供,常见操作包括:

  • 文件选择org.freedesktop.portal.FileChooser
  • 打印org.freedesktop.portal.Print
  • 通知org.freedesktop.portal.Notification
  • 截图org.freedesktop.portal.Screenshot
  • 设置org.freedesktop.portal.Settings
# 查看当前系统可用的 Portal 实现
ls /usr/share/xdg-desktop-portal/portals/

# 检查 Portal 服务状态
systemctl --user status xdg-desktop-portal.service

1.3 与其他打包格式的对比

1.3.1 Flatpak vs Snap

Snap 由 Canonical(Ubuntu 母公司)开发,目标与 Flatpak 类似但侧重不同。

对比维度FlatpakSnap
发起方社区驱动Canonical 主导
后端存储OSTreeSquashFS + Store
沙箱技术Bubblewrap (namespaces)AppArmor + Seccomp
服务器端去中心化 (任何人可架设)集中式 (snapcraft.io)
默认仓库FlathubSnap Store
桌面应用✅ 专注桌面桌面 + 服务器 + IoT
自动更新由桌面环境管理强制自动更新 (可延期)
Delta 更新✅ OSTree 增量传输✅ 差量更新
服务端运行❌ 不适合✅ 支持 daemon/service
主要采用Fedora, Linux Mint, Endless OSUbuntu, Ubuntu 衍生版

选择建议

  • 纯桌面应用 → 优先 Flatpak(社区更开放、Flathub 生态更成熟)
  • 服务器/CLI 工具 → 优先 Snap(原生支持 daemon 模式)
  • 已有 Ubuntu 用户基础 → 两者都发布

1.3.2 Flatpak vs AppImage

对比维度FlatpakAppImage
安装方式需要 flatpak 运行时双击运行,无需安装
沙箱✅ 完整沙箱❌ 无沙箱 (除非手动用 Firejail)
依赖共享✅ 运行时复用❌ 每个包内嵌全部依赖
磁盘效率高(共享运行时)低(重复依赖)
更新机制✅ 内置增量更新需第三方工具 (AppImageUpdate)
系统集成✅ 自动注册 .desktop需手动集成 (或用 appimaged)
适用场景长期维护的桌面应用便携式工具、一次性分发

1.3.3 三者总览

                   沙箱安全    跨发行版    磁盘效率    更新机制    服务器支持
Flatpak             ★★★★★     ★★★★★     ★★★★☆     ★★★★★     ★☆☆☆☆
Snap                ★★★★☆     ★★★★☆     ★★★★☆     ★★★★★     ★★★★★
AppImage            ★☆☆☆☆     ★★★★★     ★★☆☆☆     ★★☆☆☆     ★☆☆☆☆

1.4 Flatpak 的技术架构

组件层次

┌──────────────────────────────────────────────────┐
│                    用户                           │
│               (通过 CLI 或 GUI)                   │
├──────────────────────────────────────────────────┤
│              flatpak (CLI 工具)                   │
├──────────────┬──────────────┬────────────────────┤
│  flatpak-builder  │  libostree  │  Bubblewrap     │
│  (构建工具)       │  (版本化存储)│  (沙箱运行)      │
├──────────────────┴──────────────┴────────────────┤
│              OSTree 仓库                          │
│    (应用、运行时、扩展 的版本化存储)               │
├──────────────────────────────────────────────────┤
│           Linux 内核 (namespaces, cgroups)        │
└──────────────────────────────────────────────────┘

关键术语

术语英文说明
应用Application最终用户安装运行的程序
运行时Runtime应用依赖的基础库集合 (如 GNOME Runtime)
SDKSoftware Development Kit用于构建应用的开发工具运行时
扩展Extension可选的附加组件 (主题、编解码器等)
清单Manifest描述应用构建过程的配置文件
远程仓库Remote托管 Flatpak 包的 OSTree 仓库
Flatpak Builderflatpak-builder自动化构建 Flatpak 的工具

1.5 适用场景分析

✅ 推荐使用 Flatpak 的场景

场景原因
桌面 GUI 应用Flatpak 专为桌面应用设计,Portal API 提供原生体验
需要特定依赖版本应用可捆绑特定版本的库,不受系统版本影响
跨发行版分发一次构建,所有主流发行版可用
安全敏感应用沙箱隔离保护用户数据
独立开发者无需为每个发行版维护单独的包

❌ 不推荐使用 Flatpak 的场景

场景原因替代方案
系统级服务/守护进程沙箱限制不适合系统服务RPM/DEB 包
CLI-only 工具Flatpak 面向桌面应用Snap 或 AppImage
内核模块无法在沙箱中运行DKMS 或原生包
对性能极度敏感沙箱有一定开销原生编译

1.6 业务场景

场景 1:跨发行版商业软件分发

一家小型 ISV(独立软件供应商)开发了一款视频编辑工具,需要支持 Ubuntu、Fedora、Arch 等发行版。传统方式需要维护至少 3 套 DEB/RPM 打包脚本。使用 Flatpak 后:

  • 只需维护一份 Manifest
  • 通过 Flathub 触达数百万 Linux 用户
  • 沙箱保护用户文件,符合安全审计要求

场景 2:企业内部工具分发

企业开发了内部使用的桌面客户端,需要安全地分发到员工的 Linux 工作站:

# 搭建私有 Flatpak 仓库
ostree init --repo=/srv/flatpak-repo --mode=archive-z2

# 从私有仓库安装
flatpak remote-add --no-gpg-verify internal-repo https://flatpak.example.com/repo/
flatpak install internal-repo com.example.InternalTool

1.7 实验:体验 Flatpak 沙箱

# 1. 安装一个简单的 Flatpak 应用
flatpak install flathub org.gnome.Calculator

# 2. 查看应用的沙箱权限
flatpak info --show-permissions org.gnome.Calculator

# 3. 运行应用并观察沙箱
flatpak run --verbose org.gnome.Calculator

# 4. 在沙箱内打开一个 shell
flatpak run --command=bash org.gnome.Calculator
# 此时你已在沙箱中,尝试以下命令:
ls /          # 注意:看到的不是宿主根目录
cat /etc/os-release
exit

1.8 注意事项

⚠️ Flatpak 不是容器
虽然 Flatpak 使用了类似容器的命名空间技术,但它不是 Docker/LXC 那样的通用容器。Flatpak 专注于桌面应用的打包与分发,不提供完整的操作系统环境。

⚠️ 运行时版本兼容性
Flatpak 运行时有明确的版本生命周期。如 org.freedesktop.Platform//22.08 已于 2024 年停止安全更新。发布应用时请使用当前受支持的运行时版本。

⚠️ 性能开销
沙箱带来的性能开销通常可以忽略不计(< 1%)。但频繁的文件系统访问(如编译大型项目)可能会因挂载命名空间略有延迟。


1.9 扩展阅读