惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
L
LINUX DO - 最新话题
TaoSecurity Blog
TaoSecurity Blog
S
Security Affairs
H
Hacker News: Front Page
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Hacker News: Ask HN
Hacker News: Ask HN
T
The Exploit Database - CXSecurity.com
P
Proofpoint News Feed
Google DeepMind News
Google DeepMind News
Schneier on Security
Schneier on Security
云风的 BLOG
云风的 BLOG
I
InfoQ
The Register - Security
The Register - Security
T
Tor Project blog
T
Threat Research - Cisco Blogs
Spread Privacy
Spread Privacy
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
The GitHub Blog
The GitHub Blog
MongoDB | Blog
MongoDB | Blog
Webroot Blog
Webroot Blog
Recent Announcements
Recent Announcements
Vercel News
Vercel News
F
Fortinet All Blogs
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
SecWiki News
SecWiki News
G
Google Developers Blog
N
Netflix TechBlog - Medium
U
Unit 42
Martin Fowler
Martin Fowler
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
O
OpenAI News
博客园 - 叶小钗
T
Tailwind CSS Blog
爱范儿
爱范儿
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Help Net Security
Help Net Security
A
About on SuperTechFans
Recorded Future
Recorded Future
Last Week in AI
Last Week in AI
Hugging Face - Blog
Hugging Face - Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
D
DataBreaches.Net
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
The Blog of Author Tim Ferriss
PCI Perspectives
PCI Perspectives
F
Full Disclosure
美团技术团队
L
Lohrmann on Cybersecurity
H
Hackread – Cybersecurity News, Data Breaches, AI and More

陈陈菌博客

如何在 podman 容器内使用 systemd 在 podman 运行 GUI 应用的经验总结 管理 podman 容器与镜像的导入或导出 用 xdg-dbus-proxy 解决容器的文件选择器的问题 解决 VSCodium 或 Code-Server 无法安装 GitHub Copilot 问题 不可变发行版 Fedora Silverblue 的体验记录 解决 apt 或 dnf 无法 tab 补全的问题 对 (MPA) 多页面切换实现丝滑动画的探索 让服务在非 Root 权限下使用 80 或 443 端口 AppImage 应用打包快速上手 如何用 webSocket 实现一个实时聊天应用 Linux 内核编译 | 快速上手 | deb 使用 debootstrap 构建 Debian 系根文件系统 高度可定制的 KDE 窗口装饰器 klassy 有关 docker、podman、nspawn、bwrap 的 Linux 容器图形性能测试 创建任意 Linux 容器并支持 GUI 程序 (Docker) 创建任意 Linux 容器并支持 GUI 程序 (nspawn) 文件同步工具 rsync 的使用 玲珑 (Linyaps) 应用打包 RPM 打包指南 | 精简版 PBR 材质的各种贴图类型入门 APU | Stable-Diffusion 使用记录 如何在 Electron 上启用 WebGPU Grub 主题安装与配置 Fcitx5 主题安装与自定义 不使用 Nginx 的网站开发指南 如何自制一个简易的资源监控程序 SQL 常用 CRUD 语法记录 Debian 打包入门,与需要注意的问题 在 fedora 建立一个 Arch 容器 (bwrap) 在 fedora 上建立一个 debian 容器 (bwrap) i3wm | 自制一个极简的屏幕亮度调节器 在 Linux 下启用内存压缩技术 zram 搭建一个本地轻量级聊天 Ai 我又又又重新上线了博客 如何通过命令行管理 wine 容器 (包括 proton) Btrfs 文件系统创建 swap 文件的方法 如何创建适用于 Linux 桌面的程序启动文件 在 Linux 控制 intel CPU 调度的方法 Arch Linux 的基本安装
Flatpak 使用和应用打包快速上手
GlumiStudio@ · 2025-11-26 · via 陈陈菌博客

2025-11-26 12:51:46

分类: Linux 标签: 容器


Flatpak,它是一种 Linux 跨发行版的通用软件包管理,使用沙箱隔离环境来运行程序,为了解决发行版应用分发碎片化、依赖冲突、权限管理混乱问题。开发者可以把应用统一封装成 flatpak 格式进行分发,这样就不用关心那些杂七杂八的问题,主要用于桌面应用(当然如果想打包 cli 也是可以的)

Flatpak 的安装


这里以 Debian 系为例。

# Debian / Ubuntu
sudo apt install flatpak

添加 flathub 官方仓库

flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo

桌面插件可选项


如果使用 gnome 桌面,可以安装

sudo apt install gnome-software-plugin-flatpak

如果使用 kde plasma 桌面,可以安装

sudo apt install plasma-discover-backend-flatpak

常用使用命令


# 安装应用
flatpak install <appid>
# 更新应用
flatpak update <appid>
# 卸载应用
flatpak uninstall <appid>
# 运行应用
flatpak run <appid>
# 列出正在运行的应用
flatpak ps
# 列出已安装的包
flatpak list
# 杀掉应用
flatpak kill 实例

应用打包快速上手


首先编写一个 .yml 的文件,比如可以为:cn.glumi.hello.yml,而内容格式为:

id: cn.glumi.hello
runtime: org.freedesktop.Platform
runtime-version: '25.08'
sdk: org.freedesktop.Sdk
command: hello.sh
modules:
  - name: hello
    buildsystem: simple
    build-commands:
      - install -D hello.sh /app/bin/hello.sh
    sources:
      - type: file
        path: hello.sh

其中这里 id 就是我们的应用 appid, runtime 和 runtime-version 是它所依赖的运行时环境和版本。

sdk 这里也是必须的基础环境,command 是我们应用的启动命令。

我们可以这样去安装它们:

flatpak install org.freedesktop.Platform/x86_64/25.08 org.freedesktop.Sdk/x86_64/25.08

这里我们只有一个模块,叫 hello,它的源文件是一个 hello.sh 的shell 脚本,内容非常简单:

echo "Hello Flatpak"

buildsystem 为构建类型,它可以是 make(makefile) 而 simple 是一个通用的构建方式,用于那些不使用那些构建系统的项目。你可以手动指定构建和安装命令。而 build-commands 就是我们的所做的自定义命令,这里我只做了 install 操作(相当于文件拷贝,但可设置权限和所有者等)

但为什么会是 /app/bin/hello.sh 呢?

你可以简单理解为:/app 相当于 flatpak 应用的根目录

沙箱与隔离


Flatpak 的核心设计理念之一就是应用沙箱化,即每个应用都运行在一个隔离的环境中,与系统和其他应用隔离开来。 系统目录是只读的:在 Flatpak 构建过程中,你可以把整个构建环境想象成一个微型操作系统。系统级的目录,比如 /usr、/bin、/lib 等,都属于只读的运行时(runtime)。你无法在构建脚本中向这些目录写入任何文件。

所以 Flatpak 也提供了一个专门的目录 /app,作为你应用的专属安装空间。你打包的所有文件(可执行文件、库、图标、配置等)都应该安装到这个目录下。

开始构建


在我们搞清楚基本情况后,就开始构建吧。 此时假如我们当前目录下文件是这样的

├── cn.glumi.hello.yml
└── hello.sh

接下来执行:flatpak-builder --force-clean --user --repo=repo --install build-dir cn.glumi.hello.yml

这里有非常多参数,具体作用:

--user:将最终构建好的应用安装到当前用户的 Flatpak 目录中

--repo:这里是你要指定的本地仓库名,为什么需要呢?因为 Flatpak 应用的安装通常是从一个仓库(无论是本地的还是远程的,如 Flathub)进行的

build-dir:这里是我们构建过程所产生的应用程序文件夹

--force-clean : 在开始新的构建之前,会删除之前同名的构建过程文件夹比如 build-dir

--install:带这个参数会直接安装

执行命令后如果一切按预期工作,没有报错的话,接下来目录是这样的:

├── build-dir
├── cn.glumi.hello.yml
├── hello.sh
└── repo

接下来我们可以使用以下命令来导出一个 flatpak 文件:

flatpak build-bundle ./repo hello.flatpak cn.glumi.hello

命令说明:这里 ./repo 是我们选的本地仓库,而 hello.flatpak 是要导出的软件包文件名,cn.glumi.hello 就是 appid.

不出意外就是这样:

可以使用 flatpak install 去安装,并运行。

安装后的应用会在 /var/lib/flatpak/app/ 下面, 如果加了 --user 会在 /.local/share/flatpak/app/ 下面,而应用数据存在 ~/.var/app/<id>/ 下面,这里专门给 flatpak 应用可读写文件的地方。