Checkpoint Data Pengguna

Android 10 memperkenalkan User Data Checkpoint (UDC), yang memungkinkan Android melakukan roll back ke status sebelumnya saat update Android over-the-air (OTA) gagal. Dengan UDC, jika update OTA Android gagal, perangkat dapat melakukan roll back ke status sebelumnya dengan aman. Meskipun update A/B memecahkan masalah ini untuk booting awal, rollback tidak didukung saat partisi data pengguna (dipasang di /data) diubah.

UDC memungkinkan perangkat mengembalikan partisi data pengguna bahkan setelah diubah. Fitur UDC mencapai hal ini dengan kemampuan checkpoint ke sistem file, implementasi alternatif saat sistem file tidak mendukung checkpoint, integrasi dengan mekanisme A/B bootloader sekaligus mendukung update non-A/B, dan dukungan untuk binding versi kunci dan rollback kunci.

Dampak terhadap pengguna

Fitur UDC meningkatkan pengalaman update OTA bagi pengguna karena lebih sedikit pengguna yang kehilangan data saat update OTA gagal. Hal ini dapat mengurangi jumlah panggilan dukungan dari pengguna yang mengalami masalah selama proses update. Namun, saat update OTA gagal, pengguna mungkin melihat perangkat memulai ulang beberapa kali.

Cara kerjanya

Fungsi pemeriksaan titik di berbagai sistem file

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

Untuk sistem file lainnya, UDC menggunakan perangkat virtual mapper perangkat yang disebut dm_bow untuk fungsi checkpoint. dm_bow berada di antara perangkat dan sistem file. Saat partisi dipasang, pemangkasan akan dikeluarkan sehingga sistem file mengeluarkan perintah pemangkasan pada semua blok kosong. dm_bow menangkap pemangkasan ini dan menggunakannya untuk menyiapkan daftar blok gratis. Operasi baca dan tulis kemudian dikirim ke perangkat tanpa diubah, tetapi sebelum operasi tulis diizinkan, data yang diperlukan untuk pemulihan dicadangkan ke blok bebas.

Proses checkpoint

Saat partisi dengan flag checkpoint=fs/block dipasang, Android akan memanggil restoreCheckpoint di drive untuk memungkinkan perangkat memulihkan checkpoint saat ini. init kemudian memanggil fungsi needsCheckpoint untuk menentukan apakah perangkat berada dalam status bootloader A/B atau telah menetapkan jumlah percobaan ulang update. Jika salah satunya benar, Android akan memanggil createCheckpoint untuk menambahkan flag mount atau mem-build perangkat dm_bow.

Setelah partisi dipasang, kode checkpoint dipanggil untuk mengeluarkan pemangkasan. Proses booting kemudian dilanjutkan seperti biasa. Di LOCKED_BOOT_COMPLETE, Android memanggil commitCheckpoint untuk melakukan pemeriksaan poin saat ini dan update akan berlanjut seperti biasa.

Mengelola kunci keymaster

Kunci Keymaster digunakan untuk enkripsi perangkat atau tujuan lainnya. Untuk mengelola kunci ini, Android menunda panggilan penghapusan kunci hingga checkpoint di-commit.

Memantau kondisi

Daemon kesehatan memverifikasi bahwa ada cukup ruang disk untuk membuat titik pemeriksaan. Daemon kesehatan terletak di cp_healthDaemon di Checkpoint.cpp.

Daemon kesehatan memiliki perilaku berikut yang dapat dikonfigurasi:

Checkpoint API

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. Titik kontrol dibuat sebelum sistem file yang di-checkpoint seperti userdata dipasang R/W setelah dimulai ulang. Jika jumlah percobaan ulang positif, API akan menangani percobaan ulang pelacakan, dan pengupdate akan memanggil needsRollback untuk memeriksa apakah rollback update diperlukan. Jika jumlah percobaan ulang adalah -1, API akan menunda penilaian bootloader A/B.

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

void commitChanges()

Melakukan commit pada perubahan.

Framework ini memanggil metode ini setelah mulai ulang saat perubahan siap di-commit. Ini dipanggil sebelum data (seperti gambar, video, SMS, tanda terima server) ditulis ke userdata dan sebelum BootComplete.

Jika tidak ada pembaruan yang di-checkpoint aktif, metode ini tidak akan berpengaruh.

abortChanges()

Memaksa mulai ulang dan kembali ke titik pemeriksaan. Menghapus semua modifikasi userdata sejak mulai ulang pertama.

Framework memanggil metode ini setelah memulai ulang, 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. Pada perangkat checkpoint, menampilkan true selama booting non-checkpoint.

Menerapkan UDC

Penerapan referensi

Untuk contoh cara menerapkan UDC, lihat dm-bow.c. Untuk mengetahui dokumentasi tambahan tentang fitur ini, 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

Menambahkan partisi metadata

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

Dalam 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 nol.

Tambahkan baris berikut ke BoardConfig.mk:

BOARD_USES_METADATA_PARTITION := true
BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata

Mengupdate sistem

Sistem F2FS

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

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

Sistem non-F2FS

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

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

Memeriksa log

Entri log dibuat saat Checkpoint API dipanggil.

Validasi

Untuk menguji implementasi UDC, jalankan kumpulan pengujian VTS VtsKernelCheckpointTest.