Tata letak partisi

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 ke false. Setelan ini hanya digunakan untuk membedakan perangkat yang menggunakan ramdisk dan perangkat yang tidak menggunakan {i> ramdisk<i} (dan sebagai gantinya memasang system.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.

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/*.

  1. 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
    
  2. Instal file vendor bawaan ke product/vendor_overlay inci device/google/device/device.mk:

    PRODUCT_COPY_FILES += \
        $(call find-copy-subdir-files,*,device/google/device/vendor_overlay,$(TARGET_COPY_OUT_PRODUCT)/vendor_overlay)
    
  3. Menentukan konteks file jika file partisi vendor target memiliki konteks selain vendor_file. Karena /vendor/lib/* menggunakan konteks vendor_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
    
  4. Izinkan proses init untuk memasang overlay vendor di file konteks selain vendor_file. Karena init proses sudah memiliki izin untuk dipasang pada konteks vendor_file, contoh ini tidak menetapkan kebijakan untuk vendor_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:

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