Pemasangan Partisi Lebih Awal

Perangkat berkemampuan treble harus mengaktifkan pemasangan tahap pertama untuk memastikan init dapat memuat fragmen kebijakan Security-Enhanced Linux (SELinux) yang tersebar di seluruh partisi system dan vendor . Akses ini juga memungkinkan pemuatan modul kernel sesegera mungkin setelah boot kernel.

Untuk melakukan pemasangan awal, Android harus memiliki akses ke sistem file tempat modul berada. Android 8.0 dan yang lebih tinggi mendukung pemasangan /system , /vendor , atau /odm sejak tahap pertama init (yaitu, sebelum SElinux diinisialisasi).

Entri Fstab

Di Android 9 dan yang lebih rendah, perangkat dapat menentukan entri fstab untuk partisi yang dipasang awal menggunakan overlay pohon perangkat (DTO) . Di Android 10 dan lebih tinggi, perangkat harus menentukan entri fstab untuk partisi yang dipasang awal menggunakan file fstab di ramdisk tahap pertama. Android 10 memperkenalkan flag fs_mgr berikut untuk digunakan dalam file fstab :

  • first_stage_mount menunjukkan bahwa partisi akan dipasang pada init tahap pertama.
  • logical menunjukkan bahwa ini adalah partisi dinamis .
  • avb= vbmeta-partition-name menentukan partisi vbmeta . Tahap pertama init menginisialisasi partisi ini sebelum memasang partisi lain. Argumen untuk tanda ini dapat dihilangkan jika partisi vbmeta untuk entri tersebut telah ditentukan oleh entri fstab lain di baris sebelumnya.

Contoh berikut menunjukkan entri fstab untuk mengatur partisi system , vendor , dan product sebagai partisi logis (dinamis).

#<dev>  <mnt_point> <type>  <mnt_flags options> <fs_mgr_flags>
system   /system     ext4    ro,barrier=1     wait,slotselect,avb=vbmeta_system,logical,first_stage_mount
vendor   /vendor     ext4    ro,barrier=1     wait,slotselect,avb=vbmeta,logical,first_stage_mount
product  /product    ext4    ro,barrier=1     wait,slotselect,avb,logical,first_stage_mount

Dalam contoh ini, vendor menentukan partisi vbmeta menggunakan flag fs_mgr avb=vbmeta , namun product menghilangkan argumen vbmeta karena vendor telah menambahkan vbmeta ke daftar partisi.

Perangkat yang menjalankan Android 10 dan lebih tinggi harus menempatkan file fstab di ramdisk dan di partisi vendor .

Ramdisk

Lokasi file fstab di ramdisk bergantung pada cara perangkat menggunakan ramdisk.

Perangkat dengan boot ramdisk harus menempatkan file fstab di root boot ramdisk. Jika perangkat memiliki ramdisk boot dan ramdisk pemulihan, tidak ada perubahan yang diperlukan pada ramdisk pemulihan. Contoh:

PRODUCT_COPY_FILES +=  device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_RAMDISK)/fstab.$(PRODUCT_PLATFORM)

Perangkat yang menggunakan pemulihan sebagai ramdisk harus menggunakan parameter baris perintah kernel androidboot.force_normal_boot=1 untuk memutuskan apakah akan melakukan booting ke Android atau melanjutkan booting ke pemulihan. Perangkat yang diluncurkan dengan Android 12 atau lebih tinggi dengan kernel versi 5.10 atau lebih baru harus menggunakan bootconfig untuk meneruskan parameter androidboot.force_normal_boot=1 . Pada perangkat ini, tahap pertama init melakukan operasi peralihan root ke /first_stage_ramdisk sebelum memasang partisi pemasangan awal, sehingga perangkat harus menempatkan file fstab di $(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk . Contoh:

PRODUCT_COPY_FILES +=  device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk/fstab.$(PRODUCT_PLATFORM)

Penjual

Semua perangkat harus menempatkan salinan file fstab ke /vendor/etc . Hal ini karena tahap pertama init membebaskan ramdisk setelah menyelesaikan pemasangan awal partisi dan melakukan operasi switch root untuk memindahkan mount di /system ke / . Oleh karena itu, setiap operasi selanjutnya yang memerlukan akses file fstab harus menggunakan salinan di /vendor/etc . Contoh:

PRODUCT_COPY_FILES +=  device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.$(PRODUCT_PLATFORM)

Pemasangan partisi lebih awal, VBoot 1.0

Persyaratan untuk melakukan pemasangan awal partisi dengan VBoot 1.0 meliputi:

  1. Jalur node perangkat harus menggunakan symlink by-name di entri fstab dan devicetree. Misalnya, daripada menentukan partisi menggunakan /dev/block/mmcblk0pX , pastikan partisi diberi nama dan node perangkatnya adalah /dev/block/…./by-name/{system,vendor,odm} .
  2. Jalur yang diberikan untuk PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION dan CUSTOM_IMAGE_VERITY_BLOCK_DEVICE dalam konfigurasi perangkat untuk produk (yaitu, dalam device/ oem / project /device.mk ) harus cocok dengan node perangkat blok terkait yang ditentukan by-name di fstab /devicetree entri. Contoh:
    PRODUCT_SYSTEM_VERITY_PARTITION := /dev/block/…./by-name/system
    PRODUCT_VENDOR_VERITY_PARTITION := /dev/block/…./by-name/vendor
    CUSTOM_IMAGE_VERITY_BLOCK_DEVICE := /dev/block/…./by-name/odm
    
  3. Entri yang disediakan melalui hamparan pohon perangkat tidak boleh terulang dalam fragmen file fstab . Misalnya, ketika menentukan entri untuk me-mount /vendor di pohon perangkat, file fstab tidak boleh mengulangi entri tersebut.
  4. Partisi yang memerlukan verifyatboot tidak boleh dipasang lebih awal (hal ini tidak didukung).
  5. Mode/status verity untuk partisi terverifikasi harus ditentukan di kernel_cmdline menggunakan opsi androidboot.veritymode (persyaratan yang ada).

Memasang pohon perangkat lebih awal, VBoot 1.0

Di Android 8.x dan lebih tinggi, init mem-parsing devicetree dan membuat entri fstab untuk memasang partisi lebih awal pada tahap pertama. Entri fstab berbentuk:

src mnt_point type mnt_flags fs_mgr_flags

Properti Devicetree didefinisikan untuk meniru format tersebut:

  • entri fstab harus berada di bawah /firmware/android/fstab di pohon perangkat dan harus memiliki string yang kompatibel yang disetel ke android,fstab .
  • Setiap node di bawah /firmware/android/fstab diperlakukan sebagai satu entri fstab pemasangan awal. Sebuah node harus memiliki properti berikut yang ditentukan:
    • dev harus menunjuk ke node perangkat yang mewakili by-name partisi
    • type harus tipe sistem file (seperti pada file fstab )
    • mnt_flags harus berupa daftar mount flag yang dipisahkan koma (seperti pada file fstab )
    • fsmgr_flags harus berupa daftar fs_mgr flags Android (seperti pada file fstab )
  • Partisi A/B harus memiliki opsi slotselect fs_mgr .
  • Partisi yang mengaktifkan dm-verity harus memiliki opsi verify fs_mgr .

Contoh: /system dan /vendor di N6P

Contoh berikut menunjukkan pemasangan awal pohon perangkat untuk partisi system dan vendor pada Nexus 6P:

/ {
  firmware {
    android {
      compatible = "android,firmware";
      fstab {
        compatible = "android,fstab";
        system {
          compatible = "android,system";
          dev = "/dev/block/platform/soc.0/f9824900.sdhci/by-name/system";
          type = "ext4";
          mnt_flags = "ro,barrier=1,inode_readahead_blks=8";
          fsmgr_flags = "wait,verify";
        };
        vendor {
          compatible = "android,vendor";
          dev = "/dev/block/platform/soc.0/f9824900.sdhci/by-name/vendor";
          type = "ext4";
          mnt_flags = "ro,barrier=1,inode_readahead_blks=8";
          fsmgr_flags = "wait";
        };
      };
    };
  };
};

Contoh: /vendor di Pixel

Contoh berikut menunjukkan pemasangan awal devicetree untuk /vendor di Pixel (ingat untuk menambahkan slotselect untuk partisi yang tunduk pada A/B):

/ {
  firmware {
    android {
      compatible = "android,firmware";
      fstab {
        compatible = "android,fstab";
        vendor {
          compatible = "android,vendor";
          dev = "/dev/block/platform/soc/624000.ufshc/by-name/vendor";
          type = "ext4";
          mnt_flags = "ro,barrier=1,discard";
          fsmgr_flags = "wait,slotselect,verify";
        };
      };
    };
  };
};

Pemasangan partisi lebih awal, VBoot 2.0

VBoot 2.0 adalah Boot Terverifikasi Android (AVB) . Persyaratan untuk melakukan mount awal partisi dengan VBoot 2.0 adalah:

  1. Jalur node perangkat harus menggunakan symlink by-name di entri fstab dan devicetree. Misalnya, daripada menentukan partisi menggunakan /dev/block/mmcblk0pX , pastikan partisi tersebut diberi nama dan node perangkatnya adalah /dev/block/…./by-name/{system,vendor,odm} .
  2. Variabel sistem build (seperti PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION dan CUSTOM_IMAGE_VERITY_BLOCK_DEVICE ) yang digunakan untuk VBoot 1.0 TIDAK diperlukan untuk VBoot 2.0. Sebaliknya, variabel build yang diperkenalkan di VBoot 2.0 (termasuk BOARD_AVB_ENABLE := true ) harus didefinisikan; untuk konfigurasi lengkap, lihat Membangun Integrasi Sistem untuk AVB .
  3. Entri yang disediakan melalui hamparan pohon perangkat tidak boleh terulang dalam fragmen file fstab . Misalnya, jika Anda menentukan entri untuk memasang /vendor di pohon perangkat, file fstab tidak boleh mengulangi entri tersebut.
  4. VBoot 2.0 tidak mendukung verifyatboot , baik pemasangan awal diaktifkan atau tidak.
  5. Mode/status verity untuk partisi terverifikasi harus ditentukan di kernel_cmdline menggunakan opsi androidboot.veritymode (persyaratan yang ada). Pastikan untuk menyertakan perbaikan berikut untuk AVB:

Memasang pohon perangkat lebih awal, VBoot 2.0

Konfigurasi di devicetree untuk VBoot 2.0 sama dengan VBoot 1.0 , dengan pengecualian berikut:

  • fsmgr_flag dialihkan dari verify ke avb .
  • Semua partisi dengan metadata AVB harus ada dalam entri VBMeta di pohon perangkat, meskipun partisi tersebut tidak dipasang lebih awal (misalnya, /boot ).

Contoh: /system dan /vendor di N5X

Contoh berikut menunjukkan pemasangan awal pohon perangkat untuk partisi system dan vendor pada Nexus 5X. Perhatikan bahwa:

  • /system dipasang dengan AVB dan /vendor dipasang tanpa verifikasi integritas.
  • Karena Nexus 5X tidak memiliki partisi /vbmeta , maka vbmeta tingkat atas berada di akhir partisi /boot (untuk detailnya, lihat daftar perubahan AOSP ).
    / {
      firmware {
        android {
          compatible = "android,firmware";
          vbmeta {
            compatible = "android,vbmeta";
            parts = "boot,system,vendor";
          };
          fstab {
            compatible = "android,fstab";
            system {
              compatible = "android,system";
              dev = "/dev/block/platform/soc.0/f9824900.sdhci/by-name/system";
              type = "ext4";
              mnt_flags = "ro,barrier=1,inode_readahead_blks=8";
              fsmgr_flags = "wait,avb";
            };
            vendor {
              compatible = "android,vendor";
              dev = "/dev/block/platform/soc.0/f9824900.sdhci/by-name/vendor";
              type = "ext4";
              mnt_flags = "ro,barrier=1,inode_readahead_blks=8";
              fsmgr_flags = "wait";
            };
          };
        };
      };
    };
    

Contoh: /vendor di Pixel

Contoh berikut menunjukkan pemasangan /vendor di awal Pixel. Perhatikan bahwa:

  • Lebih banyak partisi ditentukan dalam entri vbmeta karena partisi tersebut dilindungi oleh AVB .
  • Semua partisi AVB harus disertakan, meskipun hanya /vendor yang dipasang lebih awal.
  • Ingatlah untuk menambahkan slotselect untuk partisi yang tunduk pada A/B.
    / {
      vbmeta {
        compatible = "android,vbmeta";
        parts = "vbmeta,boot,system,vendor,dtbo";
      };
      firmware {
        android {
          compatible = "android,firmware";
          fstab {
            compatible = "android,fstab";
            vendor {
              compatible = "android,vendor";
              dev = "/dev/block/platform/soc/624000.ufshc/by-name/vendor";
              type = "ext4";
              mnt_flags = "ro,barrier=1,discard";
              fsmgr_flags = "wait,slotselect,avb";
            };
          };
        };
      };
    };