更新套件是包含如何更新系統的檔案和規則的套件。
系統更新
系統更新檢查工具會查看更新套件的系統映像檔根層級根,並與執行系統的 Merkle 根比較。也會檢查更新套件的 Merkle 根,並與系統更新檢查工具上次使用的版本進行比較。如果兩者不同,表示系統更新工具以外的東西已經更新系統。
系統更新成功後,裝置會重新啟動裝置。
系統更新檢查工具會使用套件解析器定期擷取更新套件,看看外觀是否不同。如果更新套件不同,系統會觸發套件更新。
系統更新工具的設計宗旨是讓程序隨時中斷,不會讓系統處於無法啟動或損毀的狀態。
首先,系統更新工具會讀取 update_mode
檔案,以判斷要執行哪些作業。接著,主面板檔案會讀取並驗證沒有任何設定錯誤。接著,更新套件會擷取要提供的套件。最後,更新套件會寫入核心映像檔,並確保 vbmeta
必須在核心映像檔之後編寫。
更新套件內容
更新套件 fuchsia-pkg://fuchsia.com/update
的結構包含下列內容:
/board
主面板名稱。更新工具會驗證內容,並只在這個值與先前的主面板名稱相符時才會更新。這項檢查可防止意外將裝置更新為不支援的架構。舉例來說,將x64
目標更新為arm64
建構作業會失敗。/bootloader
系統啟動載入程式韌體的映像檔。已淘汰:請改用firmware
。/epoch.json
系統無法透過 OTA 降級的 Epoch 紀元時間。詳情請參閱 RFC-0071。例如:{ "version": "1", "epoch": 5 }
/firmware[_<type>]
韌體映像檔。例如:firmware
、firmware_bl2
、firmware_full
。每部裝置都支援一組自訂的韌體類型,並且系統會忽略不支援的類型。這有兩個主要用途:- 指定多個韌體版本;例如裝置有多個系統啟動載入程式階段。
- 提供簡單又安全的方式轉換至新的韌體類型;只需新增後端分區映像檔安裝工具邏輯,然後將新檔案放入更新套件即可。
/packages.json
屬於目標 OS 映像檔基本套件組合的 Merkle 固定套件網址清單 (採用 JSON 格式)。更新套件會查看/packages.json
,以判斷需要更新哪些內容及更新順序。例如:{ “version”: “1”, “content”: [ "fuchsia-pkg://fuchsia.com/component_index/0?hash=40da91deffd7531391dd067ed89a19703a73d4fdf19fe72651ff30e414c4ef0a", "fuchsia-pkg://fuchsia.com/system_image/0?hash=c391b60a35f680b1cf99107309ded12a8219aedb4d296b7fa8a9c5e95ade5e85" ] }
/version
格式與/config/build-info/version
檔案相同。/zbi[.signed]
核心映像檔。如果update-mode
是force-recovery
,則不得使用。如果update-mode
為normal
,則必須出現zbi
或zbi.signed
。/recovery
復原映像檔所有套件中包含
/meta/contents
和/meta/package
中繼資料檔案。/update_mode.json
選用。如果沒有檔案,update-mode
就是normal
。另一個選項是force-recovery
,用於寫入復原映像檔並重新啟動。任何其他update-mode
值無效。例如:{ "version": "1", "content": { "mode" : "force-recovery" } }