Fuchsia 軟體會透過套件,以隨選的方式傳送至系統。這是 Fuchsia 核心設計原則「安全性」和「可更新性」的重要元件。套件可獨立更新,並視需求提供,就像網頁一樣。這樣一來,您就能將安全漏洞修補程一次推送至所有 Fuchsia 產品,而無需個別產品協調。
套件不是單一封存檔或映像檔,而是二進位大型物件 (BLOB) 的樹狀結構。樹狀結構的根節點是名為「meta.far」的 BLOB,其中包含套件的中繼資料,包括「meta/contents」檔案,其中包含對其他 BLOB 的參照。Fuchsia 套件中的 BLOB 是內容位址,也就是說,這些 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 裝置上的軟體要求。套件解析器會判斷系統是否已在本機快取套件。如果沒有,解析器會從存放區擷取 meta.far,並更新必要的內容 BLOB。
儲存套件
在裝置上,套件 BLOB 會儲存在內容可尋址的檔案系統中,該系統經過最佳化,可用於一次寫入、經常讀取的檔案,稱為 blobfs
。這樣一來,系統就能在所有套件中去除重複項目,並使用雜湊碼進行加密驗證。Fuchsia 會在 blobfs
上執行 pkg-cache
服務,以利套件管理。
pkg-cache
層會追蹤系統中目前處於活動狀態的套件。Fuchsia 不會明確安裝或移除套件。軟體會隨選提供,同樣地,系統也會透過定期垃圾收集功能,從不再活躍的套件中收回空間。當 pkg-cache
觸發垃圾收集作業來回收空間時,系統會刪除未受任何有效套件參照的內容 BLOB。
練習:套件
在本程式碼研究室中,您可能已經體驗過裝置的軟體隨選供應服務,但您可能並不知道!在本練習中,您將揭開神秘面紗,詳細瞭解套件如何在 Fuchsia 裝置上提交及儲存。
重新啟動模擬器
執行下列指令,關閉目前開啟的所有模擬器例項:
ffx emu stop --all
啟動新的模擬器執行個體:
ffx emu start --headless
啟動完成後,模擬器會輸出以下訊息並傳回:
Logging to "$HOME/.local/share/Fuchsia/ffx/emu/instances/fuchsia-emulator/emulator.log" Waiting for Fuchsia to start (up to 60 seconds)........ Emulator is ready.
啟動本機套件伺服器
執行下列指令,啟動套件伺服器,並讓模擬器載入軟體套件:
fx serve
這個指令會輸出類似以下的內容,表示伺服器正在執行,且已成功將模擬器登錄為目標裝置:
[serve] Discovery...
[serve] Device up
[serve] Registering devhost as update source
[serve] Ready to push packages!
[serve] Target uptime: 139
[pm auto] adding client: [fe80::5888:cea3:7557:7384%qemu]:46126
[pm auto] client count: 1
檢查套件伺服器
fx serve
指令會執行本機套件伺服器,用於將套件傳送至目標裝置。根據預設,這部伺服器會在通訊埠 8083 上執行。
開啟瀏覽器前往 http://localhost:8083
。這會載入 HTML 頁面,列出套件存放區中目前可用的所有套件。每個包裝都會傳送至裝置。
監控套件載入作業
Fuchsia 裝置會視需要解析及載入套件。請參閱 spinning-square
範例套件的實際運作情形。
您可以透過裝置殼層提示,確認裝置上目前是否有已知套件:
fx shell pkgctl pkg-status fuchsia-pkg://fuchsia.com/spinning-square-rs
Package in registered TUF repo: yes (merkle=ef65e2ed...)
Package on disk: no
開啟新的終端機,並開始串流 pkg-resolver
的裝置記錄:
ffx log --filter pkg-resolver
這會顯示從套件伺服器載入套件的所有例項。
在裝置殼層提示中,嘗試解析套件:
fx shell 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
在裝置殼層提示中,再次檢查裝置上的套件狀態:
fx shell 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
的套件雜湊:
fx shell pkgctl get-hash fuchsia-pkg://fuchsia.com/spinning-square-rs
指令會傳回不重複的套件雜湊:
ef65e2ed...
將完整套件雜湊提供給 pkgctl open
指令,即可查看套件內容:
fx shell 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 開放原始碼專案,以及用於建構及自訂系統的工具: