为什么使用Flatpak?
- 问题:已经有了
apt
、dnf
等这种系统级的包管理器,为什么还要使用Flatpak?- Flatpak给软件提供相对独立的运行环境(沙箱),并提供权限控制功能,避免软件破坏或任意修改系统;
- Flatpak很大程度上解决了软件的兼容性问题,让“新系统跑旧软件”或“旧系统跑新软件”成为可能;因此Flatpak可以在非滚动更新的发行版上安装 比系统源内版本更高的软件;
- Flatpak支持诸多发行版,在不同的发行版上能够获得几乎相同的软件使用体验;
- Flatpak允许同一个软件的不同版本在系统内共存;
- Flatpak允许非root用户在单用户作用域内安装软件;
- ……
- 问题:我在用Snap或者AppImage,它们和Flatpak有什么区别嘛?
- Flatpak性能中等,略优于Snap,略差于AppImage;
- Flatpak、AppImage不需要服务(Service),而Snap需要Snapd;
- Flatpak、Snap提供权限控制功能,而AppImage不提供;
- Flatpak、Snap统一提供所有软件包的更新,而AppImage需要打包者自行适配应用内更新或利用第三方工具更新;
- Flatpak、Snap在发行版的预装情况方面有区别:
- Flatpak预装在这些发行版中:
- Fedora (Workstation/Silverblue/Kinoite)
- Manjaro
- Endless OS
- Linux Mint
- Rocky Linux (GNOME)
- AlmaLinux (GNOME)
- CentOS (GNOME)
- EuroLinux (GNOME)
- Pop!_OS
- elementary OS
- Clear Linux (Desktop)
- PureOS
- Zorin OS
- MX Linux
- KDE neon
- ……
- 而Snap预装在这些发行版中:
- Ubuntu系列 (Ubuntu Desktop, Ubuntu Server, KUbuntu, XUbuntu……)
- KDE neon
- Manjaro
- Solus
- Zorin OS
- ……
- Flatpak预装在这些发行版中:
- Flatpak和Snap均得到了两个软件中心(GNOME Software Center、KDE Plasma Discover)的支持,而Appimage需要使用第三方软件中心(如prateekmedia/appimagepool、app-outlet/app-outlet(同样支持Flatpak))
- ……
什么时候不用Flatpak?
- 软件与系统结合非常紧密、不适合在沙箱中运行时不应该使用Flatpak
- 或者说,这种情况下软件很难打包成Flatpak
- 例如:GParted、Wireshark、Virt-Manager
- 应当考虑系统软件包管理器(
apt
、dnf
等)
- 需要软件的便携性时不应该使用Flatpak
- 应当考虑将程序打包成单个文件的AppImage
- 命令行软件不应该使用Flatpak
- Flatpak有计划支持命令行程序,但目前体验不佳
- Flatpak不会自动创建软件包内程序文件的链接和别名,例如不能直接执行
go
只能执行flatpak run --command=/usr/lib/sdk/golang/bin/go org.freedesktop.Sdk//21.08
- Flatpak不会自动创建软件包内程序文件的链接和别名,例如不能直接执行
- 例如:Golang,Gcc,Docker,Minikube
- 应当考虑Snap或系统软件包管理器
- Flatpak有计划支持命令行程序,但目前体验不佳
- 运行内存(RAM)或存储空间(Storage)极为有限的时候不应该使用Flatpak
- 应当考虑系统软件包管理器;
App和Runtime
Flatpak 分为两种软件包:
- Application(App):应用本体;
- Runtime:应用所需的运行时;
“运行时”均是支持GUI显示的基本运行时(“没它打不开”),与桌面环境相关,一个“应用本体”只依赖一个“运行时”。
“运行时”目前主要有以下四种:
- FreeDesktop:最基础的运行时,提供D-Bus、GTK3、X11、Wayland等
org.freedesktop.Platform
org.freedesktop.Sdk
- GNOME:GNOME=FreeDesktop+GNOME_Specific;提供Gjs、GStreamer、GVFS等;
org.gnome.Platform
org.gnome.Sdk
- KDE:KDE=FreeDesktop+KDE_Specific;提供Qt等;
org.kde.Platform
org.kde.Sdk
- elementary:elementary=GNOME+elementary_Specific;提供elementaryOS专属的图标、Granite等;
io.elementary.Platform
io.elementary.Sdk
ID
每个App或Runtime都有一个ID,类似Andorid下App的包名,例如:
- (App) Blender:
org.blender.Blender
- (Runtime) Gnome Platform:
org.gnome.Platform
加入架构和版本号,就构成了 ID三元组:
org.blender.Blender/x86_64/stable
org.gnome.Platform/x86_64/43
加入软件包类型,就构成了 该App对应的Flatpak ostree分支名:
app/org.blender.Blender/x86_64/stable
runtime/org.gnome.Platform/x86_64/43
App和Extension
另一种对软件包的分类是:
- Application(App):(主要)应用,即可直接打开或运行的应用,例如:VLC、Blender;
- Extension:应用的扩展,有多种情况:
- 支持特定应用正常运行的其他软件或库(“没它用不了”),如:Wine、FFMpeg、Mesa;
- 特定应用所需的程序包(“没它用不好”),如:TeX环境、Rust语言(编译器)、Go语言(编译器);
- 软件自身的一部分,如:Blender的语言文件;
对应第一种分类时,App和Runtime都可以有Extension。Extension有自己的ID,命名规则是在App或Runtime的包名后加上Extension名:
- App的Extension,例如:
org.blender.Blender.Codecs
应用安装时,应用依赖的运行时和扩展也会被安装;
安装范围
Flatpak 有两种安装范围:
- System:系统级安装,需要root权限,安装的应用 系统上所有的用户均可见;
- User:用户级安装,安装的应用 仅当前用户(触发安装的用户)可见;
软件包的源
与其他的包管理器(系统级或Snap)一样,Flatpak也有“软件源”的概念(即“软件包源”)。
Flatpak的软件包源是一个OSTree Repo,Flatpak包按照软件包类型、ID、架构与版本存储在对应的OSTree分支中;而软件包的各种信息和描述(元数据,MetaData)则存放在特定的分支中以供软件中心调取;
每个Flatpak 的OSTree Repo就是一个文件夹;一般使用HTTPd/NGINX/Caddy做HTTP服务器分发该文件夹下的文件,而Flatpak及各软件中心使用HTTP协议访问和下载OSTree Repo内的文件。
.flatpakref
.flatpakref
文件描述了单个软件包的信息和获取方式,文件结构大致如下:
1 | [Faltpak Ref] |
示例:
1 | [Flatpak Ref] |
.flatpackref
文件可直接用于安装软件包的命令中,也可直接使用软件中心打开;
.flatpakrepo
.flatpakrepo
文件描述了单个软件包源的信息,文件结构大致如下:
1 | [Flatpak Repo] |
示例:
1 | [Flatpak Repo] |
.flatpakrepo
文件可用于flatpak remote-add
命令添加软件源,也可以直接使用软件中心打开;