使用 Fuchsia 套件進行開發

幾乎所有 Fuchsia 系統上的內容都是 Fuchsia 套件。無論是立即呈現或呈現在 Fuuchsia 看到的任何內容,都可以在同一個套件裡。本文件說明套件驅動工作流程的基本概念,用於建構套件,並將套件推送至可透過開發主機 IP 連上的 Fuuchsia 裝置。

事前準備和總覽

主機和目標必須可以透過 IP 進行通訊。特別是,必須能夠從開發主機透過 SSH 連線至目標裝置,且目標裝置必須可透過 TCP 連線至通訊埠 8083 上的開發主機。SSH 連線可用於向目標裝置發出指令。

開發主機會執行簡單的靜態檔案 HTTP 伺服器,向目標提供更新內容。此 HTTP 伺服器是 Fuchsia 原始碼的一部分,會自動建構。

目標會指示透過一組手動執行的指令,尋找開發主機上的變更。當目標上的更新系統偵測到這些變更時,會從在主機上執行的 HTTP 伺服器擷取新軟體。新軟體將可供使用,直到目標重新啟動為止。

建築

如要建構包含必要程式碼的套件,系統會使用套件類型建構規則。如需為目標套件建立其中之一,請參閱此參考資料頁面

一旦有適當的建構規則可以使用,就可以執行 fx build 重新產生。

檢查套件

Fuchsia 隨附用於處理套件封存的工具 farFuchsia 建構完成後,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 系統上有兩個套件:

  • basebase 套件集是一組軟體關鍵,足以讓適當的系統功能保持一致。如果透過 --with-base 旗標將套件提供給 fx set,Fuschsia 建構系統會指派套件給 base。這組軟體只能透過執行整個系統更新 (通常稱為 OTA) 來更新,如下所述。這會透過 fx ota 更新。

  • cacheuniverse 套件集包含的暫時軟體套件是臨時軟體,可隨選更新。如果透過 --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 startfx test 叫用時,系統會在啟動前快取套件伺服器中可用的新版本。

紫紅色樹外的包裝程式碼

您可以封裝及推送位於 Fuchsia 樹狀結構外的程式碼,但需要更多作業。Fuchsia 套件格式非常簡單。其中包含說明套件內容的中繼資料檔案,詳情請參閱 Fuchsia 套件說明文件。中繼資料檔案會新增至 TUF 檔案樹狀結構,且每個內容都會以其 Merkle 根雜湊命名,並存放在 TUF 檔案樹狀結構的根目錄中,稱為「blobs」。