Fuchsia 軟體透過套件,依需求將軟體供應給系統。 這是 Fuchsia 核心設計原則「安全性」和「可更新性」的重要元素。套件可以獨立更新 例如網頁等這可讓安全漏洞修補 一次推送至所有 Fuchsia 產品,不必使用個別產品 協調程序。
套件不是單一封存或圖片檔,而是「二進位檔案」的樹狀結構。 大型物件 (BLOB)。樹的根部是名為「meta.far」的 BLOB哪一個? 包含套件的中繼資料,包括「中繼資料」檔案 包含其他 BLOB 的參照。Fuchsia 套件中的 BLOB 「內容位址」content-addressed,也就是說,系統會使用資產的雜湊值, 內容。metadata.far 本身的內容位址稱為「套件」 雜湊。
Meta.far 包含的 meta/
目錄至少
下列兩個項目:
meta/package
:內含套件識別資訊的 JSON 檔案 例如名稱和版本meta/contents
:套件中使用者可理解的檔案名稱對應 他們的內容位址
如果兩個以上的套件共用相同的內容 (例如程式庫依附元件 或字型資源) 的中繼資料會指向相同的內容位址 該資源這可讓 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
:套件中包含的資源,例如元件 資訊清單。
對於 Fuchsia 裝置上的軟體要求,將由 套件解析器。套件解析器會決定系統是否已 本機快取套件如果沒有,解析器會從存放區擷取 meta.far,並更新必要的內容 BLOB。
儲存套件
在裝置上,套件 BLOB 會儲存在可定址的檔案系統中
針對名稱為 blobfs
且通常可寫入一次的讀取檔案進行最佳化。這樣一來
在所有套件中去除重複的項目
使用雜湊值經過加密驗證。Fuchsia 奔跑 pkg-cache
服務,blobfs
協助您管理套件。
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 頁面,列出套件存放區中目前可用的所有套件。每個 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 開放原始碼專案,並 用於建構及自訂系統的工具: