軟體推送

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 裝置上的詳細資訊。

重新啟動模擬器

  1. 執行下列指令,關閉目前開啟的所有模擬器執行個體:

    ffx emu stop --all
    
  2. 啟動新的模擬器執行個體:

    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 開放原始碼專案,以及用於建構和自訂系統的工具:

打造 Fuchsia