RFC-0072:獨立映像檔組合工具 | |
---|---|
狀態 | 已接受 |
區域 |
|
說明 | 建立獨立的映像檔組合工具,Fuchsia 建構作業也能使用這項工具。 |
Gerrit 變更 | |
作者 | |
審查人員 | |
提交日期 (年-月-日) | 2021-01-29 |
審查日期 (年-月-日) | 2021-03-05 |
摘要
本文提出了一個獨立工具,適合納入 Fuchsia SDK,用於從套件和其他編譯的構件組合 Fuchsia「系統映像檔」。
提振精神
產品組合,也就是建立一組構件,以便將 Fuchsia 提供給裝置的程序,這些構件是從 Fuchsia 平台 fuchsia.git 和產品本身,以及其他存放區中的元件和套件中取得。如果不使用完整的 fuchsia.git
檢查和建構,也能完成產品組合。
這項工具會執行產品組合程序的最後一個步驟,也就是根據先前建構的輸入內容建立系統構件。
這個工具也會用於 fuchsia.git
建構作業本身,取代 //build/resources/BUILD.gn
中的許多指令碼和 GN 範本。
詞彙解釋
組裝
建立可用於將 Fuchsia 提供給裝置的最終系統輸出檔案。
base
套件
BlobFS 中的套件,其內容 ID 會識別為 pkgfs
,其中包含基礎系統 (例如 /system
)。這稱為目前版本中的 system_image
套件。詳情請參閱這篇文章。
BlobFS
開發板支援資料
這些是說明執行組合程序所需的低階硬體詳細資料的輸入內容 (例如分割表、快閃區塊大小、裝置引導程序映像檔,用於在裝置上快閃或納入更新套件等)。
Content-Addressing
內容位址是一種方法,可根據內容的加密安全雜湊來識別某項物品。在 Fuchsia 中,BlobFS、pkgfs 和系統的其他部分會使用這項功能,以安全的方式識別檔案。
FVM 映像檔
系統映像檔構件
建構作業產生的最終輸出成果集,其中包含 Fuchsia。這是一組較大的構件,用於透過不同方式 (OTA、閃燈、鋪設等) 將 Fuchsia 提供給裝置
update
套件
包含系統更新檔案和規則的套件。詳情請參閱這篇文章。
vbmeta
圖片
裝置上執行的啟動載入程式會使用驗證開機程序中繼資料,驗證系統啟動載入程式是否信任 zbi 執行。
ZBI
ZBI這是核心和 RAM 磁碟 這個檔案包含啟動 Fuchsia 所需的所有內容。
設計
這項工具主要是複製 //build/resources/BUILD.gn
及其相關指令碼目前執行的步驟和程序。
這項工具是 ffx
外掛程式,可用於 Fuchsia 版本,也能用於其他地方。
輸入
在實際運作上,這項工具會接受以下輸入內容:
一組選項,用於指定應建立哪些圖片檔案:
下圖顯示用於建立各種最終輸出的輸入內容 (和輸出內容):
┌─────────┐┌────────┐┌────────┐┌───────────┐┌─────────────────┐
│ 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 映像檔
- 復原版位的 ZBI (選用)
- 復原區塊的 vmbeta 映像檔 (如果提供復原 zbi)
- 啟動載入器韌體映像檔
如要建立可閃記的區塊裝置映像檔,工具需要:
- 板卡支援資料:
- 分區資料表
- 依此類推
- 並且執行下列任一操作:
update
套件- 或直接提供:
- 系統啟動載入程式
- vbmeta
- ZBI
- BlobFS 適用的套件
輸出
組合工具會根據指示產生下列輸出內容:
套件
base
update
圖片檔
- blobfs 區塊裝置圖片
- ZBI
- vbmeta
- fvm 快閃記憶體映像檔
結果資訊清單
當工具收到指示,要建立資訊清單中所述的輸出檔案時,就會產生下列資訊清單。
- 所有套件的資訊清單 (包括
base
和update
) - 產生的所有圖片檔案資訊清單,包含:
- 圖片的內容 ID 雜湊
- 圖片適用的架構
- 針對整合至圖片中的所有檔案:
- 自己的內容身分
- 該檔案的來源 (檔案路徑)
輸入和結構定義
針對建構工具相容性,輸入內容一開始會是 GN 產生的內容。例如,中繼資料檢查結果可用於描述正在建構的所有套件。
請參閱以下內容:
- 604 行中的 /build/package.gni。
- /build/resources/BUILD.gn,第 221 行。
實作
最終工具的建構方式如下:
- ffx 外掛程式,可透過
ffx
使用。 - 包含大部分實作和單元測試的 Rust 程式庫。
- GN 範本,可在 fuchsia.git 建構中正確使用工具。
- 現有工具,已封裝供使用:
為了讓 fuchsia.git 樹狀結構內建構作業順利過渡,我們還會提供以下項目:
- 這項 CLI 工具會視需要公開特定功能,以便從現有的 GN 範本和指令碼順利轉換至新工具。
- 更新 GN 範本,以包裝該功能。
上述轉換工具不會成為工具的永久介面,而是用於提供轉換路徑,盡可能降低 fuchsia.git 版本的風險。
試營運計畫
為降低風險,我們會謹慎將這項工具整合到 fuchsia.git:
- 做為整合測試,記錄輸出內容是否與現有指令碼和工具不符
- 該測試就會變成失敗的測試
- 在推出並針對多個 CQ 版本進行幾天的烘焙後,新工具會取代現有
回溯相容性
將此工具新增至 SDK 不會影響任何現有的回溯相容性問題,因為這是使用 SDK 中現有工具的不同方式。使用工具時,內核和驅動程式必須與 SDK 工具相符 (或較工具新) 的限制仍維持不變。
成效
使用 CLI 工具對 Fuchsia 版本的速度影響微乎其微。雖然它會將多項作業從 Python 移至 Rust,但也會將自身加入為必須執行的編譯步驟。
有了這項工具,您就能重新組合不同的元件組合,而無須執行 Fuchsia 的完整建構作業。
安全性考量
輸出資訊清單可讓您稽核產生的圖片構件內容和來源。
隱私權注意事項
不會造成隱私權疑慮。
測試
核心程式庫將包含單元測試,涵蓋以下項目:
- 輸入驗證
- 結構定義剖析
- 結構定義產生
- 組合程序運作過程的每個步驟:
- 針對執行的外部工具產生的命令列
- 剖析外部工具的輸出內容
- 正確產生及剖析中繼檔案
說明文件
您需要為這項工具的 ffx
介面撰寫文件。