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 套件

這些套件是存在於套件伺服器上,但在裝置上並沒有。

套件結構

在多數情況下,Fussia 中的套件是一個 BLOB 集合,至少包含一個內容位址 BLOB,並命名為 meta.far

在 Fuchsia 中,您可以使用 ffx package build 指令或舊版 pm 工具建構套件,兩者皆位於 Fauchsia IDK 的 //tools/ 目錄中。

基本上,套件是由零或多個內容處理項目的樹狀結構。套件包含以下內容:

meta.far

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

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

  • meta/package

    套件身分檔案。這是包含套件名稱和版本的 JSON 檔案。

  • meta/contents

    內容檔案。這個檔案是由 ffx package build 指令 (或舊版 pm updatepm 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

與絕對套件網址一樣,資源路徑不一定會加入。