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 目錄 (分組的元件不需要將檔案、程式庫和中繼資料合併至單一共用命名空間)
  • 安全依附元件解析 (系統與建構工具可確保子套件) 一律使用「Travel with」的包裹)

如要進一步瞭解如何使用 子套件請參閱子套件元件一節。

套件類型

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

基本套件

這些是 Fuchsia 基礎的套裝方案 而且對於安全性和系統而言至關重要。 解決 Fuchsia 系統一直運作中的套件 會傳回裝置上的版本,而不是 可能存在於套件伺服器上不過,基礎套件可在 OTA 程序

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

快取套件

這些是裝置上非基礎套件的套件。這些 套件會在裝置刷新或鋪面時存在,因此這些套件 適用於裝置在沒有網路連線的情況下啟動的情形。快取套件 如果有其他套件可用,問題解決程序就會更新 。這些套件不會在系統更新期間更新,而是會定期更新。

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

宇宙套件

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

套件的結構

在大多數情況下,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/ 目錄可以包含元件資訊清單等檔案。 如要進一步瞭解元件資訊清單,請參見 元件資訊清單

meta/ 以外的 BLOB

套件的大部分檔案都位於 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 套件網址可識別先前載入的子套件 套件 (或子套件) 做為「context」。存放區和父項套件為隱含,子項套件名稱則用於在父項套件的 "meta/fuchsia.pkg/subpackages" 檔案中查詢套件雜湊。(套件雜湊 無法覆寫)。相對套件網址如下所示:

package-name#resource-path

和絕對套件網址一樣,資源路徑不一定包含。