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

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

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

開發板支援資料

這些輸入內容會說明執行組裝程序所需的低階硬體詳細資料 (例如分割區表、快閃區塊大小、要刷入裝置或納入更新套件的裝置開機載入程式映像檔等)。

Content-Addressing

內容定址是根據內容的密碼編譯安全雜湊值來識別事物的方法。在 Fuchsia 上,BlobFSpkgfs 和系統的其他部分會使用這項功能,以安全的方式識別檔案。

FVM 映像檔

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

系統映像檔構件

建構作業建立的一組最終輸出構件,其中包含 Fuchsia。這是較大的構件集,用於透過不同方式 (OTA、刷機、鋪路等) 將 Fuchsia 傳送至裝置。

update 套裝方案

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

vbmeta」圖片

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

ZBI

ZBI這是核心和 ramdisk這個檔案包含啟動 Fuchsia 所需的一切。

設計

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

這項工具是 ffx 外掛程式,因此可做為 Fuchsia 建構作業的一部分,也能在建構作業以外使用。

輸入

在運作方面,這項工具會將下列項目做為輸入內容:

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

  • base 套件
  • ZBI
  • vbmeta 映像檔
  • update 套件
  • 閃爍圖片:
    • 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 套件的「內容識別資訊
  • 要放在 ZBI 中的 Zircon 核心映像檔
  • 要傳遞至 Zircon 核心的指令列引數

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

  • ZBI

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

  • base 內建的套件清單
  • base 套件
  • ZBI
  • vbmeta 映像檔
  • 復原插槽的 ZBI (選用)
  • 復原插槽的 vmbeta 映像檔 (如果提供復原 zbi)
  • 系統啟動載入程式韌體映像檔

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

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

輸出

組裝工具會根據指示建立下列輸出內容:

套件

  • base
  • update

圖片檔

  • blobfs 區塊裝置映像檔
  • ZBI
  • vbmeta
  • fvm flash image

結果資訊清單

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

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

輸入內容和結構定義

為確保建構工具相容性,輸入內容一開始會是 GN 產生的內容。舉例來說,中繼資料走訪的結果可用來描述所有建構中的套件。

請參閱以下內容:

實作

最終工具會由下列項目建構而成:

  • 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 介面必須記錄在文件中。