Nutzerdaten-Checkpoint

Mit Android 10 führen wir User Data Checkpoint (UDC) ein, ermöglicht es Android, auf den vorherigen Zustand zurückzusetzen, wenn ein Android-Over-the-Air- (OTA)-Update schlägt fehl. Wenn bei einer UDC ein Android-OTA-Update fehlschlägt, kann das Gerät auf den vorherigen Zustand zurücksetzen. Obwohl A/B-Updates lösen dieses Problem für frühe Starts, Rollbacks wird nicht unterstützt, wenn die Nutzerdatenpartition (bereitgestellt auf /data) geändert wird.

UDC ermöglicht es dem Gerät, die Partition der Nutzerdaten auch nach der geändert. Die UDC-Funktion erreicht dies mit Prüfpunktfunktionen zur Dateisystem, eine alternative Implementierung, wenn das Dateisystem Checkpoints, Integration mit dem Bootloader-A/B-Mechanismus und Nicht-A/B-Updates und Unterstützung für Schlüsselversionsbindung und Schlüssel-Rollback Prävention.

Auswirkungen auf Nutzer

Die UDC-Funktion verbessert die OTA-Aktualisierung für Nutzer, da weniger Nutzer verlieren wenn bei einem OTA-Update ein Fehler auftritt. Dadurch kann die Anzahl der Supportanrufe reduziert werden von Nutzern, bei denen während des Update-Vorgangs Probleme auftreten. Wenn jedoch ein Onlinereisebüro ein Update fehlschlägt, kann es vorkommen, dass Nutzer feststellen, dass das Gerät mehrmals neu startet.

Funktionsweise

Prüfpunktfunktion in verschiedenen Dateisystemen

Beim F2FS-Dateisystem fügt UDC dem Upstream 4.20 Linux-Kernel und Backporting an alle gängigen Kernels, die von Geräten unterstützt werden mit Android 10.

Bei anderen Dateisystemen verwendet UDC ein virtuelles Device Mapper-Gerät namens dm_bow für die Prüfpunktfunktionalität. dm_bow befindet sich zwischen dem Gerät und der Datei System. Beim Bereitstellen einer Partition wird ein Trim ausgegeben, wodurch das Dateisystem geben Sie Befehle zum Zuschneiden für alle kostenlosen Blöcke aus. dm_bow fängt diese Schnitte und Verwendungen ab um eine Sperrliste zu erstellen. Lese- und Schreibzugriffe werden dann an das Gerät gesendet. unverändert, aber bevor ein Schreibvorgang erlaubt wird, werden für eine Wiederherstellung benötigte Daten gesichert. bis zu einem kostenlosen Block.

Prüfpunktprozess

Wenn eine Partition mit dem Flag checkpoint=fs/block bereitgestellt wird, ruft Android restoreCheckpoint auf dem Laufwerk, damit das Gerät den aktuellen Checkpoint. init ruft dann die Funktion needsCheckpoint auf, um festzustellen, Das Gerät befindet sich entweder im Bootloader-A/B-Status oder hat den Aktualisierungsversuch festgelegt. Anzahl. Wenn einer der beiden Werte „true“ ist, ruft Android createCheckpoint auf, um die Bereitstellung hinzuzufügen Flags erstellen oder ein dm_bow-Gerät erstellen.

Nachdem die Partition bereitgestellt wurde, wird der Checkpoint-Code aufgerufen, um Schnitte auszugeben. Der Bootvorgang wird dann wie gewohnt fortgesetzt. Bei LOCKED_BOOT_COMPLETE, Android ruft commitCheckpoint auf, um den aktuellen Prüfpunkt und das Update zu übergeben. wie gewohnt fortgesetzt.

Keymaster-Schlüssel verwalten

Keymaster-Schlüssel werden zur Geräteverschlüsselung und für andere Zwecke verwendet. So verwalten Sie diese Schlüssel gelöscht, verzögert Android Schlüssellöschaufrufe, bis der Prüfpunkt festgeschrieben ist.

Gesundheitszustand überwachen

Ein System-Daemon prüft, ob genügend Speicherplatz vorhanden ist, um eine Checkpoint. Der System-Daemon befindet sich cp_healthDaemon in Checkpoint.cpp

Die folgenden Verhaltensweisen des System-Daemons können konfiguriert werden:

