Tata Letak Partisi

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 ke false . Pengaturan ini digunakan hanya untuk membedakan antara perangkat yang menggunakan ramdisk dan perangkat yang tidak menggunakan ramdisk (dan sebagai gantinya me-mount system.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.

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

  1. 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
    
  2. Instal file vendor bawaan ke product/vendor_overlay di 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. Tentukan konteks file jika file partisi vendor target memiliki konteks selain vendor_file . Karena /vendor/lib/* menggunakan konteks vendor_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
    
  4. Izinkan proses init memasang overlay vendor pada konteks file selain vendor_file . Karena proses init sudah memiliki izin untuk dipasang pada konteks vendor_file , contoh ini tidak menentukan kebijakan untuk vendor_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:

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