Flatpak原理¶
本页面简单介绍了Flatpak内部工作原理。虽然仅仅是使用Flatpak没必要熟悉这些,但是有些人可会会觉得这很有趣。从用户和应用开发者的角度来看,了解Flatpak的体系结构还有助于更好地理解它的工作方式和原因。
应用级Git¶
Flatpak建立在一种名为`OSTree <https://ostree.readthedocs.io/en/latest/manual/introduction/>`的技术之上,该技术受Git版本控制系统的影响,非常类似Git。与Git一样,OSTree允许跟踪版本化数据并在不同的仓库间分发。不同的是,Git为跟踪源文件设计,OSTree为跟踪二进制文件和其他大数据设计。
在内部,Flatpak的工作方式与Git类似,许多Flatpak概念与Git概念类似。 与Git一样,Flatpak使用仓库来存储数据,并跟踪版本之间的差异。
使用Flatpak,每个应用程序,运行时和扩展都是仓库中的一个分支。 标识符三元组,例如 `` com.company.App/i386/stable `` 是对该分支的引用。 Flatpak构建过程的输出是一个文件目录,它提交给其中一个分支。
使用Flatpak安装应用时,会将其从远程仓库中拉入到本地仓库中的新分支。 然后生成从文件系统指向仓库的链接(这些链接是快速解析和高效利用的磁盘空间`硬链接 <https://en.wikipedia.org/wiki/Hard_link>`)。 换句话说,安装的每个应用程序都存储在本地版本控制仓库中,然后映射到本地文件系统。
因此,版本跟踪是Flatpak架构的核心部分,这使得更新软件非常高效。 版本控制也使回滚成为可能,因此如果需要,可以很容易地回滚到以前的版本。
将应用程序存储在本地OSTree存储库中具有其他优点。 例如,它允许对存储在磁盘上的文件去重,所以属于多个应用程序(或运行时)的同一文件仅存储一次。
基础技术¶
Flatpak使用了许多已经存在的技术。如:
- The bubblewrap utility from Project Atomic, which lets unprivileged users set up and run containers, using kernel features such as:
- Cgroups
- Namespaces
- Bind mounts
- Seccomp rules
- `systemd <https://www.freedesktop.org/wiki/Software/systemd/>`为沙盒启动cgroups
- D-Bus <https://www.freedesktop.org/wiki/Software/dbus/>,一种成熟的为应用程序提供高级API的方法
- `Open Container Initiative <https://www.opencontainers.org/>`的OCI格式,作为单文件包的便捷传输格式
- `OSTree <https://ostree.readthedocs.io/en/latest/>`系统,版本化和分布式文件系统树
- `Appstream <https://www.freedesktop.org/software/appstream/docs/>`元数据,允许Flatpak应用在软件中心友好的展示