Checkpoint-APIs

Checkpoint APIs werden von der UDC-Funktion verwendet. Informationen zu anderen von UDC verwendeten APIs finden Sie unter IVold.aidl

void startCheckpoint(int wieder)

Erstellt einen Prüfpunkt.

Das Framework ruft diese Methode auf, wenn ein Update gestartet werden kann. Die Prüfpunkt wird erstellt, bevor Prüfpunkt-Dateisysteme wie Nutzerdaten erstellt werden. R/W nach dem Neustart bereitgestellt. Ist die Anzahl der Wiederholungen positiv, verarbeitet die API und der Updater ruft needsRollback auf, um zu prüfen, des Updates erforderlich ist. Wenn die Anzahl der Wiederholungen -1 ist, berücksichtigt die API den A/B-Wert das Urteil des Bootloaders.

Bei einem normalen A/B-Update wird diese Methode nicht aufgerufen.

void commitChanges()

Übernimmt die Änderungen.

Das Framework ruft diese Methode nach dem Neustart auf, wenn die Änderungen bereit sind. verpflichtet. Dies wird vor Daten (z. B. Bilder, Videos, SMS, Serverdaten) Empfangsbestätigung) wird in Nutzerdaten und vor BootComplete geschrieben.

Wenn kein aktives Update mit einem Prüfpunkt vorhanden ist, hat diese Methode keine Auswirkungen.

abbrechenChanges()

Erzwingt einen Neustart und kehrt zum Prüfpunkt zurück. Verwirft alle Änderungen an Nutzerdaten seit dem ersten Neustart.

Das Framework ruft diese Methode nach dem Neustart, aber vor commitChanges auf. retry_counter wird beim Aufruf dieser Methode verringert. Logeinträge sind generiert.

bool erfordertRollback()

Bestimmt, ob ein Rollback erforderlich ist.

Auf Geräten ohne Prüfpunkt wird false zurückgegeben. Auf Checkpoint-Geräten wird true zurückgegeben während eines Non-Checkpoint-Starts.

UDC implementieren

Referenzimplementierung

Ein Beispiel für die Implementierung von UDC finden Sie unter dm-bow.c Weitere Informationen zu dieser Funktion finden Sie unter dm-bow.txt.

Einrichten

Achten Sie darauf, dass in on fs in Ihrer init.hardware.rc-Datei Folgendes vorhanden ist:

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

Achten Sie darauf, dass in on late-fs in Ihrer init.hardware.rc-Datei Folgendes vorhanden ist:

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

Achten Sie darauf, dass /data in der Datei fstab.hardware als latemount getaggt ist.

/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

Metadatenpartition hinzufügen

Für UDC ist eine Metadatenpartition erforderlich, um die Anzahl der Nicht-Bootloader-Wiederholungen zu speichern. Schlüssel. Richten Sie eine Metadatenpartition ein und stellen Sie sie frühzeitig unter /metadata bereit.

Achten Sie darauf, dass /metadata in der Datei „fstab.hardware“ als earlymount getaggt ist oder first_stage_mount.

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

Initialisieren Sie die Partition auf alle Nullen.

Fügen Sie BoardConfig.mk die folgenden Zeilen hinzu:

BOARD_USES_METADATA_PARTITION := true
BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata

Systeme aktualisieren

F2FS-Systeme

Stellen Sie bei Systemen, die F2FS zur Datenformatierung verwenden, sicher, dass Ihre Version von F2FS unterstützt Prüfpunkte. Weitere Informationen finden Sie unter Prüfpunktfunktion in verschiedene Dateisysteme.

Fügen Sie dem Abschnitt <fs_mgr_flags> von fstab das Flag checkpoint=fs für die Gerät unter /data bereitgestellt.

Nicht-F2FS-Systeme

Für Nicht-F2FS-Systeme muss dm-bow in der Kernel-Konfiguration aktiviert sein.

Fügen Sie dem Abschnitt <fs_mgr_flags> von fstab das Flag checkpoint=block für die Gerät unter /data bereitgestellt.

Logs prüfen

Logeinträge werden beim Aufrufen von Checkpoint APIs generiert.

Zertifizierungsstufe

Führen Sie den VTS-Satz VtsKernelCheckpointTest aus, um die UDC-Implementierung zu testen Tests durchführen.