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

RFC-0072:獨立映像檔組合工具
狀態已接受
區域
  • 建構
說明

建立獨立的映像檔組合工具,供 Fuchsia 版本使用。

變更
作者
審查人員
提交日期 (年/月)2021-01-29
審查日期 (年/月)2021-03-05

摘要

本文件提議獨立工具,適合納入 Fuchsia SDK 中,以便用來組裝套件和其他已編譯構件的 Fuchsia「系統映像檔」。

提振精神

即使不使用完整的 fuchsia.git 結帳和建構作業,還是可以建立一組構件,以便將 Fuchsia 成果從 Fuchsia 平台 fuchsia.git 和產品本身的和其他存放區中,傳送至裝置。

這項工具會執行產品組合程序的最後一個步驟,也就是根據先前建構的輸入建立系統構件。

這項工具也用於 fuchsia.git 建構本身,取代 //build/resources/BUILD.gn 中的許多指令碼和 GN 範本。

詞彙解釋

組裝

建立最終系統輸出檔案,以便將 Fusia 傳送至裝置。

base」套件

BlobFS 中的套件由 pkgfs 識別,其內容識別包含基礎系統 (例如 /system)。在目前建構中稱為 system_image 套件。詳情請參閱這裡

BlobFS

BlobFS 是 Fuchsia 的「內容定址」檔案系統。

主面板支援資料

這些輸入內容描述了執行組合程序所需的低階硬體詳細資料,例如分區表格、Flash 區塊大小、用於刷新到裝置或包含更新套件的裝置系統啟動載入程式映像檔等。

內容定位

內容定址是一種根據內容經過加密編譯的雜湊值來識別內容的方法。在 Fuchsia 中,BlobFSpkgfs 和系統的其他部分都會使用這個項目,以安全的方式識別檔案。

FVM 映像檔

系統映像檔構件

由包含 Fuchsia 的建構作業建立的最終輸出成果組合。這是透過不同方式 (OTA、刷新、鋪面等) 將 Fuchsia 提供給裝置的大型構件組合。

update」套件

套件包含用於更新系統的檔案和規則。詳情請參閱這裡

vbmeta 張圖片

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

ZBI

這包含 Bootstrap 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 套件,工具需要:

  • 要加進系統的套件檔案清單 (「基本」和「快取」套件集中的套件)

如要建立 ZBI,工具需要:

  • 要整合到啟動檔案系統的檔案清單 (有權存取檔案)
  • base 套件的「內容識別
  • 要放置在 ZBI 中的 Zircon 核心映像檔
  • 傳送至 Zircon 核心的指令列引數

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

  • ZBI

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

  • 納入 base 的套件清單
  • base 套件
  • ZBI
  • vbmeta 圖片
  • 復原運算單元的 ZBI (選用)
  • 復原運算單元的 vmbeta 映像檔 (如果指定了復原 zbi)
  • 系統啟動載入程式韌體映像檔

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

  • 主面板支援資料:
    • 分區表
    • 依此類推
  • 然後執行下列其中一項操作:
    • update 套件
    • 或直接提供:
    • 系統啟動載入程式
    • vbmeta
    • ZBI
    • BlobFS 套件

輸出內容

組裝工具會根據指示建立的項目產生下列輸出內容:

套件

  • base
  • update

圖片檔

  • blobfs 區塊裝置圖片
  • ZBI
  • vbmeta
  • fvm Flash 圖片

結果資訊清單

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

  • 所有套件的資訊清單 (包括 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 版本。

安全性考量

輸出資訊清單可讓您稽核所產生映像檔構件的內容和來源。

隱私權注意事項

沒有隱私權疑慮。

測試

核心程式庫提供單元測試,其中包含:

  • 輸入驗證
  • 結構定義剖析
  • 產生結構定義
  • 組合程序作業的每個步驟:
    • 用於執行 Cloud Shell 中的
    • 剖析外部工具的輸出內容
    • 正確產生及剖析中繼檔案

說明文件

這項工具的 ffx 介面需要記錄。