Pos Pemeriksaan Data Pengguna

Android 10 memperkenalkan User Data Checkpoint (UDC), yang memungkinkan Android mengembalikan ke keadaan sebelumnya ketika pembaruan Android over-the-air (OTA) gagal. Dengan UDC, jika pembaruan Android OTA gagal, perangkat dapat kembali ke keadaan sebelumnya dengan aman. Meskipun pembaruan A/B menyelesaikan masalah ini untuk boot awal, rollback tidak didukung ketika partisi data pengguna (yang terpasang pada /data ) diubah.

UDC memungkinkan perangkat mengembalikan partisi data pengguna bahkan setelah dimodifikasi. Fitur UDC menyelesaikan hal ini dengan kemampuan pos pemeriksaan pada sistem file, implementasi alternatif ketika sistem file tidak mendukung pos pemeriksaan, integrasi dengan mekanisme bootloader A/B sekaligus mendukung pembaruan non-A/B, dan dukungan untuk pengikatan versi kunci dan pencegahan rollback kunci.

Dampak pengguna

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

Bagaimana itu bekerja

Fungsionalitas pos pemeriksaan di sistem file yang berbeda

Untuk sistem file F2FS, UDC menambahkan fungsionalitas checkpoint ke kernel Linux 4.20 upstream dan mem-backportnya ke semua kernel umum yang didukung oleh perangkat yang menjalankan Android 10.

Untuk sistem file lain, UDC menggunakan perangkat virtual pemeta perangkat yang disebut dm_bow untuk fungsionalitas pos pemeriksaan. dm_bow berada di antara perangkat dan sistem file. Ketika sebuah partisi dipasang, trim dikeluarkan yang menyebabkan sistem file mengeluarkan perintah trim pada semua blok bebas. dm_bow mencegat trim ini dan menggunakannya untuk membuat daftar blokir gratis. Pembacaan dan penulisan kemudian dikirim ke perangkat tanpa dimodifikasi, namun sebelum penulisan diperbolehkan, data yang diperlukan untuk pemulihan dicadangkan ke blok bebas.

Proses pos pemeriksaan

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

Setelah partisi dipasang, kode pos pemeriksaan dipanggil untuk mengeluarkan trim. Proses booting kemudian berlanjut seperti biasa. Di LOCKED_BOOT_COMPLETE , Android memanggil commitCheckpoint untuk melakukan pos pemeriksaan saat ini dan pembaruan berlanjut seperti biasa.

Kelola kunci keymaster

Kunci keymaster digunakan untuk enkripsi perangkat atau tujuan lainnya. Untuk mengelola kunci ini, Android menunda panggilan penghapusan kunci hingga pos pemeriksaan dilakukan.

Pantau kesehatan

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

Daemon kesehatan memiliki perilaku berikut yang dapat dikonfigurasi:

API pos pemeriksaan

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

batalkan startCheckpoint (int coba lagi)

Membuat pos pemeriksaan.

Kerangka kerja memanggil metode ini ketika sudah siap untuk memulai pembaruan. Pos pemeriksaan dibuat sebelum sistem file pos pemeriksaan seperti data pengguna dipasang R/W setelah reboot. Jika jumlah percobaan ulang positif, API akan menangani pelacakan percobaan ulang, dan pembaru akan memanggil needsRollback untuk memeriksa apakah rollback pembaruan diperlukan. Jika jumlah percobaan ulang adalah -1 , API akan tunduk pada penilaian bootloader A/B.

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

batalkan commitChanges()

Melakukan perubahan.

Kerangka kerja memanggil metode ini setelah reboot ketika perubahan siap diterapkan. Ini disebut sebelum data (seperti gambar, video, SMS, tanda terima server) ditulis ke data pengguna dan sebelum BootComplete .

Jika tidak ada pembaruan pos pemeriksaan aktif, metode ini tidak berpengaruh.

batalkanPerubahan()

Memaksa reboot dan kembali ke pos pemeriksaan. Abaikan semua modifikasi data pengguna sejak reboot pertama.

Kerangka kerja memanggil metode ini setelah reboot tetapi sebelum commitChanges . retry_counter berkurang ketika metode ini dipanggil. Entri log dihasilkan.

bool membutuhkanRollback()

Menentukan apakah rollback diperlukan.

Pada perangkat noncheckpoint, mengembalikan false . Pada perangkat checkpoint, mengembalikan nilai true selama boot noncheckpoint.

Menerapkan UDC

Implementasi referensi

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

Mempersiapkan

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

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

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

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

Di file fstab.hardware Anda, pastikan /data ditandai 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 dan kunci percobaan ulang nonbootloader. Siapkan partisi metadata dan pasang lebih awal di /metadata .

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

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

Inisialisasi partisi ke semua nol.

Tambahkan baris berikut ke BoardConfig.mk :

BOARD_USES_METADATA_PARTITION := true
BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata

Perbarui sistem

sistem F2FS

Untuk sistem yang menggunakan F2FS untuk memformat data, pastikan versi F2FS Anda mendukung pos pemeriksaan. Untuk informasi selengkapnya, lihat Fungsionalitas pos pemeriksaan di sistem file yang berbeda .

Tambahkan tanda 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 tanda checkpoint=block ke bagian <fs_mgr_flags> fstab untuk perangkat yang dipasang di /data .

Periksa log

Entri log dihasilkan ketika API Checkpoint dipanggil.

Validasi

Untuk menguji implementasi UDC Anda, jalankan rangkaian pengujian VTS VtsKernelCheckpointTest .