软件交付

Fuchsia 软件通过软件包按需交付到系统。 这是 Fuchsia 的核心设计原则(即 安全性可更新性。软件包可以独立更新,并按需交付,就像网页一样。这使得我们能够 同时推送到所有 Fuchsia 产品,而无需单个产品 协调。

包不是单个归档文件或映像文件,而是由二进制文件树构成的 大型对象 (BLOB)。树的根是一个名为“meta.far”的 BLOB哪个 包含文件包的元数据,其中包括“meta/contents”文件 包含对其余 BLOB 的引用。Fuchsia 软件包中的 BLOB 是内容寻址的,这意味着它们是使用其内容的哈希进行引用的。元.far 本身的内容地址称为包 哈希

meta.far 包含一个 meta/ 目录,其中至少 以下两项:

  • meta/package:包含软件包身份信息的 JSON 文件 例如名称和版本
  • meta/contents:软件包中人类可读的文件名映射到 内容地址

显示 Fuchsia 软件包内容的图表,其中包含“meta.far”元数据和一组内容 BLOB。

如果两个或更多软件包共享相同的内容(例如库依赖项或字体资源),则其元数据将指向该资源的相同内容地址。这使 Fuchsia 能够优化软件包分发并 因此无需提取和保存已经存在的 BLOB 内容, 存在。

托管和提供软件包

软件包托管在基于更新框架 (TUF) 的代码库中。此框架是一项规范,旨在实现安全地分发软件更新。TUF 存储库通过附加的签名元数据实现安全更新 并对照已知的可信公钥和私钥进行验证的记录。 这意味着,任何 HTTP 服务器都可以处理 TUF 代码库,而不需要 (包括开发者工作站!)

代码库中的软件包通过采用 fuchsia-pkg 架构的网址进行标识:

fuchsia-pkg://repo-hostname/pkg-name#resource-path
  • repo-hostname:受信任的软件包代码库的主机名,例如 fuchsia.com
  • pkg-name:此代码库中软件包的唯一标识符。
  • resource-path:软件包中包含的资源,例如组件 清单。

展示如何从 TUF 代码库解析和缓存软件包的示意图
 存储在设备本地

Fuchsia 设备上的软件请求由软件包解析器处理。软件包解析器将确定系统是否已 本地缓存的软件包如果没有,解析器会从代码库提取 meta.far 并更新必要的内容 BLOB。

存储软件包

在设备上,软件包 BLOB 存储在内容可寻址文件系统中。 针对名为 blobfs 的一次写入、经常读取的文件进行了优化。这样,他们就能 系统会在所有软件包中去重 使用哈希值进行加密验证。Fuchsia 负责运营pkg-cache 服务,以方便软件包管理。blobfs

此图展示了如何在“blobfs”(一种内容寻址文件系统,用于删除重复的 BLOB 以便在软件包之间共享)之上构建软件包缓存。

pkg-cache 层会跟踪系统中当前处于活动状态的软件包。在 Fuchsia 中,软件包不会被明确安装或移除。软件是按需提供的,同样地,客户也可以 通过定期垃圾回收不再活跃的软件包。 当 pkg-cache 触发垃圾回收以回收空间时,内容 BLOB 未被任何活跃软件包引用。

练习:软件包

到目前为止,您已在本 Codelab 中体验了按需向设备分发软件,而您可能还不知道!在本练习中,您将揭开层层面纱,详细了解软件包在 Fuchsia 设备上是如何传送和存储的。

启动模拟器

如果您尚未运行实例,请通过网络启动 FEMU 支持:

ffx emu start workstation_eng.x64 --headless

检查系统软件包

列出在软件包服务器中配置的软件包代码库:

ffx repository list

此命令会输出类似于以下内容的输出:

+--------------------------+------+-----------------------------------------------+
| NAME                     | TYPE | EXTRA                                         |
+==========================+======+===============================================+
| minimal-packages     | pm   | /home/alice/.local/share/Fuchsia/.../packages |
+--------------------------+------+-----------------------------------------------+

minimal-packages 代码库是在运行 ffx product-bundle get 命令(之前是在“Fucsia SDK 使用入门”中) 快速入门指南)。此存储库包含用于 minimal-x64 预构建映像。

