軟體推送

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

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

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

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

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

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

代管和放送套件

套件託管在存放區中,依據 更新架構 (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 裝置上的軟體要求。套件解析器會判斷系統是否已在本機快取套件。如果沒有,解析器會從存放區擷取 meta.far,並更新必要的內容 BLOB。

儲存套件

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

說明如何以「blobfs」為基礎建構套件快取的圖表- a
 去除重複 BLOB 的內容定址檔案系統
 與其他套件共用

pkg-cache 層會追蹤系統中目前有哪些套件 有效。Fchsia 未明確安裝或移除套件。 軟體採隨選提供,並使用相同空間收回 透過定期垃圾收集功能失效的套件。 當 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 |
+--------------------------+------+-----------------------------------------------+

系統會在執行 minimal-packages 存放區時, ffx product-bundle get 指令 (先前位於「開始使用 Fuchsia SDK」中) 快速入門指南)。這個存放區包含 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 元件