Fuchsia 套件

Fuchsia 套件是階層式檔案集合,可為 Fuchsia 系統提供一或多個程式、元件或服務。Fuchsia 套件是指代發布單元的術語,但與許多其他套件系統不同,該單元由部分組成,而非單一二進位檔 BLOB

在啟動時,Fuchsia 系統會顯示部分套件,您也可以從 BLOB 中的 Fuchsia 套件伺服器下載其他套件。Fuchsia 套件伺服器是 HTTP(S) 伺服器。這些 BLOB 由 Merkle 根所定義,BLOB 會根據內容命名,並使用 Fuchsia Merkle Root 演算法。如果兩個 BLOB 的內容相同,則兩者具有相同的名稱。因此,每個 BLOB 都有專屬 ID,並使用此 Merkle 根目錄做為金鑰,寫入至永久性儲存空間。這個程序是為了消除套件之間可能存在的 BLOB 重複問題。舉例來說,存在於多個套件中的共用程式庫只會在裝置上儲存一次。

套件伺服器會驗證每個套件的真實性,因此可做為信任的根源。

套件也可以宣告對命名依附元件的依附元件,建立巢狀套件的階層。建構規則會將套件與每個子套件的建構目標連結。在建構期間,套件建構工具會在父項套件的中繼資料中記錄子套件,並將每個子套件名稱對應至其套件雜湊 (用於識別子套件的 BLOB ID)。這樣可確保子套件的清單和每個子套件的內部內容不會變更,除非同時變更父項的 Merkle (套件雜湊)。

子檔案包啟用:

  • 封裝的依附元件 (套件本質上是「套件樹狀結構」)
  • 隔離的 /pkg 目錄 (分組的元件不需要將檔案、程式庫和中繼資料合併至單一共用命名空間)
  • 確保依附元件解析 (系統和建構工具可確保子套件一律與其套件「一同移動」)

如要進一步瞭解如何使用子套件封裝元件及其依附元件,請參閱「子套件元件」。

套件類型

組成 Fuchsia 作業系統的套件分為三個群組,這會影響套件的管理方式:

基本套件

這些是 Fuchsia 作業系統基礎的一部分,並被視為安全性和系統的關鍵。根據執行中的 Fuchsia 系統解析套件時,系統一律會傳回裝置上的版本,而非套件伺服器可能有的版本。不過,您可以透過OTA 程序更新基本套件。

由於這些套件在系統的執行階段是不可變動的,因此必須使用 fx ota 更新這些套件,才能觸發無線 (OTA) 更新。

快取的套件

這些是裝置上非基礎的套件。這些套件會在裝置刷機或鋪設時存在,因此如果裝置在未連上網路的情況下啟動,這些套件仍可供使用。如果套件伺服器提供其他套件,系統會在解析程序期間更新快取套件。這些套件不會在系統更新期間更新,而是會定期更新。

Fuchsia 也可以在執行中的系統上移除快取的套件,根據執行階段資源需求釋出資源。

Universe 套裝

這些是存在於套件伺服器,但不存在於裝置上的套件。

套件的結構

在大多數情況下,Fuchsia 中的套件是 BLOB 的集合,至少包含一個名為 meta.far 的內容指定 BLOB

在 Fuchsia 中,您可以使用 ffx package build 指令建構套件。

基本上,套件就是零或多個內容位址項目的樹狀結構。套件包含下列項目:

meta.far

套件中繼資料封存檔 meta.far 包含套件中繼資料,以 meta/ 目錄的形式呈現。meta.far 有一個 merkleroot,在實際應用中也稱為套件的 merkleroot。

套件的 meta/ 目錄至少包含兩個檔案:

  • meta/package

    套件身分檔案。這是一個 JSON 檔案,其中包含套件的名稱和版本。

  • meta/contents

    內容檔案。這個檔案是由 ffx package build 指令建立。這個檔案會將套件面向使用者的檔案名稱對應至這些檔案的 Merkle 根目錄。

如果套件宣告子套件,meta/ 目錄還會包含:

  • meta/fuchsia.pkg/subpackages

    子包檔案。這是 JSON 檔案,內含每個已宣告子包的名稱和版本。從父項套件的角度來看,在解析子項套件時,子項套件名稱會用做相對套件網址。

    套件建構工具會逐一檢查子套件參照項目 (透過建構依附元件宣告和套件資訊清單檔案,參照每個子套件的其他套件資訊清單檔案),藉此計算每個子套件的版本 (套件雜湊),並產生 subpackages 檔案。

此外,meta/ 目錄可包含元件資訊清單等檔案。如要進一步瞭解元件資訊清單,請參閱「元件資訊清單」。

BLOB 不在 meta/

套件的大部分檔案都位於 meta/ 目錄之外,且每個檔案都是 BLOB

例如,這些檔案可能如下所示:

  • bin/foo
  • lib/libfdio.so
  • data/mydata.db

辨識套件

Fuchsia 中的每個套件都會以 package-url 做為識別碼。

絕對套件網址

絕對 Fuchsia 套件網址可識別系統可尋址的套件,且不需要任何額外背景資訊,如下所示:

fuchsia-pkg://repository/package-name?hash=package-hash#resource-path

Fuchsia 會根據網址的哪些部分來解讀 fuchsia-pkg 網址:

  • 如果有存放區、套件和資源部分,網址會標示套件中的指定資源。
  • 如果只有存放區和套件部分,則網址會標示所指的套件本身。
  • 如果只有存放區部分,則網址會標示指定的存放區本身。

套件部分可表達不同程度的具體性。至少必須提供套件名稱,並可選擇加上套件雜湊。

如果缺少套件雜湊,套件解析器會從可供用戶端使用的套件變化版本最新修訂版本擷取資源。

相對套件網址

相對 Fuchsia 套件網址會將先前載入的套件 (或子套件) 視為「內容」來識別子套件。存放區和父項套件為隱含,而子項套件名稱則用於在父項套件的 "meta/fuchsia.pkg/subpackages" 檔案中查詢套件雜湊。(無法覆寫套件雜湊)。相對套件網址如下所示:

package-name#resource-path

與絕對套件網址一樣,資源路徑可包含或不包含。