在本地软件包服务器运行的情况下,您可以浏览 可用:

ffx repository package list -r minimal-packages

此命令会输出有关代码库中每个软件包的其他详细信息,包括各个组件。

监控软件包加载

Fuchsia 设备会按需解析和加载软件包。请查看 spinning-square 示例软件包的实际操作。

您可以通过设备 shell 提示确认设备上当前是否存在已知软件包:

ffx target ssh pkgctl pkg-status fuchsia-pkg://fuchsia.com/spinning-square-rs
Package in registered TUF repo: yes (merkle=ef65e2ed...)
Package on disk: no
ffx target ssh ERROR: Error running ssh: exit status 2

打开新终端,然后开始流式传输 pkg-resolver 的设备日志:

ffx log --filter pkg-resolver

此列显示从软件包加载软件包的所有实例 服务器。

在设备 shell 提示中,尝试解析软件包:

ffx target ssh pkgctl resolve fuchsia-pkg://fuchsia.com/spinning-square-rs

请注意,pkg-resolver 的日志输出中添加了以下新行:

[pkg-resolver] INFO: attempting to resolve fuchsia-pkg://fuchsia.com/spinning-square-rs as fuchsia-pkg://default/spinning-square-rs with TUF
[pkg-resolver] INFO: resolved fuchsia-pkg://fuchsia.com/spinning-square-rs as fuchsia-pkg://default/spinning-square-rs to 21967ecc643257800b8ca14420c7f023c1ede7a76068da5faedf328f9d9d3649 with TUF

在设备 shell 提示中,再次检查设备上的软件包状态:

ffx target ssh pkgctl pkg-status fuchsia-pkg://fuchsia.com/spinning-square-rs
Package in registered TUF repo: yes (merkle=21967ecc...)
Package on disk: yes

Fuchsia 解析了该软件包,并按需从本地 TUF 代码库加载了该软件包!

浏览软件包元数据

现在,spinning-square 软件包已成功解析,您可以执行以下操作: 浏览软件包内容。解决后,系统会在 根据设备的内容地址定位设备。

在设备 shell 提示符中,使用 pkgctl get-hash 命令确定 spinning-square 的软件包哈希:

ffx target ssh pkgctl get-hash fuchsia-pkg://fuchsia.com/spinning-square-rs
ef65e2ed...

pkgctl open 命令提供完整的软件包哈希以查看软件包 内容:

ffx target ssh pkgctl open ef65e2ed...
opening ef65e2ed...
package contents:
/bin/spinning_square
/lib/VkLayer_khronos_validation.so
/lib/ld.so.1
/lib/libasync-default.so
/lib/libbackend_fuchsia_globals.so
/lib/libc++.so.2
/lib/libc++abi.so.1
/lib/libfdio.so
/lib/librust-trace-provider.so
/lib/libstd-e3c06c8874beb723.so
/lib/libsyslog.so
/lib/libtrace-engine.so
/lib/libunwind.so.1
/lib/libvulkan.so
/meta/contents
/meta/package
/meta/spinning-square-rs.cm
/data/fonts/RobotoSlab-Regular.ttf
/meta/fuchsia.abi/abi-revision
/data/vulkan/explicit_layer.d/VkLayer_khronos_validation.json

这里会列出文件包元数据和文件包中的每个内容 BLOB。 您可以查看可执行文件对应的 bin/ 个条目、共享库的 lib/ 个条目 依赖项、其他元数据和资源。

后续操作

恭喜!现在,您已经更好地了解了 Fuchsia 的独特之处,以及推动此新平台设计的目标。

在下一个单元中,您将详细了解如何构建 Fuchsia 的软件基本单元:

Fuchsia 组件