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

RFC-0072:独立映像汇编工具
状态已接受
区域
  • 构建
说明

创建一个可供 Fuchsia build 使用的独立映像汇编工具。

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

摘要

本文档提出了一款适合纳入 Fuchsia SDK 的独立工具,用于从软件包和其他已编译工件组装 Fuchsia“系统映像”。

设计初衷

产品组装是指从 Fuchsia 平台 fuchsia.git 以及产品自己的代码库和其他代码库中创建一组工件,以便将 Fuchsia 交付给设备的过程,而无需使用完整的 fuchsia.git 签出和构建。

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

此工具还用于 fuchsia.git build 本身,可替换 //build/resources/BUILD.gn 中的许多脚本和 GN 模板。

术语库

汇编

创建可用于将 Fuchsia 提交到设备的最终系统输出文件。

base 软件包

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

BlobFS

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

板级支持数据

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

Content-Addressing

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

FVM 映像

系统映像工件

由包含 Fuchsia 的 build 创建的最终输出工件集。这是一个较大的工件集,用于通过不同的方式(OTA、刷写、铺路等)将 Fuchsia 提交给设备

update 软件包

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

vbmeta”图片

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

ZBI

ZBI 是 Zircon 启动映像。这是内核和 ramdisk bootfs 其中包含引导 Fuchsia 所需的一切。

设计

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

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

输入

在操作方面,该工具的输入包括:

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

  • base 软件包
  • ZBI
  • vbmeta 映像
  • update 软件包
  • 闪光图片:
    • 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 软件包,该工具需要:

  • 要纳入系统的软件包文件的列表(“base”和“cache”软件包集中的软件包)

如需创建 ZBI,该工具需要:

  • 要合并到 bootfs 中的文件列表(有权访问这些文件)
  • base 软件包的“内容标识
  • 要放置在 ZBI 中的 Zircon 内核映像
  • 要传递给 Zircon 内核的命令行参数

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

  • ZBI

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

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

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

  • 开发板支持数据:
    • 分区表
    • 等等
  • 以及以下任一情况:
    • update 软件包
    • 或直接提供:
    • 引导加载程序
    • vbmeta
    • ZBI
    • 适用于 BlobFS 的软件包

输出

汇编工具会根据收到的指令生成以下输出:

软件包

  • base
  • update

图片文件

  • blobfs 块设备映像
  • ZBI
  • vbmeta
  • fvm 闪存映像

结果清单

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

  • 所有软件包(包括 baseupdate)的清单
  • 生成的所有图片文件的清单,其中包含:
    • 图片的内容 ID 哈希
    • 映像适用于的架构
    • 对于包含在图片中的所有文件:
    • 自己的内容身份
    • 该文件的来源(文件路径)

输入和架构

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

请参阅:

实现

最终工具将由以下内容构建而成:

  • 允许通过 ffx 使用的 ffx 插件
  • 一个 Rust 库,包含大部分实现和单元测试。
  • 用于在 fuchsia.git build 中正确使用该工具的 GN 模板。
  • 已打包供其使用的现有工具:

为了便于 fuchsia.git 树内 build 的过渡,还将提供以下内容:

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

上述过渡工具不会成为工具的永久接口的一部分,而是用于提供过渡路径,以最大限度地降低 fuchsia.git build 的风险。

试发布计划

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

  • 作为集成测试,如果其输出与现有脚本和工具的输出不匹配,则记录日志
  • 然后该测试就变成了失败的测试
  • 在发布并针对多个 CQ build 进行几天的烘焙后,新工具取代了现有

向后兼容性

将此工具添加到 SDK 不会改变任何现有的向后兼容性问题,因为它是一种使用 SDK 中现有工具的不同方式。与工具搭配使用的内核和驱动程序应与 SDK 工具匹配(或比工具更高版本)的限制仍然存在。

性能

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

该工具的存在使得您无需执行 Fuchsia 本身的完整构建,即可重新组装另一组组件。

安全注意事项

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

隐私注意事项

无隐私问题。

测试

核心库将包含单元测试,其中包括:

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

文档

需要记录此工具的 ffx 接口。