Google berkomitmen untuk memajukan ekuitas ras untuk komunitas kulit hitam. Lihat bagaimana.
Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Tata Letak Partisi

Di Android 10, sistem file root tidak lagi disertakan dalam ramdisk.img dan malah digabungkan ke system.img (yaitu, system.img selalu dibuat seolah-olah BOARD_BUILD_SYSTEM_ROOT_IMAGE disetel). Perangkat yang diluncurkan dengan Android 10:

  • Gunakan tata letak partisi sistem-as-root (secara otomatis ditegakkan oleh build tanpa opsi untuk mengubah perilaku).
  • Harus menggunakan ramdisk, yang diperlukan untuk dm-linear.
  • Harus menetapkan 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 langsung 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 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 ditingkatkan ke Android 9 dan untuk perangkat yang menjalankan versi Android yang lebih rendah. Dalam konfigurasi sistem-as-root Android 10, build selalu menggabungkan $TARGET_SYSTEM_OUT dan $TARGET_ROOT_OUT ke 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 userspace yang memungkinkan pembaruan over-the-air (OTA) untuk membuat, mengubah ukuran, atau menghancurkan partisi. Sebagai bagian dari perubahan ini, kernel Linux tidak lagi dapat me-mount 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 hanya sistem, memberikan panduan tentang memperbarui perangkat untuk menggunakan sistem-as-root (termasuk perubahan tata letak partisi dan persyaratan kernel dm-verity), dan perubahan detail untuk ramdisk di Android 10 .

Tentang OTA khusus sistem

OTA khusus sistem, yang memungkinkan rilis Android untuk memperbarui system.img dan product.img tanpa mengubah partisi lain, memerlukan tata letak partisi sistem-as-root. Semua perangkat yang menjalankan Android 10 harus menggunakan tata letak partisi sistem-as-root untuk mengaktifkan OTA hanya sistem.

  • Perangkat A / B, yang me-mount partisi system sebagai rootfs, sudah menggunakan sistem-as-root dan tidak memerlukan perubahan untuk mendukung sistem OTA.
  • Perangkat Non-A / B, yang memasang partisi system di /system , harus diperbarui untuk menggunakan tata letak partisi sistem-as-root untuk mendukung OTA sistem.

Untuk detail tentang perangkat A / B dan non-A / B, lihat Pembaruan Sistem A / B (Seamless) .

Menggunakan overlay vendor

Overlay vendor memungkinkan Anda untuk overlay perubahan ke partisi vendor pada saat boot perangkat. Overlay vendor adalah sekumpulan modul vendor di partisi product yang overlay pada partisi vendor saat perangkat melakukan booting, mengganti dan menambahkan ke modul yang ada.

Saat perangkat melakukan booting, proses init menyelesaikan tahap pertama pemasangan dan membaca properti default. Kemudian ia mencari /product/vendor_overlay/<target_vendor_version> dan /product/vendor_overlay/<target_vendor_version> -mount setiap subdirektori pada direktori partisi vendor terkait, jika kondisi berikut dipenuhi:

  • /vendor/<overlay_dir> ada.
  • /product/vendor_overlay/<target_vendor_version>/<overlay_dir> memiliki konteks file yang sama dengan /vendor/<overlay_dir> .
  • init diizinkan untuk me-mount 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 ketika perangkat melakukan boot, 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 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 dalam sepolicy khusus perangkat. Konteks file diatur pada level direktori. Jika konteks file direktori overlay vendor tidak cocok dengan direktori target, dan konteks file yang benar tidak ditentukan dalam sepolicy khusus perangkat, direktori overlay vendor tidak dilapis ke direktori target.

