Fuchsia 包

Fuchsia 包是具有层次结构的命名空间,它负责组织与分发文件,并为 Fuchsia 系统提供一个或多个程序、组件或者服务。Fuchsia 包是一个代表分发单元的术语,尽管与许多其他包系统不同,但是该单元是由许多部分组成的,而不是单个二进制「BLOB」。

注意:关于组件的更多信息,请查阅 Fuchsia 组件框架的简介

包以 BLOB 的形式从 Fuchsia 包服务器上被下载下来。包服务器是 HTTP(s) 服务器。这些 BLOB 使用墨克根作为唯一标识。BLOB 先被定义内容,然后才根据 Fuchsia 墨克根 算法为其命名。如果两个 BLOB 具有相同的内容,那么它们的名字也必定相同。因此,每一个 BLOB 都有它唯一的标识,并以其墨克根作为键被写入持久化存储中。这样做是为了消除不同包之间 BLOB 的重复,例如,一个被多个包使用的共享库只会在设备中保存一份。

包服务器可以作为信任链的起点并能验证每个包的真实性。

注意:要理解 Fuchsia 中组件与包的工作方式,请查阅 Fuchsia 软件模型

Types of packages

The packages that comprise the Fuchsia operating system are categorized into three groups, which affect how they are managed:

包的种类

组成 Fuchsia 操作系统的软件包被分为三组,分组影响着它们是如何被管理的:

注意:要理解这些包是如何在 Fuchsia 构建中发挥作用的,请查阅 依赖集合

基本包 {#base-packages}

注意:基本包是系统组建过程中的一部分。但是无法确定一个包是否是基本包。

这些包是 Fuchsia 操作系统的基础部分,对系统和系统安全起重要作用。解析正在运行中的系统的基本包总是返回目前设备上的版本而不是包服务器上的较新(可能)版本。但是,基本包仍能通过 OTA 过程 得到更新。

由于这些包在系统运行期间无法修改,这些包必须通过 fx ota 命令来开启 over-the-air (OTA) 更新。

Cached packages {#cached-packages}

缓存包 {#cached-packages}

缓存包是设备中那些不是基本包的包。这些包存在于在设备被刷写或铺设时,因此这些包在设备断网启动时非常起用。如果包服务器上存在与之不同的包,缓存包会在解析过程中被更细。这些包不会在系统更新时更新,而是临时更新。

Fuchsia 也会在系统运行中根据运行时的资源需求删除缓存包来释放资源。

太空包 {#universe-packages}

太空包是指存在于包服务器上的包,而不是存在于设备上的包。

包的结构

在许多场合中,Fuchsia 中的一个包是众多 BLOB 的一个集合,至少包含一个名为 meta.far 内容寻址的 BLOB

注意:请查阅 Fuchsia 归档格式(FAR) 了解更多关于 Fuchsia 归档格式的信息。

在 Fuchsia 中,可通过 Fuchsia GN SDK 的 //tools/ 目录下的 pm 工具构建一个包。

Essentially, a package is a tree of zero or more content-addressed items. A package contains the following:

从本质上讲,包是一棵包含零个或多个内容寻址项的树。
一个包含有如下内容:

meta.far {#meta-far}

注意:请查阅 Fuchsia 归档格式(FAR) 了解更多关于 Fuchsia 归档格式的信息。

包的元数据归档,meta.far,包含着包的元数据,存在于 meta/ 目录下。在实践中,meta.far墨克根 也被认为就是包的墨克根。

包的 meta/ 目录下至少包含以下两个文件:

  • meta/package

    包的标识文件。这是一个含有包名和包版本号的 JSON 文件。

  • meta/contents

    内容文件。这个文件是 pm update 调用 pm build 工具创建的。这个文件将包面向用户的文件名映射为这些文件的 Merkle 根。

此外,meta/ 目录可以包含组件清单(manifest)等文件。关于组件清单的更多信息,请查阅 组件清单

meta/ 外部的 BLOB {#outside-blobs}

一个包的大多数文件都存在于 meta/ 目录外部,并且每个文件也都是 BLOB

例如,这些文件可能是如下形式:

  • bin/foo
  • lib/libfdio.so
  • data/mydata.db

包的标识

Fuchsia 中的每个包都使用 package-url 标识。
注意:点击查看更多关于 Fuchsia 包 URLs 的信息。

包的 URL 的形式如下所示:

  1. fuchsia-pkg://{{ '<var>' }}repository{{ '</var>' }}/{{ '<var>' }}package-name{{ '</var>' }}?hash={{ '<var>' }}package-hash{{ '</var>' }}#{{ '<var>' }}resource-path{{ '</var>' }}

取决于 URL 中出现了哪些字段,Fuchsia 对 fuchsia-pkg 的 URL 有不同的解释。

  • 如果出现了 repository、package 和 resource,则该 URL 标识包中的指定资源。
  • 如果只出现 repository 和 package,则该 URL 标识被指定的包本身。
  • 如果只出现 repository,则该 URL 标识被指定的 repository 本身。

URL 各字段可以表达不同程度的特异性。但必须至少提供包名,其后是否跟上包的哈希值则是可选的。

如果包的哈希值缺失,包解析器将从客户机可用的包变体的最新版本中获取该资源。