RFC-0072:独立图像组装工具

RFC-0072:独立图片汇编工具
状态已接受
领域
  • Build
说明

创建一个独立的映像组合工具,该工具也可供 Fuchsia build 使用。

Gerrit 更改
  • 478494
作者
审核人
提交日期(年-月-日)2021-01-29
审核日期(年-月-日)2021-03-05

总结

本文档提出了一种适合包含在 Fuchsia SDK 中的独立工具,用于从软件包和其他已编译的工件中汇编 Fuchsia“系统映像”。

设计初衷

产品组装 - 无需使用完整的 fuchsia.git 检出和 build,即可从 Fuchsia 平台 fuchsia.git 和产品自己的代码库及其他代码库中的组件和软件包将 Fuchsia 交付给设备的一组工件。

该工具会执行产品组装流程的最后一步,即根据之前构建的输入创建系统工件。

此工具还用作 fuchsia.git build 本身的一部分,替代了 //build/resources/BUILD.gn 中的许多脚本和 GN 模板。

术语库

组装

创建最终系统输出文件,该文件可用于将紫红色传送到设备。

base

BlobFS 中的软件包,通过其内容标识标识为 pkgfs,其中包含基本系统(例如 /system)。在当前 build 中,这称为 system_image 软件包。如需了解详情,请参阅此处

BlobFS

BlobFS 是 Fuchsia 的内容寻址文件系统。

板级支持数据

这些输入描述执行组装过程所需的低级硬件详细信息(例如分区表、闪存块大小、用于刷写到设备上或添加到更新软件包的设备引导加载程序映像等)。

内容寻址

内容寻址是一种根据内容内容的加密安全哈希来识别内容的方法。在 Fuchsia 上,BlobFSpkgfs 以及系统的其他部分使用此参数以安全的方式标识文件。

FVM 图片

系统映像工件

由包含 Fuchsia 的 build 创建的一组最终输出工件。这是用于通过不同方式(OTA、刷写、铺路等)将 Fuchsia 交付到设备的更多工件。

update

该软件包包含用于更新系统的文件和规则。如需了解详情,请参阅此处

vbmeta”图片

设备上运行的引导加载程序使用启动时验证元数据来验证 zbi 是否可信,可由引导加载程序执行。

ZBI

此文件包含引导 Fuchsia 所需的所有内容。

设计

该工具主要是当前由 //build/resources/BUILD.gn 及其关联脚本执行的步骤和流程的复制。

该工具是一个 ffx 插件,它既可用作紫红 build 的一部分,也可用作外部 build。

输入源

从操作上看,该工具会将以下数据作为输入:

一组选项,用于指定应创建哪些图片文件:

  • base 软件包
  • ZBI
  • vbmeta 映像
  • update 软件包
  • Flash 映像:
    • BlobFS 块设备映像
    • FVM 块设备映像
  • 最终映像清单

下图显示了哪些输入(和输出)用于创建各种最终输出:

┌─────────┐┌────────┐┌────────┐┌───────────┐┌─────────────────┐
│  Board  ││ Kernel ││ Kernel ││  List of  ││     List of     │
│ Support ││ Image  ││  Args  ││  BootFS   ││    packages     │
└┬──┬─────┘└┬───────┘└┬───────┘│   Files   │└┬───────────────┬┘
 │  │       │         │        └┬──────────┘ │               │
 │  │       │         │        ┌V───────┐   ┌V─────────────┐ │
 │  │       │         │        │ BootFS │   │ base package │ │
 │  │       │         │        └┬───────┘   └┬──┬──────────┘ │
 │  │      ┌V─────────V─────────V────────────V┐ │            │
 │  │      │ZBI                               │ │            │
 │  │      └┬───────┬─────────────────────────┘ │            │
 │  │      ┌V─────┐ │                           │            │
 │  │      │VBMeta│ │                           │            │
 │  │      └┬─────┘ │                           │            │
 │ ┌V───────V───────V───────────────────────────V────────────V┐
 │ │ update package                                           │
 │ └┬──┬──────────────────────────────────────────────────────┘
 │  │ ┌V───────┐
 │  │ │ BlobFS │
 │  │ └┬───────┘
