Fuchsia 軟體是「隨選」,透過「套件」將軟體提供給系統。這是 Fuchsia 在安全性和可更新性核心設計原則的重要元件。套件可以獨立更新,並按需求提供,例如網頁。這可讓安全漏洞修補程式一次推送至所有 Fuchsia 產品,而不必協調個別產品。
套件並非單一封存或圖片檔,而是二進位大型物件 (BLOB) 的樹狀結構。樹狀結構的根目錄是稱為「meta.far」的 BLOB,其中包含套件的中繼資料,其中包括「meta/contents」檔案,其中包含對 BLOB 其餘部分的參照。Fuchsia 套件中的 BLOB 為「內容定址」,意指使用內容雜湊值進行參照。Meta.far 本身的內容位址稱為「套件雜湊」。
Meta.far 包含的 meta/
目錄至少包含下列兩個項目:
meta/package
:包含套件識別資訊 (例如名稱和版本) 的 JSON 檔案。meta/contents
:使用者可以理解套件中的檔案名稱對應其內容地址。
如果兩個以上的套件共用相同內容 (例如程式庫依附元件或字型資源),這些套件的中繼資料會指向該資源的相同內容位址。這讓 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
:套件內含的資源,例如元件資訊清單。
Fuchsia 裝置上的軟體要求會由套件解析器處理。套件解析器會判斷系統是否已在本機快取套件。如果沒有,解析器會從存放區擷取中繼.far,並更新必要的內容 BLOB。
儲存套件
在裝置上,套件 BLOB 會儲存在可定址內容的檔案系統中,針對通常寫入一次的讀取作業 (稱為 blobfs
) 檔案進行最佳化。如此一來,所有套件都能刪除重複版本,並使用雜湊值加密編譯驗證。Fuchsia 在 blobfs
之上執行 pkg-cache
服務以協助管理套件。
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 的基本軟體單位: