Flatpak概念

为什么使用Flatpak?

  • 问题:已经有了aptdnf等这种系统级的包管理器,为什么还要使用Flatpak?
    1. Flatpak给软件提供相对独立的运行环境(沙箱),并提供权限控制功能,避免软件破坏或任意修改系统;
    2. Flatpak很大程度上解决了软件的兼容性问题,让“新系统跑旧软件”或“旧系统跑新软件”成为可能;因此Flatpak可以在非滚动更新的发行版上安装 比系统源内版本更高的软件;
    3. Flatpak支持诸多发行版,在不同的发行版上能够获得几乎相同的软件使用体验
    4. Flatpak允许同一个软件的不同版本在系统内共存
    5. Flatpak允许非root用户在单用户作用域内安装软件
    6. ……
  • 问题:我在用Snap或者AppImage,它们和Flatpak有什么区别嘛?
    1. Flatpak性能中等,略优于Snap,略差于AppImage;
    2. Flatpak、AppImage不需要服务(Service),而Snap需要Snapd;
    3. Flatpak、Snap提供权限控制功能,而AppImage不提供;
    4. Flatpak、Snap统一提供所有软件包的更新,而AppImage需要打包者自行适配应用内更新或利用第三方工具更新;
    5. 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
        • ……
    6. Flatpak和Snap均得到了两个软件中心(GNOME Software Center、KDE Plasma Discover)的支持,而Appimage需要使用第三方软件中心(如prateekmedia/appimagepoolapp-outlet/app-outlet(同样支持Flatpak)
    7. ……

什么时候不用Flatpak?

  • 软件与系统结合非常紧密、不适合在沙箱中运行时不应该使用Flatpak
    • 或者说,这种情况下软件很难打包成Flatpak
    • 例如:GParted、Wireshark、Virt-Manager
    • 应当考虑系统软件包管理器(aptdnf等)
  • 需要软件的便携性时不应该使用Flatpak
    • 应当考虑将程序打包成单个文件的AppImage
  • 命令行软件不应该使用Flatpak
    • Flatpak有计划支持命令行程序,但目前体验不佳
      • Flatpak不会自动创建软件包内程序文件的链接和别名,例如不能直接执行go只能执行flatpak run --command=/usr/lib/sdk/golang/bin/go org.freedesktop.Sdk//21.08
    • 例如:Golang,Gcc,Docker,Minikube
    • 应当考虑Snap或系统软件包管理器
  • 运行内存(RAM)或存储空间(Storage)极为有限的时候不应该使用Flatpak
    • 应当考虑系统软件包管理器;

App和Runtime

Flatpak 分为两种软件包:

  • Application(App):应用本体;
  • Runtime:应用所需的运行时;

“运行时”均是支持GUI显示的基本运行时(“没它打不开”),与桌面环境相关,一个“应用本体”只依赖一个“运行时”。

“运行时”目前主要有以下四种:

  1. FreeDesktop:最基础的运行时,提供D-Bus、GTK3、X11、Wayland等
    • org.freedesktop.Platform
    • org.freedesktop.Sdk
  2. GNOME:GNOME=FreeDesktop+GNOME_Specific;提供Gjs、GStreamer、GVFS等;
    • org.gnome.Platform
    • org.gnome.Sdk
  3. KDE:KDE=FreeDesktop+KDE_Specific;提供Qt等;
    • org.kde.Platform
    • org.kde.Sdk
  4. 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
2
3
4
5
6
7
8
[Faltpak Ref]
Name=<软件包的ID>
Branch=<软件包的版本>
Title=<描述该软件包的标题(软件包名字)>
Url=<软件包所在的源的地址>
RuntimeRepo=<软件包依赖的运行时所在的源的地址>
IsRuntime=<本软件包是不是运行时>
GPGKey=<Base64编码的GPG密钥>

示例:

1
2
3
4
5
6
7
8
[Flatpak Ref]
Name=fr.free.Homebank
Branch=stable
Title=fr.free.Homebank from flathub
Url=https://dl.flathub.org/repo/
RuntimeRepo=https://dl.flathub.org/repo/flathub.flatpakrepo
IsRuntime=false
GPGKey=mQINBFlD2sABEADsiUZUO...

.flatpackref文件可直接用于安装软件包的命令中,也可直接使用软件中心打开;

.flatpakrepo

.flatpakrepo文件描述了单个软件包源的信息,文件结构大致如下:

1
2
3
4
5
6
7
8
[Flatpak Repo]
Title=<软件包源的名字>
Url=<软件包源的地址>
Homepage=<软件包源的主页,或软件包源维护者的主页>
Comment=<软件包源的简单描述,或是软件包维护者的信息>
Description=<软件包源的描述>
Icon=<软件包源的图标>
GPGKey=<软件包源的GPGKey>

示例:

1
2
3
4
5
6
7
8
[Flatpak Repo]
Title=Flathub
Url=https://dl.flathub.org/repo/
Homepage=https://flathub.org/
Comment=Central repository of Flatpak applications
Description=Central repository of Flatpak applications
Icon=https://dl.flathub.org/repo/logo.svg
GPGKey=mQINBFlD2sABEADsiUZUO...

.flatpakrepo文件可用于flatpak remote-add命令添加软件源,也可以直接使用软件中心打开;

评论