Tata Letak Partisi

Di Android 10, sistem file root tidak lagi disertakan dalam ramdisk.img dan malah digabungkan ke dalam system.img (yaitu, system.img selalu dibuat seolah-olah BOARD_BUILD_SYSTEM_ROOT_IMAGE telah disetel). Perangkat 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 hanya digunakan untuk membedakan antara perangkat yang menggunakan ramdisk dan perangkat yang tidak menggunakan ramdisk (dan sebagai gantinya memasang system.img secara langsung).

Arti konfigurasi system-as-root berbeda antara Android 9 dan Android 10. Dalam konfigurasi system-as-root Android 9, BOARD_BUILD_SYSTEM_ROOT_IMAGE disetel ke true , yang memaksa build untuk menggabungkan sistem file root ke system.img lalu mount system.img sebagai sistem file root (rootfs). Konfigurasi ini wajib untuk perangkat yang diluncurkan dengan Android 9 tetapi opsional untuk perangkat yang diupgrade ke Android 9 dan untuk perangkat yang menjalankan Android versi 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 membuat 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, jadi 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 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

Overlay vendor memungkinkan Anda untuk overlay perubahan pada partisi vendor pada saat boot perangkat. Overlay vendor adalah satu set modul vendor di partisi product yang dihamparkan di partisi vendor saat perangkat melakukan booting, mengganti dan menambah modul yang 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 diizinkan 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 menutupi partisi vendor saat perangkat melakukan booting, mengganti 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 mereka ganti di partisi vendor . Secara default, file dalam 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 itu 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 overlay ke direktori target.

Untuk menggunakan overlay vendor, kernel harus mengaktifkan OverlayFS dengan menyetel CONFIG_OVERLAY_FS=y . Selain itu, kernel harus digabungkan dari kernel umum 4.4 atau yang lebih baru, atau ditambal dengan "overlayfs: override_creds=off option bypass creator_cred" .

Contoh implementasi 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 ini 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 pada konteks file selain vendor_file . Karena proses init sudah memiliki izin untuk me-mount pada konteks vendor_file , contoh ini tidak mendefinisikan kebijakan untuk vendor_file .

    Tambahkan yang berikut ini 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 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 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 ke partisi /boot . Untuk alasan ini, partisi /recovery harus menjadi partisi terpisah dari /boot untuk perangkat non-A/B, yang menyiratkan bahwa gambar pemulihan akan terus diperbarui dengan cara yang ditangguhkan (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:
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; baik ramdisk dan system-as-root menggunakan skema partisi berikut:

  • /boot
  • /system
  • /system
  • /recovery
  • /vendor , dll.

Menyiapkan dm-verity

Di system-as-root, kernel harus me-mount 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 pada /system , lalu mengonversi ke params 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 params dm-verity , dan akhirnya meneruskan params ke kernel melalui baris perintah kernel. (Descriptor 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 gambar 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 hilang karena seluruh konten direktori root telah diganti oleh sistem-sebagai-root GSI. Penghapusan folder ini dapat 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 secara langsung di pohon perangkat fstab (untuk pemasangan tahap pertama) dan file /vendor/etc/fstab.{ro.hardware} tanpa penyiapan tambahan (karena fs_mgr membuatnya di bawah /mnt/vendor/* secara otomatis).