幾乎所有 Fuchsia 系統上的內容都是 Fuchsia 套件。無論是立即呈現或呈現在 Fuuchsia 看到的任何內容,都可以在同一個套件裡。本文件說明套件驅動工作流程的基本概念,用於建構套件,並將套件推送至可透過開發主機 IP 連上的 Fuuchsia 裝置。
事前準備和總覽
主機和目標必須可以透過 IP 進行通訊。特別是,必須能夠從開發主機透過 SSH 連線至目標裝置,且目標裝置必須可透過 TCP 連線至通訊埠 8083 上的開發主機。SSH 連線可用於向目標裝置發出指令。
開發主機會執行簡單的靜態檔案 HTTP 伺服器,向目標提供更新內容。此 HTTP 伺服器是 Fuchsia 原始碼的一部分,會自動建構。
目標會指示透過一組手動執行的指令,尋找開發主機上的變更。當目標上的更新系統偵測到這些變更時,會從在主機上執行的 HTTP 伺服器擷取新軟體。新軟體將可供使用,直到目標重新啟動為止。
建築
如要建構包含必要程式碼的套件,系統會使用套件類型建構規則。如需為目標套件建立其中之一,請參閱此參考資料頁面。
一旦有適當的建構規則可以使用,就可以執行 fx build
重新產生。
檢查套件
Fuchsia 隨附用於處理套件封存的工具 far
。Fuchsia 建構完成後,far
程式就能用來建立、列出、傾印或擷取套件封存檔:
$ fx host-tool far
...
Usage: far <command> ...
where <command> is create, list, cat, extract, or extract-file.
例如,如要列出套件的內容,請注意其 meta.far
包含 meta/contents
:
$ fx host-tool far list --archive=out/default/obj/third_party/sbase/sed/meta.far
meta/contents
meta/fuchsia.abi/abi-revision
meta/package
meta/contents
檔案會將使用者看到的套件檔案名稱對應至這些檔案的 Merkle 根目錄,以便查看檔案屬於哪個檔案:
$ fx host-tool far cat --archive=out/default/obj/third_party/sbase/sed/meta.far --file=meta/contents
bin/sed=6a07c6a584dadc9700ad6904ad920704592f706b4b8f55ec6fc736391588a1ef
lib/ld.so.1=2debd7e1b8542e3a9004794a4417a55d27c928030277364e597cc3e6f80f5407
lib/libasync-default.so=55482d52d72b63a0f51d20991ea49fa939b2559d4a7002606bc9e50e42af64e4
lib/libbackend_fuchsia_globals.so=8da42bd2ad7fc246a6ecba016753fa4e9b0b7f6c685e22da4de997888fd18b06
lib/libc++.so.2=e4145c4b3fd40b6d5371a5f21b46fb965d7c82d4b8bb438c9e94254ea58d8cba
lib/libc++abi.so.1=1b5b77954855602b64b877c37defc450d8741d4bb95bd60427cbf234561090e2
lib/libfdio.so=1e47faf9e335206ca73a253dece42a5d537912fc6abceadd0a06ea1462aa8e33
lib/libunwind.so.1=dffab54d807a4352e088529a7a2112b651042bf511e7df7d2adca40aaec77c86
正在連結主機和目標
Fuchsia 來源包含提供靜態檔案的簡易 HTTP 伺服器。建構作業會產生並提供 TUF 檔案樹狀結構。
目標上的更新代理程式一開始不會知道該到何處尋找更新。如要將目標上的代理程式連線至在開發主機上執行的 HTTP 伺服器,必須得知開發主機的 IP 位址。主機 HTTP 伺服器已啟動,並透過呼叫 fx
serve -v
來設定更新代理程式。fx serve
會執行更新伺服器,經常是採用的技術。建議您使用 -v
,因為這個指令會輸出更多輸出內容,以協助偵錯。如果主機成功連線至目標,您就會在主機的殼層中看到 Ready to push packages!
訊息。
目標的更新代理程式會保持設定狀態,直到等待或永久資料遺失為止。當目標重新啟動時,主機會嘗試重新設定更新代理程式。
觸發套件更新
未「安裝」 Fuchsia 中的套件,可視需要快取。Fuchsia 系統上有兩個套件:
base。
base
套件集是一組軟體關鍵,足以讓適當的系統功能保持一致。如果透過--with-base
旗標將套件提供給fx set
,Fuschsia 建構系統會指派套件給base
。這組軟體只能透過執行整個系統更新 (通常稱為 OTA) 來更新,如下所述。這會透過fx ota
更新。cache
或universe
套件集包含的暫時軟體套件是臨時軟體,可隨選更新。如果透過--with
旗標將套件提供給fx set
,Fuschsia 建構系統會指派套件給universe
。每次解析套件網址時,都會將臨時軟體更新更新為最新的可用版本。
觸發 OTA
有時可能會變更許多套件,或是核心可能會變更,或是系統套件有變更。如要在系統套件中取得核心變更或變更系統套件,則必須採用 OTA 或設定,因為base 套件無法變更系統執行階段。通常,OTA 更新的速度比貼上或刷新裝置快。
fx ota
指令會要求目標裝置從任何可用的更新來源執行更新。如要透過 OTA 將開發主機上的版本更新至相同 LAN 上的目標,請先建構所需系統。如果 fx serve [-v]
尚未執行,請啟動,讓目標可使用開發主機做為更新來源。-v
選項會顯示目標從主機要求的檔案相關詳細資訊。如果使用了 -v
標記,當目標擷取所有新檔案時,輸出內容上應會顯示波動。更新完成後,裝置將重新啟動。
只需指令
fx serve -v
(同時針對 build-push 和 ota 執行更新伺服器)fx test <component-url>
(用於建構及執行測試)fx ota
(觸發完整的系統更新並重新啟動)
問題和注意事項
你可以使用磁碟填滿磁碟
推送的每項更新都會儲存在內容處理檔案系統的 blobf 中。重新啟動更新套件後,可能會無法使用,因為在 blobf 中找出這些套件的索引只會儲存在 RAM 中。系統目前不會進行垃圾收集:無人存取或已停止使用的套件 (使用垃圾收集機制是近期推出的創新功能!),但最終終究將結束。
fx gc
指令會重新啟動目標裝置,然後清除裝置中的所有舊的暫時軟體,釋出空間。
重新啟動而不重新啟動
如果更新的套件託管由 Fuchsia 代管的服務,則服務可能需要重新啟動。您無法重新啟動,因為速度很慢,且套件會還原到裝置上設定的版本。一般而言,使用者可以要求元件終止終止,或使用 ffx component stop <component-moniker>
強制停止元件,藉此終止系統上的一或多個執行中的元件。當重新連線至元件服務,或透過 ffx component start
或 fx test
叫用時,系統會在啟動前快取套件伺服器中可用的新版本。
紫紅色樹外的包裝程式碼
您可以封裝及推送位於 Fuchsia 樹狀結構外的程式碼,但需要更多作業。Fuchsia 套件格式非常簡單。其中包含說明套件內容的中繼資料檔案,詳情請參閱 Fuchsia 套件說明文件。中繼資料檔案會新增至 TUF 檔案樹狀結構,且每個內容都會以其 Merkle 根雜湊命名,並存放在 TUF 檔案樹狀結構的根目錄中,稱為「blobs」。