| 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
板级支持数据
这些输入描述了执行组装流程所需的低级硬件详细信息(例如分区表、闪存块大小、用于刷入设备或包含在更新软件包中的设备引导加载程序映像等)。
内容寻址
内容寻址是一种根据事物内容的加密安全哈希来识别事物的方式。在 Fuchsia 上,BlobFS、pkgfs 和系统的其他部分会使用此功能以安全的方式识别文件。
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 之外使用。
输入
在操作方面,该工具接受以下输入:
一组用于指定应创建哪些映像文件的选项:
以下图表显示了哪些输入(和输出)用于创建各种最终输出:
┌─────────┐┌────────┐┌────────┐┌───────────┐┌─────────────────┐
│ 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,该工具需要:
如需创建 vbmeta 映像,该工具需要:
- ZBI
如需创建更新软件包,该工具需要:
- 纳入
base的软件包列表 base软件包- ZBI
- vbmeta 映像
- 恢复 slot 的 ZBI(可选)
- 恢复 slot 的 vmbeta 映像(如果提供了恢复 zbi)
- 引导加载程序固件映像
如需创建可刷写的块设备映像,该工具需要:
- 主板支持数据:
- 分区表
- 等等
- 以及以下任一事件:
update软件包- 或直接提供:
- 引导加载程序
- vbmeta
- ZBI
- BlobFS 的软件包
输出
汇编工具会生成以下输出,具体取决于它被指示创建哪些输出:
软件包
baseupdate
图片文件
- blobfs 块设备映像
- ZBI
- vbmeta
- fvm flash 映像
结果清单
当工具被指示创建清单中描述的输出文件时,会生成以下清单。
- 所有软件包(包括
base和update)的清单 - 生成的所有图片文件的清单,包含:
- 相应图片的 content-identity 哈希
- 映像所面向的架构
- 对于纳入映像中的所有文件:
- 他们自己的内容身份
- 相应文件的来源(文件路径)
输入和架构
为了实现 build 工具兼容性,输入最初将是 GN 生成的内容。例如,用于描述正在构建的所有软件包的元数据遍历结果。
请参阅:
- /build/package.gni 的第 604 行。
- /build/resources/BUILD.gn 的第 221 行。
实现
最终的工具将由以下部分构成:
- 一个 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 接口。