| 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 中目前已有的现有工具的一种不同方式。内核和驱动程序与工具应匹配 SDK 工具(或比工具更新)的限制仍然存在。
性能
使用 CLI 工具对 Fuchsia build 的速度影响不大。虽然它将许多操作从 Python 移到了 Rust,但它也添加了必须执行的编译步骤。
有了此工具,无需对 Fuchsia 本身进行完整 build,即可重新组装一组不同的组件。
安全注意事项
输出清单可用于审核所生成的映像制品的内容和来源。
隐私注意事项
没有隐私问题。
测试
核心库将包含涵盖以下方面的单元测试:
- 输入验证
- 架构解析
- 架构生成
- 组装流程中每个步骤的操作:
- 针对运行的外部工具生成的命令行
- 解析外部工具的输出
- 正确生成和解析中间文件
文档
需要记录此工具的 ffx 接口。