Di Android 10, sistem file root tidak lagi
disertakan dalam ramdisk.img
dan digabungkan menjadi
system.img
(yaitu, system.img
selalu dibuat sebagai
jika BOARD_BUILD_SYSTEM_ROOT_IMAGE
ditetapkan). Perangkat
peluncuran dengan Android 10:
- Gunakan tata letak partisi sistem-sebagai-root (secara otomatis diberlakukan oleh build tanpa opsi untuk mengubah perilaku).
- Harus menggunakan ramdisk, yang diperlukan untuk dm-linear.
- Harus menetapkan
BOARD_BUILD_SYSTEM_ROOT_IMAGE
kefalse
. Setelan ini hanya digunakan untuk membedakan perangkat yang menggunakan ramdisk dan perangkat yang tidak menggunakan {i> ramdisk<i} (dan sebagai gantinya memasangsystem.img
secara langsung).
Arti konfigurasi sistem sebagai root berbeda antara Android 9 dan
Android 10. Dalam sistem Android 9 sebagai root
konfigurasi, BOARD_BUILD_SYSTEM_ROOT_IMAGE
disetel ke
true
, yang memaksa build untuk menggabungkan sistem file root menjadi
system.img
lalu pasang system.img
sebagai file root
{i>system <i}(rootfs). Konfigurasi ini wajib untuk perangkat
diluncurkan dengan Android 9, tetapi bersifat opsional untuk perangkat yang diupgrade ke
Android 9 dan untuk perangkat yang menjalankan versi Android lebih rendah. Di Android
10 konfigurasi sistem sebagai root, build selalu
menggabungkan $TARGET_SYSTEM_OUT
dan $TARGET_ROOT_OUT
menjadi
system.img
; konfigurasi ini adalah perilaku default untuk semua perangkat
menjalankan Android 10.
Android 10 membuat perubahan lebih lanjut pada dukungan partisi dinamis, sistem partisi {i>userspace<i} yang memungkinkan pembaruan {i>over-the-air<i} (OTA) untuk membuat, mengubah ukuran, atau menghancurkan partisi. Sebagai bagian dari perubahan ini, {i>kernel<i} tidak lagi dapat memasang partisi sistem logis pada perangkat yang menjalankan Android 10, sehingga operasi ini ditangani oleh init tahap.
Bagian berikut menjelaskan persyaratan sistem sebagai root untuk OTA khusus sistem, memberikan panduan tentang cara mengupdate perangkat untuk menggunakan sistem-sebagai-root (termasuk perubahan tata letak partisi dan persyaratan kernel dm-verity). Sebagai detail perubahan pada ramdisk, lihat Ramdisk Partisi.
Tentang OTA khusus sistem
OTA khusus sistem, yang memungkinkan update rilis Android
system.img
dan product.img
tanpa mengubah lainnya
membutuhkan tata letak partisi
sistem sebagai {i>root<i}. Semua perangkat yang menjalankan Android
10 harus menggunakan tata letak partisi
sistem sebagai {i>root<i} untuk
mengaktifkan OTA khusus sistem.
- Perangkat A/B, yang memasang partisi
system
sebagai {i>rootf<i}, sudah menggunakan {i>system-as-root<i} dan tidak memerlukan perubahan untuk mendukung OTA sistem. - Perangkat non-A/B, yang memasang partisi
system
di/system
, harus diupdate agar dapat digunakan tata letak partisi sistem sebagai root untuk mendukung OTA sistem.
Untuk mengetahui detail tentang perangkat A/B dan non-A/B, lihat Update Sistem A/B (mulus).
Menggunakan overlay vendor (<=AOSP 14)
Overlay vendor memungkinkan Anda menempatkan perubahan ke vendor
partisi pada saat {i>booting<i} perangkat. Overlay vendor adalah
serangkaian modul vendor di
partisi product
yang ditempatkan di vendor
partisi ketika perangkat melakukan {i>booting<i}, menggantikan
dan menambahkan ke modul yang ada.
Saat perangkat melakukan booting, proses init
akan menyelesaikan proses pertama
pemasangan panggung dan membaca properti {i>default<i}. Kemudian mencari
/product/vendor_overlay/<target_vendor_version>
dan dudukan
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
diizinkan untuk dipasang pada konteks file/vendor/<overlay_dir>
.
Mengimplementasikan overlay vendor
Instal file overlay vendor di
/product/vendor_overlay/<target_vendor_version>
. File tersebut
menempatkan partisi vendor
saat perangkat melakukan booting, yang menggantikan file
dengan nama yang sama dan
menambahkan file baru. Overlay 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 {i>default<i}, file dalam
Direktori /product/vendor_overlay/<target_vendor_version>
memiliki konteks vendor_file
. Jika ada ketidakcocokan konteks file
antara file {i>overlay<i} vendor dan file yang mereka ganti, tentukan hal itu di
kebijakan privasi perangkat tertentu. Konteks file ditetapkan di level direktori. Jika
konteks file direktori overlay vendor
tidak cocok dengan direktori target,
dan konteks file yang benar tidak disebutkan
dalam kebijakan khusus perangkat,
direktori overlay vendor itu tidak
ditempatkan ke direktori target.
Untuk menggunakan overlay vendor, kernel harus mengaktifkan OverlayFS dengan menyetel
CONFIG_OVERLAY_FS=y
. Selain itu, {i>kernel<i} harus digabungkan dari
kernel umum 4.4 atau yang lebih baru, atau di-patch dengan "overlayfs:
override_creds=off option bypass creator_cred"
.
Contoh penerapan overlay vendor
Prosedur ini menunjukkan penerapan sebuah {i>overlay<i} vendor yang menempatkan
direktori /vendor/lib/*
, /vendor/etc/*
, dan
/vendor/app/*
.
-
Menambahkan 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
incidevice/google/device/device.mk
:PRODUCT_COPY_FILES += \ $(call find-copy-subdir-files,*,device/google/device/vendor_overlay,$(TARGET_COPY_OUT_PRODUCT)/vendor_overlay)
-
Menentukan konteks file jika file partisi
vendor
target memiliki konteks selainvendor_file
. Karena/vendor/lib/*
menggunakan konteksvendor_file
, yaitu contoh tidak menyertakan direktori tersebut.Tambahkan kode 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
untuk memasang overlay vendor di file konteks selainvendor_file
. Karenainit
proses sudah memiliki izin untuk dipasang pada konteksvendor_file
, contoh ini tidak menetapkan kebijakan untukvendor_file
.Tambahkan kode berikut ke
device/google/device-sepolicy/public/init.te
:allow init vendor_configs_file:dir mounton; allow init vendor_app_file:dir mounton;
Validasi overlay vendor
Untuk memvalidasi konfigurasi overlay vendor, tambahkan file di
/product/vendor_overlay/<target_vendor_version>/<overlay_dir>
dan periksa apakah file
ditempatkan pada file di
/vendor/<overlay_dir>
.
Untuk build userdebug
, terdapat modul pengujian untuk Atest:
$ atest -v fs_mgr_vendor_overlay_test
Mengupdate ke sistem-sebagai-root
Untuk mengupdate perangkat non-A/B agar menggunakan system-as-root, Anda harus mengupdate
skema partisi untuk boot.img
dan system.img
, disetel
up dm-verity, dan menghapus semua dependensi booting pada root khusus perangkat
folder.
Mengupdate partisi
Tidak seperti perangkat A/B yang memodifikasi /boot
sebagai
partisi recovery,
perangkat non-A/B harus mempertahankan partisi /recovery
terpisah karena tidak memiliki partisi slot penggantian (misalnya,
dari boot_a
hingga boot_b
). Jika /recovery
adalah
dihapus pada perangkat non-A/B dan dibuat serupa dengan skema A/B, mode pemulihan,
dapat rusak saat update gagal pada partisi /boot
. Sebagai
alasan ini, partisi /recovery
harus berupa
partisi terpisah dari /boot
untuk perangkat non-A/B, yang berarti
bahwa citra pemulihan terus diperbarui
dengan cara yang ditangguhkan (yang
sama seperti di perangkat yang menjalankan Android 8.1.0 atau yang lebih rendah).
Tabel berikut mencantumkan perbedaan partisi image untuk perangkat non-A/B sebelum dan sesudah Android 9.
Gambar | Ramdisk (sebelum pukul 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) ... |
Hanya berisi kernel boot normal. |
recovery.img |
Berisi kernel pemulihan dan pemulihan
ramdisk.img . |
|
system.img |
Berisi hal berikut:
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) ... |
Partisi itu sendiri tidak berubah; penggunaan ramdisk dan sistem-sebagai root skema partisi berikut:
/boot
/system
/system
/recovery
/vendor
, dll.
Siapkan dm-verity
Di sistem-sebagai-root, kernel harus memasang system.img
di
/
(titik pemasangan) dengan
kebenaran dm. AOSP mendukung dm-verity berikut
implementasi untuk system.img
.
vboot 1.0
Untuk vboot 1.0, kernel harus mengurai
Khusus Android
metadata aktif
/system
, lalu konversi menjadi
parameter dm-verity untuk menyiapkan dm-verity (memerlukan
patch kernel ini).
Contoh berikut menunjukkan setelan terkait dm-verity untuk sistem-sebagai-root di
{i>kernel command line<i}:
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 terintegrasi
external/avb/libavb, yang kemudian mengurai
deskriptor hashtree untuk /system
, mengonversi
ke
parameter dm-verity, dan terakhir meneruskan parameter tersebut ke
{i>kernel<i} melalui baris perintah {i>kernel<i}. (Deskripsi hashtree dari /system
mungkin 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 setelan terkait dm-verity untuk sistem-sebagai-root di {i>kernel command line<i}:
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"
Gunakan folder root khusus perangkat
Dengan system-as-root, setelah Generic System Image (GSI)
(GSI) di-flash di perangkat (dan sebelum dijalankan
pengujian Vendor Test Suite), setiap
folder root khusus perangkat ditambahkan dengan BOARD_ROOT_EXTRA_FOLDERS
hilang karena seluruh isi
direktori {i>root<i} telah diganti dengan
GSI sistem sebagai root. Penghapusan folder ini dapat menyebabkan perangkat
menjadi tidak dapat di-booting jika terdapat dependensi pada folder root khusus perangkat
(misalnya, digunakan sebagai titik pemasangan).
Untuk menghindari masalah ini, jangan gunakan BOARD_ROOT_EXTRA_FOLDERS
untuk
tambahkan folder {i>root<i} khusus perangkat. Jika Anda perlu menentukan pemasangan khusus perangkat
poin, gunakan /mnt/vendor/<mount point>
(ditambahkan dalam
daftar perubahan). Titik pemasangan khusus
vendor ini dapat
ditentukan langsung dalam kedua hierarki perangkat fstab
(untuk tahap pertama
pemasangan) dan file /vendor/etc/fstab.{ro.hardware}
tanpa
penyiapan tambahan (karena fs_mgr
membuatnya di
/mnt/vendor/*
secara otomatis).