| RFC-0072:獨立映像檔組裝工具 | |
|---|---|
| 狀態 | 已接受 |
| 區域 |
|
| 說明 | 建立獨立的映像檔組裝工具,Fuchsia 建構作業也能使用。 |
| Gerrit 變更 | |
| 作者 | |
| 審查人員 | |
| 提交日期 (年-月-日) | 2021-01-29 |
| 審查日期 (年-月-日) | 2021-03-05 |
摘要
本文建議使用獨立工具,適用於納入 Fuchsia SDK,從套件和其他編譯構件組裝 Fuchsia「系統映像檔」。
提振精神
產品組裝程序是從 Fuchsia 平台 fuchsia.git 和產品本身及其他存放區的元件和套件,建立一組構件,以便將 Fuchsia 傳送至裝置。這項程序應可完成,不必使用完整的 fuchsia.git 結帳和建構程序。
這項工具會根據先前建構的輸入內容,執行產品組裝程序的最後一個步驟,也就是建立系統構件。
這個工具也會用於 fuchsia.git 建構作業本身,取代 //build/resources/BUILD.gn 中的許多指令碼和 GN 範本。
詞彙解釋
組裝
建立最終系統輸出檔案,可用於將 Fuchsia 傳送至裝置。
base 套裝方案
BlobFS 中的套件 (由內容 ID 識別),其中包含基本系統 (例如 /system)。這稱為目前建構中的system_image套件。pkgfs詳情請參閱這篇文章。
BlobFS
開發板支援資料
這些輸入內容會說明執行組裝程序所需的低階硬體詳細資料 (例如分割區表、快閃區塊大小、要刷入裝置或納入更新套件的裝置開機載入程式映像檔等)。
Content-Addressing
內容定址是根據內容的密碼編譯安全雜湊值來識別事物的方法。在 Fuchsia 上,BlobFS、pkgfs 和系統的其他部分會使用這項功能,以安全的方式識別檔案。
FVM 映像檔
FVM 映像檔是 Fuchsia Volume Manager 的區塊裝置映像檔。
系統映像檔構件
建構作業建立的一組最終輸出構件,其中包含 Fuchsia。這是較大的構件集,用於透過不同方式 (OTA、刷機、鋪路等) 將 Fuchsia 傳送至裝置。
update 套裝方案
包含更新系統的檔案和規則的套件。詳情請參閱這篇文章。
「vbmeta」圖片
裝置上執行的啟動載入程式會使用驗證開機程序中繼資料,驗證 zbi 是否可供啟動載入程式執行。
ZBI
ZBI這是核心和 ramdisk這個檔案包含啟動 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 的套件
輸出
組裝工具會根據指示建立下列輸出內容:
套件
baseupdate
圖片檔
- blobfs 區塊裝置映像檔
- ZBI
- vbmeta
- fvm flash image
結果資訊清單
當工具收到指令,要建立資訊清單中說明的輸出檔案時,就會產生下列資訊清單。
- 所有套件的資訊清單 (包括
base和update) - 所有產生的圖片檔資訊清單,包含:
- 圖片的內容身分雜湊
- 圖片適用的架構
- 針對併入圖片的所有檔案:
- 自有內容 ID
- 該檔案的來源 (檔案路徑)
輸入內容和結構定義
為確保建構工具相容性,輸入內容一開始會是 GN 產生的內容。舉例來說,中繼資料走訪的結果可用來描述所有建構中的套件。
請參閱以下內容:
- /build/package.gni 的第 604 行。
- /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 介面必須記錄在文件中。