软件交付

Fuchsia 软件通过软件包按需交付到系统。这是 Fuchsia 核心设计原则(即安全性可更新性)的关键组件。资源包可以独立更新和按需分发,就像网页一样。这样可以将漏洞补丁程序一次性推送到所有 Fuchsia 产品,而无需协调单个产品。

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

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

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

显示由“meta.far”元数据和内容 BLOB 集合组成的 Fuchsia 软件包内容的示意图。

如果两个或多个软件包共享相同的内容(例如库依赖项或字体资源),其元数据将指向该资源的同一内容地址。这样,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 基于 blobfs 运行 pkg-cache 服务,以方便软件包管理。

展示如何在“blobfs”的基础上构建软件包缓存的示意图。blobfs 是一个内容可寻址文件系统,可以去除重复的 BLOB,以便在软件包之间共享这些 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 |
+--------------------------+------+-----------------------------------------------+

当您运行 ffx product-bundle get 命令(请参阅上文“Fucsia SDK 使用入门”快速入门指南)时,系统就会创建 minimal-packages 代码库。此代码库包含 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 的基本软件单元:

紫红色组件