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 映像檔
FVM 映像檔是 Fuchsia 的區塊裝置映像檔。
系統映像檔構件
由包含 Fusia 的建構作業建立的最終輸出構件組合。這是一組較大的構件,可使用不同方式 (OTA、刷新、貼上等) 將 Fuchsia 提供給裝置。
「update
」套件
包含系統更新檔案和規則的套件。詳情請參閱這篇文章。
vbmeta
圖片
裝置上執行的啟動載入程式會使用驗證開機程序中繼資料,驗證系統啟動載入程式是否信任 zbi 執行。
ZBI
這是核心和 RAM 磁碟 這個檔案包含啟動 Fuchsia 所需的所有內容。
設計
這項工具主要是複製 //build/resources/BUILD.gn
及其相關指令碼目前執行的步驟和程序。
這項工具是一種 ffx
外掛程式,無論是要同時用於遷移環境或外部作業,都能使用。
輸入
在實際運作上,這項工具會接受以下輸入內容:
一組選項,用於指定應建立哪些圖片檔案:
下圖說明使用哪些輸入 (和輸出內容) 建立各種最終輸出內容:
┌─────────┐┌────────┐┌────────┐┌───────────┐┌─────────────────┐
│ 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
) - 產生的所有圖片檔案資訊清單,包含:
- 圖片的內容身分雜湊
- 圖片適用的架構
- 針對整合至圖片中的所有檔案:
- 自己的內容身分
- 該檔案的來源 (檔案路徑)
輸入內容和結構定義
在建構工具的相容性上,輸入內容一開始會是 GN 產生的內容。例如,中繼資料檢查結果可用於描述正在建構的所有套件。
請參閱以下內容:
- 604 行中的 /build/package.gni。
- 221 行中的 /build/resources/BUILD.gn。
實作
最終工具的建構方式如下:
- ffx 外掛程式,可透過
ffx
使用。 - 包含大部分實作和單元測試的 Rust 程式庫。
- 在 fuchsia.git 建構中正確使用工具的 GN 範本。
- 現有工具,並包裝:
為了方便轉換 fuchsia.git 樹狀結構內的建構作業,還會提供以下項目:
- 這是一個可視需要公開特定功能的 CLI 工具,可讓您順利從現有的 GN 範本和指令碼轉換至新工具。
- 更新 GN 範本,以包裝該功能。
上述轉換工具不會成為工具的永久介面,而是用於提供轉換路徑,盡可能降低 fuchsia.git 版本的風險。
試營運計畫
為降低風險,我們會謹慎將這項工具整合到 fuchsia.git:
- 整合測試會記錄輸出內容與現有指令碼和工具的輸出內容
- 該測試就會變成失敗的測試
- 滾動式設計並花幾天時間針對多個 CQ 版本進行烘焙後,新工具將取代現有
回溯相容性
將這項工具新增至 SDK,並不會改變任何現有的回溯相容性問題,因為這是使用 SDK 中現有工具的另一種方式。與工具搭配使用的核心和驅動程式必須與 SDK 工具相符 (或較工具新) 的限制仍維持不變。
成效
使用 CLI 工具對 Fuchsia 版本的速度影響微乎其微。雖然它會將多項作業從 Python 移至 Rust,但也會將自身加入為必須執行的編譯步驟。
有了這項工具,您就能重新組合不同的元件組合,而無須執行 Fuchsia 的完整建構作業。
安全性考量
輸出資訊清單可讓您稽核產生的圖片構件內容和來源。
隱私權注意事項
不會造成隱私權疑慮。
測試
核心程式庫將包含單元測試,涵蓋以下項目:
- 輸入驗證
- 結構定義剖析
- 結構定義產生
- 組合程序作業的各個步驟:
- 針對要執行的外部工具產生的命令列
- 剖析外部工具的輸出內容
- 正確產生及剖析中繼檔案
說明文件
您需要為這項工具的 ffx
介面撰寫文件。