A/B Virtual adalah mekanisme update utama Android. Build A/B virtual dibuat berdasarkan update A/B lama (lihat Update Sistem A/B) dan non-A/B yang tidak digunakan lagi di versi 15 untuk mengurangi overhead ruang update.
A/B virtual sebenarnya tidak memiliki slot tambahan untuk partisi dinamis. Baca partisi dinamis. Sebagai gantinya, delta ditulis ke snapshot, lalu digabungkan ke partisi dasar setelah mengonfirmasi booting yang berhasil. Virtual A/B menggunakan format snapshot khusus Android. Lihat format COW untuk snapshot terkompresi yang memungkinkan snapshot dikompresi dan meminimalkan penggunaan kapasitas disk. Di OTA penuh, ukuran snapshot berkurang sekitar 45% saat kompresi, dan ukuran snapshot OTA inkremental berkurang sekitar 55%.
Android 12 menawarkan opsi kompresi Virtual A/B untuk mengompresi partisi yang diambil snapshot-nya. A/B virtual menawarkan hal berikut
- Update A/B virtual lancar (update terjadi sepenuhnya di latar belakang saat perangkat beroperasi) seperti update A/B. Update A/B virtual meminimalkan waktu perangkat offline dan tidak dapat digunakan.
- Update A/B virtual dapat di-roll back. Jika OS baru gagal di-booting, perangkat akan otomatis di-roll back ke versi sebelumnya.
- Update A/B virtual menggunakan ruang tambahan minimum dengan hanya menduplikasi partisi yang digunakan oleh bootloader. Partisi lain yang dapat diupdate diambil snapshot-nya.
Latar Belakang dan terminologi
Bagian ini menentukan terminologi dan menjelaskan teknologi yang mendukung A/B virtual. Selama penginstalan OTA, data sistem operasi baru ditulis ke slot barunya untuk partisi fisik, atau perangkat COW khusus Android. Setelah perangkat dimulai ulang, data partisi dinamis digabungkan kembali ke perangkat dasarnya melalui penggunaan daemon dm-user dan snapuserd. Proses ini sepenuhnya terjadi di dalam {i>userspace<i}.
Device-mapper
Device-mapper adalah lapisan blok virtual Linux yang sering digunakan di Android. Dengan
partisi dinamis, partisi seperti
/system
adalah tumpukan perangkat berlapis:
- Di bagian bawah stack terdapat partisi super fisik (misalnya,
/dev/block/by-name/super
). - Di tengah adalah perangkat
dm-linear
, yang menentukan blok mana dalam superpartisi yang membentuk partisi dinamis yang diberikan. Ini akan muncul sebagai/dev/block/mapper/system_[a|b]
di perangkat A/B, atau/dev/block/mapper/system
di perangkat non-A/B. - Di bagian atas terdapat perangkat
dm-verity
, yang dibuat untuk partisi terverifikasi. Perangkat ini memverifikasi bahwa pemblokiran pada perangkatdm-linear
ditandatangani dengan benar. Tampilannya adalah/dev/block/mapper/system-verity
dan merupakan sumber titik pemasangan/system
.
Gambar 1 menunjukkan tampilan stack di bawah titik pemasangan /system
.
Gambar 1. Stack di bawah titik pemasangan /system
Snapshot terkompresi
Di Android 12 dan yang lebih baru, karena persyaratan ruang di
partisi /data
dapat tinggi, Anda dapat mengaktifkan snapshot terkompresi dalam
build untuk mengatasi persyaratan ruang yang lebih tinggi dari partisi /data
.
Snapshot terkompresi A/B virtual dibuat di atas komponen berikut yang tersedia di Android 12 dan yang lebih baru:
dm-user
, modul kernel yang mirip dengan FUSE yang memungkinkan userspace untuk mengimplementasikan perangkat blok.snapuserd
, daemon userspace untuk menerapkan format snapshot baru.
Komponen-komponen ini mengaktifkan kompresi. Perubahan lain yang diperlukan untuk menerapkan kemampuan snapshot yang dikompresi diberikan di bagian berikutnya: Format COW untuk snapshot yang dikompresi, dm-user, dan snapuserd.
Format COW untuk snapshot terkompresi
Di Android 12 dan yang lebih baru, snapshot yang dikompresi menggunakan format COW khusus Android. Format COW berisi metadata tentang OTA dan memiliki buffering yang berbeda yang berisi operasi COW dan data sistem operasi baru. Dibandingkan dengan format snapshot kernel yang hanya mengizinkan operasi replace (Ganti blok X dalam image dasar dengan konten blok Y dalam snapshot), format COW snapshot terkompresi Android lebih ekspresif dan mendukung operasi berikut:
- Salin: Blok X di perangkat dasar harus diganti dengan blok Y di perangkat dasar.
- Ganti: Blok X di perangkat dasar harus diganti dengan konten blok Y dalam snapshot. Setiap blok ini dikompresi gz.
- Nol: Blok X di perangkat dasar harus diganti dengan semua angka nol.
- XOR: Perangkat COW menyimpan byte yang dikompresi XOR antara blok X dan blok Y. (Tersedia di Android 13 dan yang lebih baru.)
Update OTA lengkap hanya terdiri dari operasi ganti dan nol. Update OTA inkremental juga dapat memiliki operasi salin.
Tata letak snapshot lengkap pada disk akan terlihat seperti ini:
Gambar 2. Format Android COW di Disk
dm-user
Modul kernel dm-user memungkinkan userspace
menerapkan perangkat blok
device-mapper. Entri tabel dm-user membuat perangkat lainnya di
/dev/dm-user/<control-name>
. Proses userspace
dapat melakukan polling pada perangkat untuk
menerima permintaan baca dan tulis dari kernel. Setiap permintaan memiliki buffer terkait bagi userspace untuk mengisi (untuk pembacaan) atau menyebarkan (untuk penulisan).
Modul kernel dm-user
menyediakan antarmuka baru yang terlihat oleh pengguna ke kernel
yang bukan bagian dari basis kode kernel.org upstream. Hingga saat itu, Google
berhak mengubah antarmuka dm-user
di Android.
snapuser
Komponen ruang pengguna snapuserd
ke dm-user
mengimplementasikan kompresi A/B
Virtual. Snapuserd adalah daemon ruang pengguna yang bertanggung jawab untuk menulis dan membaca
perangkat COW Android. Semua I/O ke snapshot harus melalui layanan ini.
Selama penginstalan OTA, data sistem operasi baru ditulis ke snapshot oleh
snapuserd (dengan kompresi). Pemrosesan metadata dan unpacking data blok
baru juga ditangani di sini.
Kompresi XOR
Untuk perangkat yang diluncurkan dengan Android 13 dan yang lebih tinggi, fitur kompresi XOR, yang diaktifkan secara default, memungkinkan snapshot ruang pengguna untuk menyimpan byte yang dikompresi XOR di antara blok lama dan blok baru. Jika hanya beberapa byte dalam blok yang diubah dalam update Virtual A/B, skema penyimpanan kompresi XOR akan menggunakan lebih sedikit ruang daripada skema penyimpanan default karena snapshot tidak menyimpan 4K byte penuh. Pengurangan ukuran snapshot ini mungkin karena data XOR berisi banyak nol dan lebih mudah dikompresi daripada data blok mentah. Di perangkat Pixel, kompresi XOR mengurangi ukuran snapshot sebesar 25% hingga 40%.
Untuk perangkat yang diupgrade ke Android 13 dan yang lebih tinggi, kompresi XOR harus diaktifkan. Untuk mengetahui detailnya, lihat kompresi XOR.
Penggabungan snapshot
Untuk perangkat yang diluncurkan dengan Android 13 dan yang lebih baru, proses snapshot dan penggabungan snapshot dalam kompresi Virtual A/B dilakukan
oleh komponen ruang pengguna snapuserd
. Untuk perangkat yang mengupgrade ke Android
13 dan yang lebih baru, fitur ini harus diaktifkan. Untuk
mengetahui detailnya, lihat Penggabungan
ruang pengguna.
Berikut ini penjelasan proses kompresi Virtual A/B:
- Framework ini memasang partisi
/system
dari perangkatdm-verity
, yang ditumpuk di atas perangkatdm-user
. Artinya, setiap I/O dari sistem file root akan dirutekan kedm-user
. dm-user
merutekan I/O ke daemonsnapuserd
ruang pengguna, yang menangani permintaan I/O.- Setelah operasi penggabungan selesai, framework akan menciutkan
dm-verity
di atasdm-linear
(system_base
) dan menghapusdm-user
.
Gambar 3. Proses kompresi A/B virtual
Proses penggabungan snapshot dapat terganggu. Jika perangkat dimulai ulang selama proses penggabungan, proses penggabungan akan dilanjutkan setelah dimulai ulang.
Transisi init
Saat melakukan booting dengan snapshot yang dikompresi, init tahap pertama harus memulai
snapuserd
untuk memasang partisi. Hal ini menimbulkan masalah: Saat sepolicy
dimuat
dan diterapkan, snapuserd
ditempatkan dalam konteks yang salah, dan permintaan bacanya
gagal, dengan penolakan selinux.
Untuk mengatasi hal ini, transisi snapuserd
dalam langkah kunci dengan init
, sebagai berikut:
init
tahap pertama meluncurkansnapuserd
dari ramdisk, dan menyimpan deskripsi file terbuka ke dalamnya dalam variabel lingkungan.init
tahap pertama mengalihkan sistem file root ke partisi sistem, lalu mengeksekusi salinan sisteminit
.- Salinan sistem
init
membaca sepolicy gabungan menjadi string. Init
memanggilmlock()
di semua halaman yang didukung ext4. Kemudian, tindakan ini akan menonaktifkan semua tabel device-mapper untuk perangkat snapshot, dan menghentikansnapuserd
. Setelah itu, Anda tidak boleh membaca dari partisi karena tindakan tersebut akan menyebabkan deadlock.- Dengan menggunakan deskripsi terbuka ke salinan ramdisk
snapuserd
,init
akan meluncurkan kembali daemon dengan konteks selinux yang benar. Tabel device-mapper untuk perangkat snapshot diaktifkan kembali. - Init memanggil
munlockall()
- aman untuk melakukan IO lagi.
Penggunaan ruang
Tabel berikut memberikan perbandingan penggunaan ruang untuk berbagai mekanisme OTA menggunakan ukuran OS dan OTA Pixel.
Dampak Ukuran | non-A/B | A/B | A/B Virtual | Virtual A/B (dikompresi) |
---|---|---|---|---|
Gambar Pabrik Asli | Super 4,5 GB (image 3,8 GB + 700 MB direservasi)1 | 9 GB super (3,8 GB + 700 MB dicadangkan, untuk dua slot) | Super 4,5 GB (gambar 3,8 G + 700 M dicadangkan) | Super 4,5 GB (gambar 3,8 G + 700 M dicadangkan) |
Partisi statis lainnya | /cache | Tidak ada | Tidak ada | Tidak ada |
Penyimpanan tambahan Selama OTA (ruang yang ditampilkan setelah menerapkan OTA) | 1,4 GB di /data | 0 | 3,8 GB2 di /data | 2,1 GB2 di /data |
Total penyimpanan yang diperlukan untuk menerapkan OTA | 5,9 GB3 (super dan data) | 9GB (super) | 8,3 GB3 (super dan data) | 6,6 GB3 (super dan data) |
1Menunjukkan tata letak yang diasumsikan berdasarkan pemetaan Pixel.
2Mengasumsikan image sistem baru memiliki ukuran yang sama dengan aslinya.
3Persyaratan ruang bersifat sementara hingga dimulai ulang.
A/B Virtual Android 11
Android 11 Virtual A/B menulis ke partisi dinamis menggunakan format COW Kernel. Metode ini pada akhirnya tidak digunakan lagi karena format Kernel COW tidak mendukung kompresi.
A/B Virtual Android 12
Di Android 12, kompresi didukung dalam bentuk format COW khusus
Android. Versi Virtual A/B ini memerlukan terjemahan COW khusus
Android ke format COW Kernel. Akhirnya, hal ini diganti di Android
13 yang menghapus ketergantungan pada format Kernel COW dan juga dm-snapshot
.
Untuk menerapkan Virtual A/B, atau menggunakan kemampuan snapshot yang dikompresi, lihat Menerapkan Virtual A/B