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/resources/BUILD.gn 中的许多脚本和 GN 模板。

术语库

Assembly

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

base 软件包

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

BlobFS

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

板级支持数据

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

内容寻址

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

FVM 映像

FVM 映像是 Fuchsia 卷管理器的块设备映像。

系统映像制品

由包含 Fuchsia 的 build 创建的一组最终输出制品。这是一组较大的制品,用于通过各种方式(OTA、刷写、铺设等)将 Fuchsia 交付给设备

update 软件包

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

vbmeta》图片

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

ZBI

ZBI这是内核和 ramdisk bootfs <0此文件包含引导 Fuchsia 所需的一切内容。

设计

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

该工具是一个 ffx 插件,因此既可以作为 Fuchsia build 的一部分使用,也可以在 Fuchsia 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 映像
  • 恢复 slot 的 ZBI(可选)
  • 恢复 slot 的 vmbeta 映像(如果提供了恢复 zbi)
  • 引导加载程序固件映像

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

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

输出

汇编工具会生成以下输出,具体取决于它被指示创建哪些输出:

软件包

  • base
  • update

图片文件

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

结果清单

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

  • 所有软件包(包括 baseupdate)的清单
  • 生成的所有图片文件的清单,包含:
    • 相应图片的 content-identity 哈希
    • 映像所面向的架构
    • 对于纳入映像中的所有文件:
    • 他们自己的内容身份
    • 相应文件的来源(文件路径)

输入和架构

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

请参阅:

实现

最终的工具将由以下部分构成:

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

为了方便 fuchsia.git 树内 build 的过渡,还将有:

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

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

小范围发布计划

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

  • 作为一种集成测试,如果其输出与现有脚本和工具的输出不匹配,则会记录日志
  • 然后,该测试会变为失败的测试
  • 在针对众多 CQ build 进行滚动和几天烘烤后,新工具取代了现有工具

向后兼容性

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

性能

使用 CLI 工具对 Fuchsia build 的速度影响不大。虽然它将许多操作从 Python 移到了 Rust,但它也添加了必须执行的编译步骤。

借助该工具,您可以重新组装一组不同的组件,而无需对 Fuchsia 本身执行完整 build。

安全注意事项

输出清单可用于审核所生成的映像制品的内容和来源。

隐私注意事项

没有隐私方面的顾虑。

测试

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

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

文档

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