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
:软件包中人类可读的文件名映射到 内容地址
如果两个或多个软件包共享相同的内容(例如库依赖项), 或字体资源),其元数据将指向 该资源。这使 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 设备上的软件请求由 软件包解析器。软件包解析器将确定系统是否已 本地缓存的软件包否则,解析器会从 并更新必要的内容 BLOB。
存储软件包
在设备上,软件包 BLOB 存储在内容可寻址文件系统中。
针对名为 blobfs
的一次写入、经常读取的文件进行了优化。这样,系统就可以在所有软件包中删除重复项,并使用哈希进行加密验证。Fuchsia 负责运营pkg-cache
服务,以方便软件包管理。blobfs
pkg-cache
层会跟踪系统中当前处于活动状态的软件包。未在 Fuchsia 中明确安装或移除软件包。
软件是按需提供的,同样地,客户也可以
通过定期垃圾回收不再活跃的软件包。
当 pkg-cache
触发垃圾回收以回收空间时,内容 BLOB
未被任何活跃软件包引用。
练习:软件包
到目前为止,在此 Codelab 中,您一直在体验按需软件交付 但你可能都不知道!在本练习中,您将揭开层层面纱,详细了解软件包在 Fuchsia 设备上是如何传送和存储的。
重启模拟器
运行以下命令以关闭您当前拥有的所有模拟器实例 打开:
ffx emu stop --all
启动新的模拟器实例:
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 开源项目和 用于构建和自定义系统的工具: