使用者資料查核點

Android 10 推出了使用者資料查核點 (UDC), 當 Android 系統處理無線更新時 (OTA) 更新失敗。透過 UDC,如果 Android OTA 更新失敗,裝置可以 以安全的方式復原至先前的狀態雖然 A/B 更新作業解決了這個問題,可用於早期啟動及復原 不支援修改使用者資料分區 (掛接於 /data)。

UDC 可讓裝置還原使用者資料分區 (即使在 已修改。UDC 功能可利用 檔案系統,在檔案系統不支援時替代實作方式 檢查點,與系統啟動載入程式 A/B 機制整合,同時支援 非 A/B 版本更新,且支援金鑰版本繫結和金鑰復原 預防措施

使用者影響

UDC 功能可改善 OTA 更新體驗,避免使用者流失 更新失敗的資料。這麼做可減少支援呼叫次數 。但如果網路旅行社 更新失敗時,使用者可能會發現裝置多次重新啟動。

運作方式

不同檔案系統中的查核點功能

針對 F2FS 檔案系統,UDC 會在上游新增查核點功能 4.20 Linux 核心並向後移植至裝置支援的所有通用核心 搭載 Android 10

針對其他檔案系統,UDC 會使用名為 dm_bow 的裝置對應虛擬裝置 檢查點功能dm_bow位於裝置和檔案之間 有些人會將 Cloud Storage 視為檔案系統 但實際上不是分區在掛接時即會發出飾板,導致檔案系統 都發出修剪指令。「dm_bow」會攔截這類剪輯和使用方式 並設定免費的封鎖清單然後讀取和寫入資料會傳送至裝置 未修改,不過在允許寫入之前,系統會備份還原所需的資料 免付費區塊

查核點程序

掛接含有 checkpoint=fs/block 旗標的分區時,Android 會呼叫 硬碟上的 restoreCheckpoint,可讓裝置還原任何現有檔案 檢查點。接著,init 會呼叫 needsCheckpoint 函式來判斷 裝置處於系統啟動載入程式 A/B 狀態,或是已設定更新重試作業 數量。如果任一屬性為 true,Android 會呼叫 createCheckpoint 以新增掛接 或建構 dm_bow 裝置

掛接分區後,系統會呼叫檢查點程式碼來發出剪輯。 接著,啟動程序將照常運作。Android 裝置:LOCKED_BOOT_COMPLETE 呼叫 commitCheckpoint 來提交目前的查核點和更新 繼續正常運作

管理 Keymaster 金鑰

Keymaster 金鑰可用於裝置加密或其他用途。如要管理這些 鍵,Android 會延遲刪除鍵刪除呼叫,直到檢查點提交為止。

監控健康狀態

健康狀態 Daemon 會確認磁碟空間是否足夠 檢查點。健康 Daemon 位於 cp_healthDaemon敬上 位置:Checkpoint.cpp

健康狀態 Daemon 具有以下可設定的行為:

Checkpoint API

UDC 功能會使用 Checkpoint API。如要瞭解 UDC 使用的其他 API,請參閱 IVold.aidl

void startCheckpoint(int 重試)

建立查核點。

架構在準備開始更新時,會呼叫這個方法。 系統會先建立查核點,再建立查核點 重新啟動後已掛接 R/W。如果重試次數為正數,API 會處理 追蹤重試,而更新工具會呼叫 needsRollback 來檢查是否復原 需要更新如果重試次數為 -1,API 會遵從 A/B 版本 系統啟動載入程式的判斷方式。

執行一般 A/B 更新時,不會呼叫此方法。

voidCommitChanges()

提交變更。

當變更準備就緒時,架構會在重新啟動後呼叫這個方法 。系統會在資料 (例如圖片、影片、簡訊、伺服器等) 之前呼叫這個方法 收據) 會在 BootComplete之前寫入使用者資料。

如果沒有任何執行中的查核點更新,此方法就不會有任何作用。

abortChanges()

強制重新啟動並還原為查核點。捨棄所有使用者資料修改內容 。

架構會在重新啟動後但 commitChanges 之前呼叫這個方法。 呼叫此方法時,retry_counter 會減少。記錄項目為 。

bool requirementsRollback()

決定是否需要復原。

在非查核點裝置上,傳回 false。在查核點裝置上傳回 true 自動檢查功能

實作 UDC

參照實作

如需實作 UDC 的範例,請參閱 dm-bow.c。 如需關於功能的其他文件,請參閱 dm-bow.txt

設定

init.hardware.rc 檔案的 on fs 中,請確認符合下列條件:

mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --early

init.hardware.rc 檔案的 on late-fs 中,請確認符合下列條件:

mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late

在您的 fstab.hardware 檔案中,確定 /data 已標記為 latemount

/dev/block/bootdevice/by-name/userdata              /data              f2fs
noatime,nosuid,nodev,discard,reserve_root=32768,resgid=1065,fsync_mode=nobarrier
latemount,wait,check,fileencryption=ice,keydirectory=/metadata/vold/metadata_encryption,quota,formattable,sysfs_path=/sys/devices/platform/soc/1d84000.ufshc,reservedsize=128M,checkpoint=fs

新增中繼資料分區

UDC 需要中繼資料分區來儲存非系統啟動載入程式的重試次數, 鍵。設定中繼資料分區,並提早在 /metadata 掛接。

在您的 fstab.hardware 檔案中,確定 /metadata 已標記為 earlymountfirst_stage_mount

/dev/block/by-name/metadata           /metadata           ext4
noatime,nosuid,nodev,discard,sync
wait,formattable,first_stage_mount

將分區初始化為所有零。

BoardConfig.mk 中新增以下幾行內容:

BOARD_USES_METADATA_PARTITION := true
BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata

更新系統

F2FS 系統

如果系統使用 F2FS 設定資料格式,請確認 F2FS 版本 支援查核點如需詳細資訊,請參閱 Checkpoint 功能 不同的檔案系統

checkpoint=fs 標記新增至 Fstab 的 <fs_mgr_flags> 區段 裝置掛接位置為 /data

非 F2FS 系統

如為非 F2FS 系統,必須在核心設定中啟用 dm-bow

checkpoint=block 標記新增至 Fstab 的 <fs_mgr_flags> 區段 裝置掛接位置為 /data

查看記錄

呼叫 Checkpoint API 時會產生記錄項目。

驗證

如要測試 UDC 實作,請執行 VtsKernelCheckpointTest 的 VTS 組合 測試。