RFC-0072:独立图片汇编工具 | |
---|---|
状态 | 已接受 |
领域 |
|
说明 | 创建一个独立的映像组合工具,该工具也可供 Fuchsia build 使用。 |
Gerrit 更改 | |
作者 | |
审核人 | |
提交日期(年-月-日) | 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
板级支持数据
这些输入描述执行组装过程所需的低级硬件详细信息(例如分区表、闪存块大小、用于刷写到设备上或添加到更新软件包的设备引导加载程序映像等)。
内容寻址
内容寻址是一种根据内容内容的加密安全哈希来识别内容的方法。在 Fuchsia 上,BlobFS、pkgfs 以及系统的其他部分使用此参数以安全的方式标识文件。
FVM 图片
系统映像工件
由包含 Fuchsia 的 build 创建的一组最终输出工件。这是用于通过不同方式(OTA、刷写、铺路等)将 Fuchsia 交付到设备的更多工件。
update
包
该软件包包含用于更新系统的文件和规则。如需了解详情,请参阅此处。
“vbmeta
”图片
设备上运行的引导加载程序使用启动时验证元数据来验证 zbi 是否可信,可由引导加载程序执行。
ZBI
此文件包含引导 Fuchsia 所需的所有内容。
设计
该工具主要是当前由 //build/resources/BUILD.gn
及其关联脚本执行的步骤和流程的复制。
该工具是一个 ffx
插件,它既可用作紫红 build 的一部分,也可用作外部 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
软件包,该工具需要:
- 要合并到系统的软件包文件列表(“基本”和“缓存”软件包集中的软件包)
要创建 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 映像
结果清单
当系统指示该工具创建清单中描述的输出文件时,会生成以下清单。
- 所有软件包(包括
base
和update
)的清单 - 生成的所有图片文件的清单,其中包含:
- 图片的内容身份哈希
- 图片所针对的架构
- 对于图片中包含的所有文件:
- 他们自己的内容身份
- 文件的来源(文件路径)
输入和架构
为实现构建工具兼容性,输入最初是由 GN 生成的。例如,用于描述正在构建的所有软件包的元数据遍历的结果。
请参阅:
- /build/package.gni 的第 604 行。
- /build/resources/BUILD.gn 第 221 行:
实现
最终工具将基于以下因素构建:
- 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
接口进行记录。