軟體推送

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

套件不是單一封存或圖片檔,而是「二進位檔案」的樹狀結構。 大型物件 (BLOB)。樹的根部是名為「meta.far」的 BLOB哪一個? 包含套件的中繼資料,包括「中繼資料」檔案 包含其他 BLOB 的參照。Fuchsia 套件中的 BLOB 「內容位址」content-addressed,也就是說,系統會使用資產的雜湊值, 內容。metadata.far 本身的內容位址稱為「套件」 雜湊。

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

  • meta/package:內含套件識別資訊的 JSON 檔案 例如名稱和版本
  • meta/contents:套件中使用者可理解的檔案名稱對應 他們的內容位址

這張圖表顯示由「meta.far」組成的 Fuchsia 套件內容
  中繼資料和一組內容 BLOB。

如果兩個以上的套件共用相同的內容 (例如程式庫依附元件 或字型資源) 的中繼資料會指向相同的內容位址 該資源這可讓 Fuchsia 將套件發布程序最佳化,並 不必為了儲存空間 存在。

代管和放送套件

套件託管在存放區中,依據 更新架構 (TUF)。 此架構旨在確保軟體以安全的方式推送 更新。TUF 存放區會透過 記錄可以透過已知的受信任公開與私密金鑰進行驗證。 換言之,所有 HTTP 伺服器皆可提供 TUF 存放區 即可享有傳輸層安全標準 (TLS) 的安全防護,包括開發人員的工作站

存放區中的套件是以 fuchsia-pkg 配置:

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

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

對於 Fuchsia 裝置上的軟體要求,將由 套件解析器。套件解析器會決定系統是否已 本機快取套件如果沒有,解析器會從存放區擷取 meta.far,並更新必要的內容 BLOB。

儲存套件

在裝置上,套件 BLOB 會儲存在可定址的檔案系統中 針對名稱為 blobfs 且通常可寫入一次的讀取檔案進行最佳化。這樣一來 在所有套件中去除重複的項目 使用雜湊值經過加密驗證。Fuchsia 奔跑 pkg-cache 服務,blobfs協助您管理套件。

這張圖表說明如何在「blobfs」上建立套件快取。blobfs 是可用內容位址的檔案系統,可移除重複的 BLOB,讓這些 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 頁面,列出套件存放區中目前可用的所有套件。每個 Pod 的 是可以傳送到裝置的套件。

監控套件載入程序

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