Punkt kontrolny danych użytkownika

W systemie Android 10 wprowadzono punkt kontroli danych użytkownika (UDC), który umożliwia przywrócenie poprzedniego stanu systemu Android w przypadku niepowodzenia aktualizacji systemu Android przez sieć bezprzewodową (OTA). Dzięki UDC, jeśli aktualizacja Androida OTA nie powiedzie się, urządzenie może bezpiecznie przywrócić poprzedni stan. Chociaż aktualizacje A/B rozwiązują ten problem w przypadku wczesnego rozruchu, wycofywanie zmian nie jest obsługiwane w przypadku modyfikacji partycji danych użytkownika (zamontowanej na /data ).

UDC umożliwia urządzeniu przywrócenie partycji danych użytkownika nawet po modyfikacji. Funkcja UDC osiąga to dzięki możliwościom punktów kontrolnych w systemie plików, alternatywnej implementacji, gdy system plików nie obsługuje punktów kontrolnych, integracji z mechanizmem A/B programu ładującego przy jednoczesnej obsłudze aktualizacji innych niż A/B oraz obsłudze powiązania wersji klucza i zapobieganie przywróceniu klucza.

Wpływ użytkownika

Funkcja UDC poprawia jakość aktualizacji OTA dla użytkowników, ponieważ mniej użytkowników traci swoje dane w przypadku niepowodzenia aktualizacji OTA. Może to zmniejszyć liczbę zgłoszeń do pomocy technicznej od użytkowników, którzy napotkali problemy podczas procesu aktualizacji. Jeśli jednak aktualizacja OTA nie powiedzie się, użytkownicy mogą zauważyć wielokrotne ponowne uruchomienie urządzenia.

Jak to działa

Funkcjonalność punktu kontrolnego w różnych systemach plików

W przypadku systemu plików F2FS UDC dodaje funkcję punktu kontrolnego do jądra Linuksa starszego wersji 4.20 i przenosi ją do wszystkich popularnych jąder obsługiwanych przez urządzenia z systemem Android 10.

W przypadku innych systemów plików UDC używa wirtualnego urządzenia mapującego urządzenia o nazwie dm_bow w celu zapewnienia funkcjonalności punktu kontrolnego. dm_bow znajduje się pomiędzy urządzeniem a systemem plików. Kiedy partycja jest zamontowana, wydawane jest polecenie przycięcia, które powoduje, że system plików wydaje polecenia przycięcia dla wszystkich wolnych bloków. dm_bow przechwytuje te wykończenia i używa ich do skonfigurowania listy wolnych bloków. Odczyty i zapisy są następnie wysyłane do urządzenia w stanie niezmodyfikowanym, ale przed zezwoleniem na zapis dane potrzebne do przywrócenia są zapisywane w wolnym bloku.

Proces punktu kontrolnego

Po zamontowaniu partycji z flagą checkpoint=fs/block system Android wywołuje na dysku restoreCheckpoint , aby umożliwić urządzeniu przywrócenie dowolnego bieżącego punktu kontrolnego. init następnie wywołuje funkcję needsCheckpoint , aby sprawdzić, czy urządzenie znajduje się w stanie A/B programu ładującego lub czy ma ustawioną liczbę ponownych prób aktualizacji. Jeśli jedno z nich jest prawdą, Android wywołuje createCheckpoint w celu dodania flag montowania lub zbudowania urządzenia dm_bow .

Po zamontowaniu partycji wywoływany jest kod punktu kontrolnego w celu wydania przycięć. Proces rozruchu będzie następnie kontynuowany normalnie. W LOCKED_BOOT_COMPLETE Android wywołuje commitCheckpoint , aby zatwierdzić bieżący punkt kontrolny, a aktualizacja jest kontynuowana normalnie.

Zarządzaj kluczami głównymi kluczami

Klucze Keymaster służą do szyfrowania urządzenia lub do innych celów. Aby zarządzać tymi kluczami, Android opóźnia wywołania usuwania kluczy do momentu zatwierdzenia punktu kontrolnego.

Monitoruj zdrowie

Demon kondycji sprawdza, czy jest wystarczająca ilość miejsca na dysku, aby utworzyć punkt kontrolny. Demon kondycji znajduje się w cp_healthDaemon w Checkpoint.cpp .

Demon kondycji ma następujące zachowania, które można skonfigurować:

  • ro.sys.cp_msleeptime : Kontroluje częstotliwość sprawdzania użycia dysku przez urządzenie.
  • ro.sys.cp_min_free_bytes : Kontroluje minimalną wartość, której szuka demon kondycji.
  • ro.sys.cp_commit_on_full : kontroluje, czy demon kondycji ponownie uruchamia urządzenie, czy zatwierdza punkt kontrolny i kontynuuje, gdy dysk jest pełny.

Interfejsy API punktów kontrolnych

Interfejsy API punktu kontrolnego są używane przez funkcję UDC. Informacje na temat innych interfejsów API używanych przez UDC można znaleźć w pliku IVold.aidl .

nieważny punkt kontrolny startu (ponowna próba)

Tworzy punkt kontrolny.

Struktura wywołuje tę metodę, gdy jest gotowa do rozpoczęcia aktualizacji. Punkt kontrolny jest tworzony przed zamontowaniem systemów plików objętych punktami kontrolnymi, takich jak dane użytkownika, odczyt/zapis po ponownym uruchomieniu. Jeśli liczba ponownych prób jest dodatnia, interfejs API obsługuje ponowne próby śledzenia, a aktualizator wywołuje needsRollback w celu sprawdzenia, czy wymagane jest wycofanie aktualizacji. Jeśli liczba ponownych prób wynosi -1 , interfejs API odracza ocenę programu ładującego A/B.

Ta metoda nie jest wywoływana podczas normalnej aktualizacji A/B.

unieważnij zatwierdzenie zmian()

Zatwierdza zmiany.

Struktura wywołuje tę metodę po ponownym uruchomieniu, gdy zmiany są gotowe do zatwierdzenia. Jest to wywoływane przed zapisaniem danych (takich jak zdjęcia, wideo, SMS, potwierdzenie odbioru z serwera) w danych użytkownika i przed BootComplete .

Jeśli nie istnieje żadna aktywna aktualizacja z punktem kontrolnym, ta metoda nie ma żadnego efektu.

przerwać zmiany()

Wymusza ponowne uruchomienie i powrót do punktu kontrolnego. Porzuca wszystkie modyfikacje danych użytkownika od pierwszego ponownego uruchomienia.

Struktura wywołuje tę metodę po ponownym uruchomieniu, ale przed commitChanges . retry_counter jest zmniejszany po wywołaniu tej metody. Generowane są wpisy dziennika.

bool potrzebuje wycofania()

Określa, czy wymagane jest wycofanie zmian.

Na urządzeniach innych niż punkty kontrolne zwraca false . Na urządzeniach z punktem kontrolnym zwraca wartość true podczas rozruchu bez punktu kontrolnego.

Wdrażaj UDC

Implementacja referencyjna

Przykład implementacji UDC można znaleźć w dm-bow.c . Dodatkową dokumentację dotyczącą tej funkcji można znaleźć w pliku dm-bow.txt .

Organizować coś

W pliku on fs w pliku init.hardware.rc upewnij się, że masz:

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

W on late-fs w pliku init.hardware.rc upewnij się, że masz:

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

Upewnij się, że w pliku fstab.hardware /data jest oznaczony jako 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

Dodaj partycję metadanych

UDC wymaga partycji metadanych do przechowywania liczby ponownych prób i kluczy programu innego niż bootloader. Skonfiguruj partycję metadanych i wcześnie zamontuj ją w /metadata .

Upewnij się, że w pliku fstab.hardware /metadata jest oznaczony jako earlymount lub first_stage_mount .

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

Zainicjuj partycję wszystkimi zerami.

Dodaj następujące wiersze do BoardConfig.mk :

BOARD_USES_METADATA_PARTITION := true
BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata

Aktualizuj systemy

Systemy F2FS

W przypadku systemów używających F2FS do formatowania danych upewnij się, że Twoja wersja F2FS obsługuje punkty kontrolne. Aby uzyskać więcej informacji, zobacz Funkcjonalność punktu kontrolnego w różnych systemach plików .

Dodaj flagę checkpoint=fs do sekcji <fs_mgr_flags> fstab dla urządzenia zamontowanego w /data .

Systemy inne niż F2FS

W przypadku systemów innych niż F2FS, dm-bow musi być włączony w konfiguracji jądra.

Dodaj flagę checkpoint=block do sekcji <fs_mgr_flags> fstab dla urządzenia zamontowanego w /data .

Sprawdź logi

Wpisy dziennika są generowane podczas wywoływania interfejsów API Checkpoint.

Walidacja

Aby przetestować implementację UDC, uruchom zestaw testów VTS VtsKernelCheckpointTest .