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 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 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

Fungsi checkpoint di berbagai sistem file

Untuk sistem file F2FS, UDC menambahkan fungsi checkpoint 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 fungsionalitas checkpoint. dm_bow berada di antara perangkat dan 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 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. {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. Titik kontrol dibuat sebelum sistem file yang di-checkpoint seperti userdata dipasang R/W setelah dimulai ulang. Jika jumlah percobaan ulang positif, API 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()

Melakukan commit pada perubahan.

Framework memanggil metode ini setelah memulai 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 {i>reboot<i} dan mengembalikan ke {i>checkpoint<i}. Mengabaikan semua modifikasi data pengguna sejak {i>reboot<i} 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 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

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 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 informasi selengkapnya, lihat Fungsi checkpoint 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 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.