軟體推送

Fuchsia 軟體是「隨選」,透過「套件」將軟體提供給系統。這是 Fuchsia 在安全性可更新性核心設計原則的重要元件。套件可以獨立更新,並按需求提供,例如網頁。這可讓安全漏洞修補程式一次推送至所有 Fuchsia 產品,而不必協調個別產品。

套件並非單一封存或圖片檔,而是二進位大型物件 (BLOB) 的樹狀結構。樹狀結構的根目錄是稱為「meta.far」的 BLOB,其中包含套件的中繼資料,其中包括「meta/contents」檔案,其中包含對 BLOB 其餘部分的參照。Fuchsia 套件中的 BLOB 為「內容定址」,意指使用內容雜湊值進行參照。Meta.far 本身的內容位址稱為「套件雜湊」

Meta.far 包含的 meta/ 目錄至少包含下列兩個項目:

  • meta/package:包含套件識別資訊 (例如名稱和版本) 的 JSON 檔案。
  • meta/contents:使用者可以理解套件中的檔案名稱對應其內容地址。

這張圖表顯示包含「meta.far」中繼資料及一系列 BLOB 內容的 Fuchsia 套件內容。

如果兩個以上的套件共用相同內容 (例如程式庫依附元件或字型資源),這些套件的中繼資料會指向該資源的相同內容位址。這讓 Fuchsia 不需要擷取和儲存既有的內容 BLOB,進而最佳化套件發布和儲存空間。

託管與提供套件

套件會託管於以更新架構 (TUF) 為基礎的存放區。這個架構的規格旨在確保軟體更新作業安全無虞。TUF 存放區會透過附加在記錄中,可驗證已知公開與私密金鑰的記錄中繼資料,來保護更新。也就是說,任何 HTTP 伺服器都能提供 TUF 存放區,無需傳輸層級安全性,包括開發人員的工作站

系統會透過採用 fuchsia-pkg 配置的網址來識別存放區中的套件:

fuchsia-pkg://repo-hostname/pkg-name#resource-path
  • repo-hostname:受信任套件存放區的主機名稱,例如 fuchsia.com
  • pkg-name:這個存放區中套件的專屬 ID。
  • resource-path:套件內含的資源,例如元件資訊清單。

這張圖表顯示如何從 TUF 存放區解析套件,並從裝置本機快取快取。

Fuchsia 裝置上的軟體要求會由套件解析器處理。套件解析器會判斷系統是否已在本機快取套件。如果沒有,解析器會從存放區擷取中繼.far,並更新必要的內容 BLOB。

儲存套件

在裝置上,套件 BLOB 會儲存在可定址內容的檔案系統中,針對通常寫入一次的讀取作業 (稱為 blobfs) 檔案進行最佳化。如此一來,所有套件都能刪除重複版本,並使用雜湊值加密編譯驗證。Fuchsia 在 blobfs 之上執行 pkg-cache 服務以協助管理套件。

說明套件快取是以「blobfs」為基礎建構的圖表。blobfs 是可定址的內容檔案系統,可去除重複的 BLOB,以便在套件之間共用。

pkg-cache 層會追蹤系統中的哪些套件目前為使用中。Fuchsia 未明確安裝或移除套件。軟體會按照需求提供,並且也可透過定期垃圾收集程序,從已經不再使用的套件收回空間。當 pkg-cache 觸發垃圾收集以取回空間時,任何使用中套件未參照的內容 BLOB 會遭到刪除。

運動:包裹

到目前為止,在本程式碼研究室中,您一直都是在裝置端採用隨選軟體推送服務,甚至可能不知道!在本練習中,您將剝離機殼,並查看套件如何遞送和儲存在 Fuchsia 裝置上的詳細資訊。

啟動模擬器

如果您尚未擁有執行中的執行個體,請透過網路支援啟動 FEMU:

ffx emu start workstation_eng.x64 --headless

檢查系統套件

列出在套件伺服器中設定的套件存放區:

ffx repository list

這個指令會輸出類似以下的輸出內容:

