Android具有兩種更新機制:A / B(無縫)更新和非A / B更新。為了降低代碼複雜性並增強可更新性,Android 11統一了這兩種機制。新的更新機制虛擬A / B通過為所有設備帶來無縫更新,同時最大程度地降低了存儲成本,結合了兩個前輩的優勢。
- 虛擬A / B更新與A / B更新一樣是無縫的。虛擬A / B更新可最大程度地減少設備離線和不可用的時間。
- 虛擬A / B更新可以回滾。如果新操作系統無法啟動,則設備會自動回滾到以前的版本。
- 虛擬A / B更新通過僅複製引導加載程序使用的分區來使用最少的額外空間。其他可更新分區已快照。
背景
本節介紹一些支持虛擬A / B的術語和技術。
設備映射器
設備映射器是Android中經常使用的Linux虛擬塊層。對於動態分區, /system
類的分區是分層設備的堆棧:
- 堆棧的底部是物理超級分區(例如,
/dev/block/by-name/super
)。 - 中間是
dm-linear
設備,用於指定超級分區中的哪些塊形成給定分區。這表現為/dev/block/mapper/system_[a|b]
的A / B設備上,或/dev/block/mapper/system
的非A / B設備上。 - 最後,為驗證的分區創建
dm-verity
設備。該設備驗證dm-linear
設備上的塊是否正確簽名。它顯示為/dev/block/mapper/system-verity
並且是/system
掛載點的來源。
這是/system
掛載點下的堆棧圖。
圖1. / system掛載點下的堆棧
dm快照概述
虛擬A / B依賴於dm-snapshot
,這是一個用於映射存儲設備狀態的設備映射器模塊。使用dm-snaphot
,有四個設備正在播放:
- 基本設備是被快照的設備。在此頁面上,基本設備始終是動態分區,例如係統或供應商。
- 寫入時復制(COW)設備用於將更改記錄到基本設備上。它可以是任何大小,但必須足夠大以容納對基本設備的所有更改。
- 快照設備是使用
snapshot
目標創建的。寫入快照設備將寫入COW設備。從快照設備讀取是從基本設備讀取還是從COW設備讀取,具體取決於快照是否更改了所訪問的數據。 - 使用
snapshot-origin
目標創建原始設備。讀取直接從基本設備讀取的原始設備。寫入原始設備直接寫入基本設備,但是通過寫入COW設備備份原始數據。
圖2. dm快照的設備映射