更新套件

更新套件是包含如何更新系統的檔案和規則的套件。

系統更新

系統更新檢查工具會查看更新套件的系統映像檔根層級根,並與執行系統的 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>] 韌體映像檔。例如:firmwarefirmware_bl2firmware_full。每部裝置都支援一組自訂的韌體類型,並且系統會忽略不支援的類型。這有兩個主要用途:

    1. 指定多個韌體版本;例如裝置有多個系統啟動載入程式階段。
    2. 提供簡單又安全的方式轉換至新的韌體類型;只需新增後端分區映像檔安裝工具邏輯,然後將新檔案放入更新套件即可。
  • /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-modeforce-recovery,則不得使用。如果 update-modenormal,則必須出現 zbizbi.signed

  • /recovery 復原映像檔

  • 所有套件中包含 /meta/contents/meta/package 中繼資料檔案。

  • /update_mode.json 選用。如果沒有檔案,update-mode 就是 normal。另一個選項是 force-recovery,用於寫入復原映像檔並重新啟動。任何其他 update-mode 值無效。例如:

    {
        "version": "1",
        "content": {
            "mode" : "force-recovery"
        }
    }