RFC-0072:獨立圖片組合工具

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

BlobFS 是 Fuchsia 的內容位址檔案系統。

開發板支援資料

這些是說明執行組合程序所需的低階硬體詳細資料的輸入內容 (例如分割表、快閃區塊大小、裝置引導程序映像檔,用於在裝置上快閃或納入更新套件等)。

Content-Addressing

內容位址是一種方法,可根據內容的加密安全雜湊來識別某項物品。在 Fuchsia 中,BlobFSpkgfs 和系統的其他部分會使用這項功能,以安全的方式識別檔案。

FVM 映像檔

FVM 映像檔是 Fuchsia 的區塊裝置映像檔。

系統映像檔構件

由包含 Fusia 的建構作業建立的最終輸出構件組合。這是一組較大的構件,可使用不同方式 (OTA、刷新、貼上等) 將 Fuchsia 提供給裝置。

update」套件

包含系統更新檔案和規則的套件。詳情請參閱這篇文章

vbmeta 圖片

裝置上執行的啟動載入程式會使用驗證開機程序中繼資料,驗證系統啟動載入程式是否信任 zbi 執行。

ZBI

這是核心和 RAM 磁碟 這個檔案包含啟動 Fuchsia 所需的所有內容。

設計

這項工具主要是複製 //build/resources/BUILD.gn 及其相關指令碼目前執行的步驟和程序。

這項工具是一種 ffx 外掛程式,無論是要同時用於遷移環境或外部作業,都能使用。

輸入

在實際運作上,這項工具會接受以下輸入內容:

一組選項,用於指定應建立哪些圖片檔案:

  • base 套件
  • ZBI
  • vbmeta 映像檔
  • update 套件
  • Flash 圖片:
    • BlobFS 區塊裝置圖片
    • FVM 區塊裝置映像檔
  • 最終圖片資訊清單

下圖說明使用哪些輸入 (和輸出內容) 建立各種最終輸出內容:

┌─────────┐┌────────┐┌────────┐┌───────────┐┌─────────────────┐
│  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,工具需要:

  • 要加進啟動檔案系統的檔案清單 (可存取這些檔案)
  • base 套件的「內容 ID
  • 要放置在 ZBI 中的 Zircon 核心映像檔
  • 要傳遞至 Zircon 核心的指令列引數

如要建立 vbmeta 映像檔,工具需要:

  • ZBI

如要建立更新套件,工具需要:

  • 納入 base 的套件清單
  • base 套件
  • ZBI
  • vbmeta 映像檔
  • 復原版位的 ZBI (選用)
  • 復原運算單元的 VMbeta 映像檔 (如已提供復原 zbi)
  • 啟動載入器韌體映像檔

如要建立可刷新的區塊裝置映像檔,此工具需要:

  • 板卡支援資料:
    • 分區資料表
    • 依此類推
  • 並且執行下列任一操作:
    • update 套件
    • 或直接提供:
    • 系統啟動載入程式
    • Vbmeta
    • ZBI
    • BlobFS 套件

輸出

組合工具會根據系統指示建立的內容,產生下列輸出內容:

套件

  • base
  • update

圖片檔

  • blobfs 區塊裝置圖片
  • ZBI
  • vbmeta
  • fvm 快閃記憶體映像檔

結果資訊清單

當工具收到指示,要建立資訊清單中所述的輸出檔案時,就會產生下列資訊清單。

  • 所有套件的資訊清單 (包括 baseupdate)
  • 產生的所有圖片檔案資訊清單,包含:
    • 圖片的內容身分雜湊
    • 圖片適用的架構
    • 針對整合至圖片中的所有檔案:
    • 自己的內容身分
    • 該檔案的來源 (檔案路徑)

輸入內容和結構定義

在建構工具的相容性上,輸入內容一開始會是 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 介面撰寫文件。