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 快閃映像檔

結果資訊清單

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

  • 所有套件 (包括 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 介面必須記錄在文件中。