Di Android 10, sistem file root tidak lagi disertakan dalam ramdisk.img
dan malah digabungkan ke dalam system.img
(artinya, system.img
selalu dibuat seolah-olah BOARD_BUILD_SYSTEM_ROOT_IMAGE
telah disetel). Perangkat yang diluncurkan dengan Android 10:
- Gunakan tata letak partisi sistem sebagai root (secara otomatis diterapkan oleh build tanpa opsi untuk mengubah perilaku).
- Harus menggunakan ramdisk, yang diperlukan untuk dm-linear.
- Harus menyetel
BOARD_BUILD_SYSTEM_ROOT_IMAGE
kefalse
. Pengaturan ini digunakan hanya untuk membedakan antara perangkat yang menggunakan ramdisk dan perangkat yang tidak menggunakan ramdisk (dan sebagai gantinya me-mountsystem.img
secara langsung).
Arti konfigurasi sistem sebagai root berbeda antara Android 9 dan Android 10. Dalam konfigurasi sistem sebagai root Android 9, BOARD_BUILD_SYSTEM_ROOT_IMAGE
disetel ke true
, yang memaksa build menggabungkan sistem file root ke system.img
lalu pasang system.img
sebagai sistem file root (rootfs). Konfigurasi ini wajib untuk perangkat yang diluncurkan dengan Android 9 namun bersifat opsional untuk perangkat yang diupgrade ke Android 9 dan untuk perangkat yang menjalankan versi Android lebih rendah. Dalam konfigurasi sistem sebagai root Android 10, build selalu menggabungkan $TARGET_SYSTEM_OUT
dan $TARGET_ROOT_OUT
ke dalam system.img
; konfigurasi ini adalah perilaku default untuk semua perangkat yang menjalankan Android 10.
Android 10 melakukan perubahan lebih lanjut untuk mendukung partisi dinamis , sistem partisi ruang pengguna yang memungkinkan pembaruan over-the-air (OTA) untuk membuat, mengubah ukuran, atau menghancurkan partisi. Sebagai bagian dari perubahan ini, kernel Linux tidak dapat lagi memasang partisi sistem logis pada perangkat yang menjalankan Android 10, sehingga operasi ini ditangani oleh init tahap pertama.
Bagian berikut menjelaskan persyaratan sistem sebagai root untuk OTA khusus sistem, memberikan panduan tentang memperbarui perangkat untuk menggunakan sistem sebagai root (termasuk perubahan tata letak partisi dan persyaratan kernel dm-verity). Untuk detail tentang perubahan pada ramdisk, lihat Partisi Ramdisk .
Tentang OTA khusus sistem
OTA khusus sistem, yang memungkinkan rilis Android memperbarui system.img
dan product.img
tanpa mengubah partisi lain, memerlukan tata letak partisi sistem sebagai root. Semua perangkat yang menjalankan Android 10 harus menggunakan tata letak partisi sistem sebagai root untuk mengaktifkan OTA khusus sistem.
- Perangkat A/B, yang memasang partisi
system
sebagai rootfs, sudah menggunakan sistem-sebagai-root dan tidak memerlukan perubahan untuk mendukung OTA sistem. - Perangkat non-A/B, yang memasang partisi
system
di/system
, harus diperbarui untuk menggunakan tata letak partisi sistem sebagai root untuk mendukung OTA sistem.
Untuk detail tentang perangkat A/B dan non-A/B, lihat Pembaruan Sistem A/B (Seamless) .
Menggunakan hamparan vendor
Hamparan vendor memungkinkan Anda untuk melapisi perubahan pada partisi vendor
pada saat boot perangkat. Vendor overlay adalah sekumpulan modul vendor di partisi product
yang di-overlay pada partisi vendor
saat perangkat melakukan booting, mengganti dan menambah modul yang sudah ada.
Saat perangkat melakukan booting, proses init
menyelesaikan pemasangan tahap pertama dan membaca properti default. Kemudian ia mencari /product/vendor_overlay/<target_vendor_version>
dan memasang setiap subdirektori pada direktori partisi vendor
yang sesuai, jika kondisi berikut terpenuhi:
-
/vendor/<overlay_dir>
ada. -
/product/vendor_overlay/<target_vendor_version>/<overlay_dir>
memiliki konteks file yang sama dengan/vendor/<overlay_dir>
. -
init
diperbolehkan untuk dipasang pada konteks file/vendor/<overlay_dir>
.
Menerapkan overlay vendor
Instal file overlay vendor di /product/vendor_overlay/<target_vendor_version>
. File-file tersebut melapisi partisi vendor
saat perangkat melakukan booting, mengganti file dengan nama yang sama dan menambahkan file baru. Hamparan vendor tidak dapat menghapus file dari partisi vendor
.
File overlay vendor harus memiliki konteks file yang sama dengan file target yang diganti di partisi vendor
. Secara default, file di direktori /product/vendor_overlay/<target_vendor_version>
memiliki konteks vendor_file
. Jika ada ketidakcocokan konteks file antara file overlay vendor dan file yang diganti, tentukan hal tersebut dalam kebijakan khusus perangkat. Konteks file diatur pada tingkat direktori. Jika konteks file direktori overlay vendor tidak cocok dengan direktori target, dan konteks file yang benar tidak ditentukan dalam kebijakan khusus perangkat, direktori overlay vendor tersebut tidak di-overlay ke direktori target.
Untuk menggunakan vendor overlay, kernel harus mengaktifkan OverlayFS dengan mengatur CONFIG_OVERLAY_FS=y
. Selain itu, kernel harus digabungkan dari kernel umum 4.4 atau lebih baru, atau ditambal dengan "overlayfs: override_creds=off option bypass creator_cred"
.
Contoh penerapan overlay vendor
Prosedur ini menunjukkan penerapan overlay vendor yang melapisi direktori /vendor/lib/*
, /vendor/etc/*
, dan /vendor/app/*
.
Tambahkan file vendor bawaan di
device/<vendor>/<target>/vendor_overlay/<target_vendor_version>/
:device/google/device/vendor_overlay/28/lib/libfoo.so device/google/device/vendor_overlay/28/lib/libbar.so device/google/device/vendor_overlay/28/etc/baz.xml device/google/device/vendor_overlay/28/app/qux.apk
Instal file vendor bawaan ke
product/vendor_overlay
didevice/google/device/device.mk
:PRODUCT_COPY_FILES += \ $(call find-copy-subdir-files,*,device/google/device/vendor_overlay,$(TARGET_COPY_OUT_PRODUCT)/vendor_overlay)
Tentukan konteks file jika file partisi
vendor
target memiliki konteks selainvendor_file
. Karena/vendor/lib/*
menggunakan konteksvendor_file
, contoh ini tidak menyertakan direktori tersebut.Tambahkan yang berikut ke
device/google/device-sepolicy/private/file_contexts
:/(product|system/product)/vendor_overlay/[0-9]+/etc(/.*)? u:object_r:vendor_configs_file:s0 /(product|system/product)/vendor_overlay/[0-9]+/app(/.*)? u:object_r:vendor_app_file:s0
Izinkan proses
init
memasang overlay vendor pada konteks file selainvendor_file
. Karena prosesinit
sudah memiliki izin untuk dipasang pada konteksvendor_file
, contoh ini tidak menentukan kebijakan untukvendor_file
.Tambahkan yang berikut ke
device/google/device-sepolicy/public/init.te
:allow init vendor_configs_file:dir mounton; allow init vendor_app_file:dir mounton;
Memvalidasi hamparan vendor
Untuk memvalidasi konfigurasi overlay vendor, tambahkan file di /product/vendor_overlay/<target_vendor_version>/<overlay_dir>
dan periksa apakah file tersebut di-overlay pada file di /vendor/<overlay_dir>
.
Untuk build userdebug
, ada modul pengujian untuk Atest :
$ atest -v fs_mgr_vendor_overlay_test
Memperbarui ke sistem sebagai root
Untuk memperbarui perangkat non-A/B agar menggunakan system-as-root, Anda harus memperbarui skema partisi untuk boot.img
dan system.img
, menyiapkan dm-verity, dan menghapus semua dependensi boot pada folder root khusus perangkat.
Memperbarui partisi
Tidak seperti perangkat A/B yang menggunakan kembali /boot
sebagai partisi pemulihan , perangkat non-A/B harus memisahkan partisi /recovery
karena perangkat tersebut tidak memiliki partisi slot cadangan (misalnya, dari boot_a
ke boot_b
). Jika /recovery
dihapus pada perangkat non-A/B dan dibuat serupa dengan skema A/B, mode pemulihan dapat rusak selama pembaruan yang gagal pada partisi /boot
. Oleh karena itu, partisi /recovery
harus merupakan partisi terpisah dari /boot
untuk perangkat non-A/B, yang berarti bahwa image pemulihan akan terus diperbarui secara tertunda (yaitu, sama seperti pada perangkat yang menjalankan Android 8.1.0 atau lebih rendah).
Tabel berikut mencantumkan perbedaan partisi gambar untuk perangkat non-A/B sebelum dan sesudah Android 9.
Gambar | Ramdisk (sebelum 9) | Sistem-sebagai-root (setelah 9) |
---|---|---|
boot.img | Berisi kernel dan ramdisk.img : ramdisk.img -/ - init.rc - init - etc -> /system/etc - system/ (mount point) - vendor/ (mount point) - odm/ (mount point) ... | Berisi kernel boot normal saja. |
recovery.img | Berisi kernel pemulihan dan ramdisk.img pemulihan. | |
system.img | Berisi yang berikut ini: system.img -/ - bin/ - etc - vendor -> /vendor - ... | Berisi konten gabungan dari system.img asli dan ramdisk.img : system.img -/ - init.rc - init - etc -> /system/etc - system/ - bin/ - etc/ - vendor -> /vendor - ... - vendor/ (mount point) - odm/ (mount point) ... |
Partisinya sendiri tidak berubah; baik ramdisk dan system-as-root menggunakan skema partisi berikut:
-
/boot
-
/system
-
/system
-
/recovery
-
/vendor
, dll.
Menyiapkan dm-veritas
Di system-as-root, kernel harus memasang system.img
di bawah /
(mount point) dengan dm-verity . AOSP mendukung implementasi dm-verity berikut untuk system.img
.
vboot 1.0
Untuk vboot 1.0 , kernel harus mengurai metadata khusus Android di /system
, lalu mengonversi ke parameter dm-verity untuk menyiapkan dm-verity (memerlukan patch kernel ini ). Contoh berikut menunjukkan pengaturan terkait dm-verity untuk system-as-root di baris perintah kernel:
ro root=/dev/dm-0 rootwait skip_initramfs init=/init dm="system none ro,0 1 android-verity /dev/sda34" veritykeyid=id:7e4333f9bba00adfe0ede979e28ed1920492b40f
vboot 2.0
Untuk vboot 2.0 ( AVB ), bootloader harus mengintegrasikan external/avb/libavb , yang kemudian mem-parsing deskriptor hashtree untuk /system
, mengubahnya menjadi dm-verity params , dan akhirnya meneruskan params ke kernel melalui baris perintah kernel. (Deskriptor Hashtree dari /system
mungkin ada di /vbmeta
atau di /system
itu sendiri.)
vboot 2.0 memerlukan patch kernel berikut:
- https://android-review.googlesource.com/#/c/kernel/common/+/158491/
- patch kernel 4.4 , patch kernel 4.9 , dll.
Contoh berikut menunjukkan pengaturan terkait dm-verity untuk system-as-root di baris perintah kernel:
ro root=/dev/dm-0 rootwait skip_initramfs init=/init dm="1 vroot none ro 1,0 5159992 verity 1 PARTUUID=00000016-0000-0000-0000-000000000000 PARTUUID=00000016-0000-0000-0000-000000000000 4096 4096 644999 644999 sha1 d80b4a8be3b58a8ab86fad1b498640892d4843a2 8d08feed2f55c418fb63447fec0d32b1b107e42c 10 restart_on_corruption ignore_zero_blocks use_fec_from_device PARTUUID=00000016-0000-0000-0000-000000000000 fec_roots 2 fec_blocks 650080 fec_start 650080"
Menggunakan folder root khusus perangkat
Dengan system-as-root, setelah image sistem generik (GSI) di-flash pada perangkat (dan sebelum menjalankan pengujian Vendor Test Suite ), semua folder root khusus perangkat yang ditambahkan dengan BOARD_ROOT_EXTRA_FOLDERS
akan hilang karena seluruh konten direktori root telah diganti oleh GSI sistem sebagai root. Penghapusan folder ini mungkin menyebabkan perangkat menjadi tidak dapat di-boot jika ada ketergantungan pada folder akar khusus perangkat (misalnya, folder tersebut digunakan sebagai titik pemasangan).
Untuk menghindari masalah ini, jangan gunakan BOARD_ROOT_EXTRA_FOLDERS
untuk menambahkan folder root khusus perangkat. Jika Anda perlu menentukan titik pemasangan khusus perangkat, gunakan /mnt/vendor/<mount point>
(ditambahkan dalam daftar perubahan ini). Titik pemasangan khusus vendor ini dapat ditentukan langsung di pohon perangkat fstab
(untuk pemasangan tahap pertama) dan file /vendor/etc/fstab.{ro.hardware}
tanpa pengaturan tambahan (karena fs_mgr
membuatnya di bawah /mnt/vendor/*
secara otomatis).