┌V──V──V┐
│  FVM  │
└───────┘

如需创建 base 软件包,该工具需要:

  • 要合并到系统的软件包文件列表(“基本”和“缓存”软件包集中的软件包)

要创建 ZBI,该工具需要:

  • 要合并到 bootfs 中的文件列表(拥有访问权限)
  • base 软件包的“内容身份”
  • 要放入 ZBI 的 Zircon 内核映像
  • 传递给 Zircon 内核的命令行参数

要创建 vbmeta 映像,该工具需要:

  • ZBI

如需创建更新软件包,该工具需要:

  • base 中包含的软件包列表
  • base 软件包
  • ZBI
  • vbmeta 映像
  • 恢复槽位的 ZBI(可选)
  • 恢复槽位的 vmbeta 映像(如果已提供 recovery zbi)
  • 引导加载程序固件映像

如需创建可刷写的块设备映像,该工具需要:

  • 板级支持数据:
    • 分区表
    • 等等
  • 以及以下任一项:
    • 一个 update 软件包
    • 或直接提供以下信息:
    • 引导加载程序
    • vbmeta
    • ZBI
    • BlobFS 软件包

输出

汇编工具根据指示它生成以下输出:

软件包

  • base
  • update

图片文件

  • blobfs 块设备映像
  • ZBI
  • vbmeta
  • fvm Flash 映像

结果清单

当系统指示该工具创建清单中描述的输出文件时,会生成以下清单。

  • 所有软件包(包括 baseupdate)的清单
  • 生成的所有图片文件的清单,其中包含:
    • 图片的内容身份哈希
    • 图片所针对的架构
    • 对于图片中包含的所有文件:
    • 他们自己的内容身份
    • 文件的来源(文件路径)

输入和架构

为实现构建工具兼容性,输入最初是由 GN 生成的。例如,用于描述正在构建的所有软件包的元数据遍历的结果。

请参阅:

实现

最终工具将基于以下因素构建:

  • ffx 插件,可通过 ffx 使用。
  • 包含大部分实现和单元测试的 Rust 库。
  • GN 模板,用于正确使用 fuchsia.git build 中的工具。
  • 为方便使用而封装的现有工具:

为方便 fuchsia.git 树内 build 的过渡,我们还将提供:

  • CLI 工具,可根据需要公开特定功能,以便从现有 GN 模板和脚本顺利过渡到新工具。
  • 更新了 GN 模板,以封装该功能。

上述过渡工具不属于该工具的永久界面,而是用于提供过渡路径,以便最大限度地降低 Fuchsia.git build 的风险。

试发布计划

为了降低风险,该工具将小心集成到 fuchsia.git 中:

  • 作为集成测试,会在其输出与现有脚本和工具的输出不匹配时记录日志
  • 然后该测试就变成了失败测试
  • 针对众多 CQ build 进行了滚动和几天的磨合后,这些新工具将取代现有的

向后兼容性

向 SDK 添加此工具不会改变任何现有的向后兼容性问题,因为它可以通过另一种方式使用 SDK 中当前存在的现有工具。在以下方面,工具使用的内核和驱动程序应与 SDK 工具匹配(或者比该工具更新)。

性能

使用 CLI 工具对 Fuchsia 构建速度的影响微乎其微。虽然它将许多操作从 Python 迁移到 Rust,但它也将自身添加为必须执行的编译步骤。

该工具的存在允许重新组装一组不同的组件,而无需执行 Fuchsia 本身的完整构建。

安全注意事项

通过输出清单,您可以审核所生成的映像工件的内容和来源。

隐私注意事项

没有任何隐私问题。

测试

核心库将包含涵盖以下内容的单元测试:

  • 输入验证
  • 架构解析
  • 架构生成
  • 组装流程操作的每个步骤:
    • 为运行的外部工具生成的命令行
    • 解析外部工具的输出
    • 正确生成和解析中间文件

文档

您需要对此工具的 ffx 接口进行记录。