Untuk menggunakan overlay vendor, kernel harus mengaktifkan OverlayFS dengan menetapkan CONFIG_OVERLAY_FS=y . Juga, kernel harus digabung 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 menutupi direktori /vendor/lib/* , /vendor/etc/* , dan /vendor/app/* .

  1. Tambahkan file vendor prebuilt 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 prebuilt 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. Tetapkan konteks file jika file partisi vendor target memiliki konteks selain vendor_file . Karena /vendor/lib/* menggunakan konteks vendor_file , contoh ini tidak termasuk direktori itu.

    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 untuk memasang overlay vendor pada konteks file selain dari vendor_file . Karena proses init sudah memiliki izin untuk memasang 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 overlay vendor

Untuk memvalidasi konfigurasi overlay vendor, tambahkan file di /product/vendor_overlay/<target_vendor_version>/<overlay_dir> dan periksa apakah file overlay pada file di /vendor/<overlay_dir> .

Untuk userdebug , ada modul tes untuk Atest :

$ atest -v fs_mgr_vendor_overlay_test

Memperbarui ke sistem-as-root

Untuk memperbarui perangkat non-A / B untuk menggunakan sistem-as-root, Anda harus memperbarui skema partioning untuk boot.img dan system.img , mengatur 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 menjaga partisi /recovery terpisah karena mereka 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 merupakan partisi terpisah dari /boot untuk perangkat non-A / B, yang menyiratkan bahwa gambar pemulihan akan terus diperbarui dengan cara yang ditunda (yaitu, sama seperti di 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) System-as-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 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)
    ...

Partisi itu sendiri tidak berubah; ramdisk dan sistem-as-root menggunakan skema partisi berikut:

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

Menyiapkan dm-verity

Dalam system-as-root, kernel harus me-mount system.img bawah / (mount point) dengan dm-verity . AOSP mendukung implementasi dm-verity berikut untuk system.img .

vboot 1.0

Untuk vboot 1.0 , kernel harus menguraikan metadata khusus Android pada /system , kemudian mengonversi ke params dm-verity untuk mengatur dm-verity (memerlukan tambalan 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 eksternal / avb / libavb , yang kemudian mem-parsing deskriptor hashtree untuk /system , mengkonversinya ke params dm-verity , dan akhirnya meneruskan params ke kernel melalui baris perintah kernel. (Penjelas Hashtree dari /system mungkin di /vbmeta atau on /system itu sendiri.)

vboot 2.0 membutuhkan 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 sistem-as-root, setelah gambar sistem umum (GSI) di -flash pada perangkat (dan sebelum menjalankan tes Vendor Test Suite ), folder root khusus perangkat yang ditambahkan dengan BOARD_ROOT_EXTRA_FOLDERS hilang karena seluruh isi direktori root telah diganti oleh sistem-as-root GSI. Penghapusan folder ini dapat menyebabkan perangkat menjadi tidak dapat di-boot jika ada ketergantungan pada folder root khusus perangkat (misalnya, mereka 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). Poin pemasangan khusus vendor ini dapat ditentukan secara 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).

Ramdisk

Di Android 10, ramdisk tahap pertama berisi biner init tahap pertama (yang melakukan pemasangan awal seperti yang ditentukan oleh entri fstab) dan file vendor fstab. (Seperti pada Android 9, system.img berisi konten $TARGET_ROOT_OUT .)

  • Untuk perangkat dengan boot-ramdisk (non-A / B), init tahap pertama adalah executable statis yang terletak di /init . Perangkat-perangkat ini memasang system.img sebagai /system , kemudian melakukan operasi root switch untuk memindahkan mount di /system ke / . Isi ramdisk dibebaskan setelah pemasangan selesai.
  • Untuk perangkat yang menggunakan pemulihan sebagai ramdisk, init tahap pertama terletak di /init di dalam ramdisk pemulihan. Perangkat-perangkat ini pertama-tama memindahkan root ke /first_stage_ramdisk untuk menghapus komponen pemulihan dari lingkungan, kemudian melanjutkan sama dengan perangkat dengan boot-ramdisk (yaitu, mount system.img sebagai /system , alihkan root untuk memindahkan mount itu ke / , dan isi ramdisk gratis setelah pemasangan). Jika androidboot.force_normal_boot=1 hadir di baris perintah kernel, perangkat boot normal (ke Android) alih-alih boot ke mode pemulihan.

Setelah init tahap pertama selesai, ia mengeksekusi /system/bin/init dengan argumen selinux_setup untuk mengkompilasi dan memuat SELinux ke sistem. Akhirnya, init mengeksekusi /system/bin/init lagi dengan argumen second_stage . Pada titik ini, fase utama init berjalan dan melanjutkan proses boot menggunakan skrip init.rc

Layout partisi (perangkat non-A / B)

Bagian berikut merinci perbedaan dalam tata letak partisi untuk perangkat non-A / B sebelum dan sesudah Android 10.

boot.img

Ramdisk
(Android 8.x dan lebih rendah)
Sistem sebagai root
(Android 9)
Ramdisk
(Android 10)

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.

Berisi kernel dan ramdisk.img .

ramdisk.img
  -/
    - init
    - vendor fstab files
    - system/ (mount point)
    - vendor/ (mount point)
    - odm/ (mount point)
    ...
    

recovery.img

Berisi kernel pemulihan dan ramdisk.img pemulihan

system.img

Ramdisk
(Android 8.x dan lebih rendah)
Sistem sebagai root
(Android 9)
Ramdisk
(Android 10)

Berisi system.img .

system.img
  -/
    - bin/
    - etc
    - vendor -> /vendor
    - ...
   

Berisi konten yang digabung dari $TARGET_SYSTEM_OUT dan $TARGET_ROOT_OUT .

system.img
  -/
    - init.rc
    - init
    - etc -> /system/etc
    - system/
      - bin/
      - etc/
      - vendor -> /vendor
      - ...
    - vendor/ (mount point)
    - odm/ (mount point)
    ...
    

Berisi konten yang digabung dari $TARGET_SYSTEM_OUT dan $TARGET_ROOT_OUT .

system.img
  -/
    - init.rc
    - init -> /system/bin/init
    - etc -> /system/etc
    - system/
      - bin/
      - etc/
      - vendor -> /vendor
      - ...
    - vendor/ (mount point)
    - odm/ (mount point)
    ...
    

Layout partisi (perangkat A / B)

Bagian berikut merinci perbedaan dalam tata letak partisi untuk perangkat A / B sebelum dan sesudah Android 10.

boot.img

Sistem sebagai root
(Android 9)
Ramdisk
(Android 10)
Berisi kernel boot normal dan recovery-ramdisk ( BOARD_USES_RECOVERY_AS_BOOT := true ).

Recovery-ramdisk hanya digunakan untuk boot ke pemulihan.
Berisi kernel boot normal dan recovery-ramdisk ( BOARD_USES_RECOVERY_AS_BOOT := true ).

Recovery-ramdisk digunakan untuk mem-boot ke pemulihan dan Android.
ramdisk.img
  -/
    - init -> /system/bin/init
    - first_stage_ramdisk
       - vendor fstab files
    - etc -> /system/etc
    - system/ (mount point)
    - vendor/ (mount point)
    - odm/ (mount point)
    ...
    

system.img

Berisi konten yang digabung dari $TARGET_SYSTEM_OUT dan $TARGET_ROOT_OUT .

system.img
  -/
    - init.rc
    - init -> /system/bin/init
    - etc -> /system/etc
    - system/
      - bin/
      - etc/
      - vendor -> /vendor
      - ...
    - vendor/ (mount point)
    - odm/ (mount point)
    ...