Fuchsia 软件通过软件包按需交付到系统。 这是 Fuchsia 的核心设计原则(即 安全性和可更新性。软件包可以独立更新,并按需交付,就像网页一样。这使得我们能够 同时推送到所有 Fuchsia 产品,而无需单个产品 协调。
包不是单个归档文件或映像文件,而是由二进制文件树构成的 大型对象 (BLOB)。树的根是一个名为“meta.far”的 BLOB哪个 包含文件包的元数据,其中包括“meta/contents”文件 包含对其余 BLOB 的引用。Fuchsia 软件包中的 BLOB 是内容寻址的,这意味着它们是使用其内容的哈希进行引用的。元.far 本身的内容地址称为包 哈希。
meta.far 包含一个 meta/
目录,其中至少
以下两项:
meta/package
:包含软件包身份信息的 JSON 文件 例如名称和版本meta/contents
:软件包中人类可读的文件名映射到 内容地址
如果两个或更多软件包共享相同的内容(例如库依赖项或字体资源),则其元数据将指向该资源的相同内容地址。这使 Fuchsia 能够优化软件包分发并 因此无需提取和保存已经存在的 BLOB 内容, 存在。
托管和提供软件包
软件包托管在基于更新框架 (TUF) 的代码库中。此框架是一项规范,旨在实现安全地分发软件更新。TUF 存储库通过附加的签名元数据实现安全更新 并对照已知的可信公钥和私钥进行验证的记录。 这意味着,任何 HTTP 服务器都可以处理 TUF 代码库,而不需要 (包括开发者工作站!)
代码库中的软件包通过采用 fuchsia-pkg
架构的网址进行标识:
fuchsia-pkg://repo-hostname/pkg-name#resource-path
repo-hostname
:受信任的软件包代码库的主机名,例如fuchsia.com
。pkg-name
:此代码库中软件包的唯一标识符。resource-path
:软件包中包含的资源,例如组件 清单。
Fuchsia 设备上的软件请求由软件包解析器处理。软件包解析器将确定系统是否已 本地缓存的软件包如果没有,解析器会从代码库提取 meta.far 并更新必要的内容 BLOB。
存储软件包
在设备上,软件包 BLOB 存储在内容可寻址文件系统中。
针对名为 blobfs
的一次写入、经常读取的文件进行了优化。这样,他们就能
系统会在所有软件包中去重
使用哈希值进行加密验证。Fuchsia 负责运营pkg-cache
服务,以方便软件包管理。blobfs
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 的软件基本单元: