【博客笔记】对比Fedora Flatpaks和Flathub remotes
对比Fedora Flatpaks和Flathub remotes
Comparison of Fedora Flatpaks and Flathub remotes - Fedora Magazine
这篇文章来自Fedora的官方杂志网站,以Fedora 35为背景介绍了Fedora Flatpaks和Flathub Remotes的区别。
在Fedora Workstation的应用商店安装应用的时候能看到有三种格式的应用:RPM、Fedora Flatpaks、Flathub,RPM是传统的包格式,这里对比后两者。首先这两个都是Flatpak包的仓库,Fedora Flatpaks是Fedora项目自己建立的仓库,Flathub Remotes是Flatpak的标准仓库。重要的区别在于:
- 目标相似但是动机不同:
- Fedora Flatpaks是为了将Fedora仓库中原有的RPM包转换为Flatpak,从而使得应用和系统进行一定程度的分离,使得系统更健壮,在Fedora各系统中的可移植性也更强。
- Flathub Remotes是为了在各种Linux桌面环境使用统一格式的应用,将依赖也打包到应用中(当然不是AppImage那种全部打包进去,而是一定程度上的分层,比如KDE和Gnome的相关库是被分离出来的)。
- 两者目标都是让应用更容易访问,易用最大化,维护最小化;动机上一个是为了Fedora系统自身,另一个是为了所有的Linux系统。
- 打包上的不同:
- 软件包的来源不同:Fedora Flatpaks来源都是Fedora本身的RPM包,而Flathub Remotes则来自各种类型包的再打包:源码、deb包、AppImage、Snap、tar.gz等。
- 软件包数量不同:显而易见,Fedora Flatpaks的包更少,查询命令如下:
flatpak remote-ls --app fedora | wc -l
和flatpak remote-ls --app flathub | wc -l
- 发布格式不同:Fedora Flatpaks中的Flatpak包是以容器格式发布的(OCI,Open Container Initiative,开放容器倡议),Flathub Remotes中的Flatpak包是以OSTree(或libostree)格式发布的。
- 容器技术是一个轻量化的虚拟机,没有真正虚拟化CPU、内存,实际只是在系统中隔离出了一部分,更类似沙箱(Flatpak包一直自称是沙箱运行)。
- OSTree是一个追踪系统二进制的工具,可以视为“二进制的Git”,这是Flatpak的默认格式。这种格式在遇到软件更新的时候会先对比变化的部分,保证其他部分不变,这就是增量更新(delta update)。
- Fedora Silverblue所谓的不可变系统就是采用OSTree对系统进行增量更新的,所有RPM包的安装都是通过OSTree实现。
- 疑问:怎么Flatpak还有不同的发布格式?
- 运行时的不同:
- Flatpak的运行时是一些核心依赖,然后应用重复使用这些依赖,所谓“降重”(deduplication),运行时可能在其他运行时之上,或者没有其他依赖。
- Flathub Remotes把这些依赖去中心化了,所以不同运行时被不同的应用依赖。比如基于GTK的应用依赖GNOME运行时(org.gnome.Platform),基于Qt的应用依赖KDE运行时(org.kde.Platform),它们都依赖freedesktop.org运行时(org.freedesktop.Platform)。这些依赖都是对应的组织自己发布到Flathub上的。
- Fedora Flatpaks不同之处在于只有一个运行时,所有的应用都依赖于Fedora运行时(org.fedoraproject.Platform)。(这个运行时应该做到支持容器就可以了,其他包的内容都放进容器了)
- “运行时”(Runtime)是一个计算机中常见词汇,不同场景下似乎含义不同,比如编程语言的运行时,软件包的运行时等。
总结一下:传统的RPM应用是和系统各种底层应用,包括库应用放在一块儿的,不管是命令行的Python还是图形界面的LibreOffice都是系统一部分;Fedora Flatpak把RPM应用打包成基于容器的Flatpak包,希望让应用和系统分离,但只依赖一个运行时;Flathub Remotes把应用打包成基于OSTree的Flatpak包,能够增量更新,为所有Linux系统设计,有多个不同的运行时搭积木式叠加。
(实际情况……有啥包就装啥……不如直接用AppImage呢!主要问题不是方案而是方案太多,能统一管理就好。现在就用应用商店管理官方应用,安装一个Appimage Hub来管理Appimage。命令行也尽可能用容器(Podman,比起Docker不用管理员权限))