Fuchsia 软件通过软件包按需交付到系统。这是 Fuchsia 核心设计原则(即安全性和可更新性)的关键组件。资源包可以独立更新和按需分发,就像网页一样。这样可以将漏洞补丁程序一次性推送到所有 Fuchsia 产品,而无需协调单个产品。
软件包不是单个归档文件或图片文件,而是二进制大型对象 (BLOB) 的树。树的根是一个名为“meta.far”的 BLOB,它包含软件包的元数据,其中包括一个“meta/contents”文件,其中包含对其余 BLOB 的引用。Fuchsia 软件包中的 BLOB 经过内容寻址,这意味着使用其内容的哈希值来引用它们。meta.far 本身的内容地址称为“软件包哈希”。
元.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 基于 blobfs
运行 pkg-cache
服务,以方便软件包管理。
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 的基本软件单元: