软件交付

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

软件包不是单个归档文件或映像文件,而是一棵 Binary Large Object (BLOB) 树。树的根是一个名为“meta.far”的 BLOB哪个 包含文件包的元数据,其中包括“meta/contents”文件 包含对其余 BLOB 的引用。Fuchsia 软件包中的 BLOB 是content-addressed的,表示使用其内容的哈希值引用它们 内容。meta.far 本身的内容地址称为软件包哈希

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

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

显示由“meta.far”组成的 Fuchsia 软件包内容的示意图
  元数据和内容 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 设备上的软件请求由 软件包解析器。软件包解析器将确定系统是否已 本地缓存的软件包否则,解析器会从 并更新必要的内容 BLOB。

存储软件包

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

说明如何在“blobfs”上构建软件包缓存的示意图- a
 内容可寻址文件系统,用于删除重复的 BLOB,
 在软件包之间共享

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

练习:软件包

到目前为止,在此 Codelab 中,您一直在体验按需软件交付 但你可能都不知道!在本练习中,您将揭开层层面纱,详细了解软件包在 Fuchsia 设备上是如何传送和存储的。

重启模拟器

  1. 运行以下命令以关闭您当前拥有的所有模拟器实例 打开:

    ffx emu stop --all
    
  2. 启动新的模拟器实例:

    ffx emu start --headless
    

    启动完成后,模拟器将输出以下消息和 返回:

    Logging to "$HOME/.local/share/Fuchsia/ffx/emu/instances/fuchsia-emulator/emulator.log"
    Waiting for Fuchsia to start (up to 60 seconds)........
    Emulator is ready.
    

启动本地软件包服务器

运行以下命令以启动软件包服务器,并让模拟器能够 加载软件包:

fx serve

该命令会输出类似于以下内容的输出,指示服务器 正在运行,并且已成功将模拟器注册为目标设备:

[serve] Discovery...
[serve] Device up
[serve] Registering devhost as update source
[serve] Ready to push packages!
[serve] Target uptime: 139
[pm auto] adding client: [fe80::5888:cea3:7557:7384%qemu]:46126
[pm auto] client count: 1

检查软件包服务器

fx serve 命令运行用于传送内容的本地软件包服务器 分发到目标设备默认情况下,此服务器在端口 8083 上运行。

打开浏览器以http://localhost:8083。这将加载一个列出了 软件包代码库中当前可用的软件包。其中每个软件包都可以分发到设备。

监控软件包加载

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

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

fx shell pkgctl pkg-status fuchsia-pkg://fuchsia.com/spinning-square-rs
Package in registered TUF repo: yes (merkle=ef65e2ed...)
Package on disk: no

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

ffx log --filter pkg-resolver

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

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

fx shell 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 提示符,再次检查设备上的软件包状态:

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

Fuchsia 解析了该软件包,并在 需求!

浏览软件包元数据

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

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

fx shell pkgctl get-hash fuchsia-pkg://fuchsia.com/spinning-square-rs

该命令会返回唯一的软件包哈希:

ef65e2ed...

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

fx shell 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