Checkpoint Data Pengguna

Android 10 memperkenalkan {i>User Data Checkpoint <i}(UDC), yang memungkinkan Android melakukan roll back ke keadaan sebelumnya saat Android over the air (OTA) Update (OTA) gagal. Dengan UDC, jika pembaruan OTA Android gagal, perangkat dapat dapat dikembalikan ke keadaan sebelumnya dengan aman. Meskipun Update A/B memecahkan masalah ini untuk booting awal, rollback tidak didukung jika partisi data pengguna (yang terpasang di /data) diubah.

UDC memungkinkan perangkat untuk mengembalikan partisi data pengguna bahkan setelah diubah. Fitur UDC melakukannya dengan kemampuan pos pemeriksaan ke sistem file, implementasi alternatif ketika sistem file tidak mendukung checkpoint, integrasi dengan mekanisme A/B bootloader dan juga update non-A/B, dan dukungan untuk binding versi kunci dan rollback kunci pencegahan.

Dampak terhadap pengguna

Fitur UDC meningkatkan pengalaman update OTA untuk pengguna karena lebih sedikit pengguna yang kehilangan data mereka ketika pembaruan OTA gagal. Hal ini dapat mengurangi jumlah panggilan dukungan dari pengguna yang mengalami masalah selama proses pembaruan. Namun, ketika OTA update gagal, pengguna mungkin akan melihat perangkat dimulai ulang beberapa kali.

Cara kerjanya

Fungsionalitas checkpoint di berbagai sistem file

Untuk sistem file F2FS, UDC menambahkan fungsi checkpoint ke upstream 4.20 Kernel Linux dan melakukan backport ke semua kernel umum yang didukung oleh perangkat menjalankan Android 10.

Untuk sistem file lainnya, UDC menggunakan perangkat virtual mapper perangkat yang disebut dm_bow untuk fungsionalitas checkpoint. dm_bow berada di antara perangkat dan file sistem file. Ketika partisi terpasang, {i>trim<i} dikeluarkan yang menyebabkan sistem file untuk memberikan perintah {i>trim<i} pada semua blok yang bebas digunakan. dm_bow mencegat pemangkasan dan penggunaan ini mereka untuk membuat daftar blokir gratis. Operasi baca dan tulis kemudian dikirim ke perangkat tidak dimodifikasi, tetapi sebelum operasi tulis diizinkan, data yang diperlukan untuk pemulihan akan hingga satu blok gratis.

Proses checkpoint

Saat partisi dengan tanda checkpoint=fs/block dipasang, Android akan memanggil restoreCheckpoint di drive agar perangkat dapat memulihkan data saat ini pos pemeriksaan. init kemudian memanggil fungsi needsCheckpoint untuk menentukan apakah perangkat dalam status A/B bootloader atau telah menetapkan percobaan ulang update penghitungan. Jika salah satunya benar, Android akan memanggil createCheckpoint untuk menambahkan pemasangan flag atau build perangkat dm_bow.

Setelah partisi terpasang, kode checkpoint dipanggil untuk melakukan trim. Proses {i>booting<i} kemudian berlanjut seperti biasa. Di LOCKED_BOOT_COMPLETE, Android memanggil commitCheckpoint untuk meng-commit checkpoint saat ini dan update berlanjut seperti biasa.

Kelola kunci keymaster

Kunci Keymaster digunakan untuk enkripsi perangkat atau tujuan lain. Untuk mengelola Android akan menunda panggilan penghapusan tombol hingga checkpoint di-commit.

Pantau kondisi

Daemon kesehatan memverifikasi bahwa ada cukup kapasitas {i>disk<i} untuk membuat pos pemeriksaan. {i>Daemon<i} kesehatan terletak di cp_healthDaemon dalam Checkpoint.cpp.

Daemon kesehatan memiliki perilaku berikut yang dapat dikonfigurasi:

API Checkpoint

Checkpoint API digunakan oleh fitur UDC. Untuk API lain yang digunakan oleh UDC, lihat IVold.aidl

void startCheckpoint(int percobaan ulang)

Membuat checkpoint.

Framework akan memanggil metode ini setelah siap untuk memulai update. Tujuan dibuat sebelum sistem file yang diperiksa, seperti data pengguna, terpasang R/W setelah {i>reboot<i}. Jika jumlah percobaan ulang positif, API akan menangani melacak percobaan ulang, dan updater memanggil needsRollback untuk memeriksa apakah rollback update diperlukan. Jika jumlah percobaan ulangnya adalah -1, API akan mengalihkan ke A/B penilaian {i>bootloader<i}.

Metode ini tidak dipanggil saat melakukan update A/B normal.

void commitChanges()

Meng-commit perubahan.

Framework ini memanggil metode ini setelah reboot saat perubahan siap berkomitmen. Ini dipanggil sebelum data (seperti gambar, video, SMS, server tanda terima penerimaan) ditulis ke data pengguna dan sebelum BootComplete.

Jika tidak ada update dengan checkpoint yang aktif, metode ini tidak akan berpengaruh.

abortChanges()

Memaksa {i>reboot<i} dan mengembalikan ke {i>checkpoint<i}. Mengabaikan semua modifikasi data pengguna sejak {i>reboot <i}pertama.

Framework ini memanggil metode ini setelah reboot, tetapi sebelum commitChanges. retry_counter diturunkan saat metode ini dipanggil. Entri log dibuat.

bool needsRollback()

Menentukan apakah rollback diperlukan.

Pada perangkat non-checkpoint, menampilkan false. Di perangkat pos pemeriksaan, mengembalikan true selama {i>booting<i} di luar {i>checkpoint<i}.

Mengimplementasikan UDC

Penerapan referensi

Untuk contoh bagaimana UDC dapat diimplementasikan, lihat dm-bow.c. Untuk dokumentasi tambahan tentang fitur, lihat dm-bow.txt.

Penyiapan

Di on fs dalam file init.hardware.rc, pastikan Anda memiliki:

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

Di on late-fs dalam file init.hardware.rc, pastikan Anda memiliki:

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

Di file fstab.hardware Anda, pastikan /data diberi tag sebagai 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

Tambahkan partisi metadata

UDC memerlukan partisi metadata untuk menyimpan jumlah percobaan ulang nonbootloader dan tombol. Siapkan partisi metadata dan pasang lebih awal di /metadata.

Di file fstab.hardware Anda, pastikan /metadata diberi tag sebagai earlymount atau first_stage_mount.

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

Lakukan inisialisasi partisi ke semua angka nol.

Tambahkan baris berikut ke BoardConfig.mk:

BOARD_USES_METADATA_PARTITION := true
BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata

Update sistem

Sistem F2FS

Untuk sistem yang menggunakan F2FS untuk memformat data, pastikan bahwa versi F2FS Anda mendukung checkpoint. Untuk informasi selengkapnya, lihat Fungsi checkpoint dalam sistem file yang berbeda.

Tambahkan flag checkpoint=fs ke bagian <fs_mgr_flags> fstab untuk perangkat dipasang pada /data.

Sistem non-F2FS

Untuk sistem non-F2FS, dm-bow harus diaktifkan dalam konfigurasi kernel.

Tambahkan flag checkpoint=block ke bagian <fs_mgr_flags> fstab untuk perangkat dipasang pada /data.

Periksa log

Entri log dibuat saat Checkpoint API dipanggil.

Validasi

Untuk menguji implementasi UDC, jalankan kumpulan VTS VtsKernelCheckpointTest pengujian.