+--------------------------+------+-----------------------------------------------+
| NAME                     | TYPE | EXTRA                                         |
+==========================+======+===============================================+
| minimal-packages     | pm   | /home/alice/.local/share/Fuchsia/.../packages |
+--------------------------+------+-----------------------------------------------+

當您執行 ffx product-bundle get 指令 (先前請參閱「開始使用 Fuchsia SDK」快速入門指南) 時,系統會建立 minimal-packages 存放區。這個存放區包含 minimal-x64 預建映像檔的其他系統套件。

執行本機套件伺服器時,您可以瀏覽存放區中的可用套件清單:

ffx repository package list -r minimal-packages

這個指令會列印存放區中每個套件的其他詳細資料,包括個別元件。

監控套件載入中

讓 Fuchsia 裝置按需求解析包裹並載入。請查看使用 spinning-square 範例套件的實際應用情形。

您可以在裝置殼層提示中,確認裝置目前是否有已知的套件:

ffx target ssh pkgctl pkg-status fuchsia-pkg://fuchsia.com/spinning-square-rs
Package in registered TUF repo: yes (merkle=ef65e2ed...)
Package on disk: no
ffx target ssh ERROR: Error running ssh: exit status 2

開啟新終端機,然後開始串流 pkg-resolver 的裝置記錄:

ffx log --filter pkg-resolver

這會顯示從套件伺服器載入套件的所有執行個體。

在裝置殼層提示中,嘗試解析套件:

ffx target ssh pkgctl resolve fuchsia-pkg://fuchsia.com/spinning-square-rs

請注意,pkg-resolver 的記錄輸出中會加入新的行:

[pkg-resolver] INFO: attempting to resolve fuchsia-pkg://fuchsia.com/spinning-square-rs as fuchsia-pkg://default/spinning-square-rs with TUF
[pkg-resolver] INFO: resolved fuchsia-pkg://fuchsia.com/spinning-square-rs as fuchsia-pkg://default/spinning-square-rs to 21967ecc643257800b8ca14420c7f023c1ede7a76068da5faedf328f9d9d3649 with TUF

在裝置殼層提示中,再次檢查套件狀態:

ffx target ssh pkgctl pkg-status fuchsia-pkg://fuchsia.com/spinning-square-rs
Package in registered TUF repo: yes (merkle=21967ecc...)
Package on disk: yes

Fuchsia 解決了套件,並視需要從本機 TUF 存放區載入!

探索套件中繼資料

現在 spinning-square 套件已成功解析,因此您可以瀏覽套件內容。問題解決後,系統會在目標裝置上使用內容位址參照套件。

在裝置殼層提示中,使用 pkgctl get-hash 指令決定 spinning-square 的套件雜湊:

ffx target ssh pkgctl get-hash fuchsia-pkg://fuchsia.com/spinning-square-rs
ef65e2ed...

pkgctl open 指令提供完整套件雜湊,即可查看套件內容:

ffx target ssh pkgctl open ef65e2ed...
opening ef65e2ed...
package contents:
/bin/spinning_square
/lib/VkLayer_khronos_validation.so
/lib/ld.so.1
/lib/libasync-default.so
/lib/libbackend_fuchsia_globals.so
/lib/libc++.so.2
/lib/libc++abi.so.1
/lib/libfdio.so
/lib/librust-trace-provider.so
/lib/libstd-e3c06c8874beb723.so
/lib/libsyslog.so
/lib/libtrace-engine.so
/lib/libunwind.so.1
/lib/libvulkan.so
/meta/contents
/meta/package
/meta/spinning-square-rs.cm
/data/fonts/RobotoSlab-Regular.ttf
/meta/fuchsia.abi/abi-revision
/data/vulkan/explicit_layer.d/VkLayer_khronos_validation.json

這會列出套件的中繼資料以及套件中的每個內容 BLOB。您可以查看執行檔的 bin/ 項目、共用程式庫依附元件的 lib/ 項目、其他中繼資料和資源。

接下來呢?

恭喜!現在,您已充分瞭解 Fuchsia 的獨特之處,以及推動這個新平台設計的目標。

在下一個單元中,您將進一步瞭解如何建構 Fuchsia 的基本軟體單位:

Fuchsia 元件