Memasang partisi lebih awal

Perangkat berkemampuan Treble harus mengaktifkan pengaitan tahap pertama untuk memastikan init dapat memuat Security-Enhanced Linux (SELinux) yang tersebar di seluruh system dan partisi vendor. Akses ini juga memungkinkan pemuatan {i>kernel<i} modul Anda sesegera mungkin setelah {i>booting<i} {i>kernel<i}.

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

Entri Fstab

Di Android 9 dan yang lebih lama, perangkat dapat menentukan entri fstab untuk partisi yang terpasang lebih awal menggunakan hierarki perangkat overlay (DTO). Di Android 10 dan yang lebih tinggi, perangkat harus menentukan entri fstab untuk partisi yang terpasang lebih awal menggunakan file fstab di tahap pertama ramdisk Anda sendiri. Android 10 memperkenalkan tanda fs_mgr berikut untuk digunakan dalam file fstab:

  • first_stage_mount menunjukkan bahwa partisi terpasang oleh init tahap pertama.
  • logical menunjukkan bahwa ini adalah partisi dinamis.
  • avb=vbmeta-partition-name menentukan Partisi vbmeta. Init tahap pertama melakukan inisialisasi partisi ini sebelum memasang partisi lain. Argumen untuk tanda ini dapat dihilangkan jika partisi vbmeta untuk entri telah ditentukan oleh entri fstab lain di baris sebelumnya.

Contoh berikut menunjukkan entri fstab untuk menetapkan 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, tetapi product menghilangkan argumen vbmeta karena vendor telah menambahkan vbmeta ke daftar partisi.

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

{i>Raddisk<i}

Lokasi file fstab dalam ramdisk bergantung pada cara perangkat menggunakan {i>ramdisk<i}.

Perangkat dengan ramdisk booting harus menempatkan fstab di root boot ramdisk. Jika perangkat memiliki {i>boot ramdisk<i} 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 command line kernel androidboot.force_normal_boot=1 ke memutuskan apakah akan {i>booting<i} ke Android atau melanjutkan {i>booting <i}ke pemulihan. Perangkat Meluncurkan dengan Android 12 atau yang lebih baru dengan {i>kernel<i} versi 5.10 atau yang lebih baru harus menggunakan {i>bootconfig<i} untuk meneruskan Parameter androidboot.force_normal_boot=1. Di beberapa perangkat ini, tahap pertama init melakukan operasi {i>switch root<i} untuk /first_stage_ramdisk sebelum memasang partisi pemasangan awal, jadi 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)

Vendor

Semua perangkat harus menempatkan salinan file fstab ke dalam /vendor/etc. Hal ini karena init tahap pertama membebaskan {i>ramdisk<i} setelah menyelesaikan pemasangan awal partisi dan melakukan ganti operasi root untuk memindahkan penyangga pada /system ke /. Operasi berikutnya yang perlu mengakses fstab oleh karena itu, file harus menggunakan salinan di /vendor/etc. Contoh:

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

Pasang partisi lebih awal, VBoot 1.0

Persyaratan untuk memasang partisi di awal dengan VBoot 1.0 meliputi:

  1. Jalur node perangkat harus menggunakan symlink by-name-nya di fstab dan entri devicetree. Misalnya, alih-alih menentukan partisi menggunakan /dev/block/mmcblk0pX, pastikan bahwa partisi dan {i>node <i}perangkat akan /dev/block/…./by-name/{system,vendor,odm}.
  2. Jalur diberikan untuk PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION dan CUSTOM_IMAGE_VERITY_BLOCK_DEVICE dalam konfigurasi perangkat untuk produk (yaitu, device/oem/project/device.mk) harus cocok dengan node perangkat blok yang sesuai yang ditentukan by-name dalam Entri fstab/devicetree. 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 overlay hierarki perangkat tidak boleh diulang dalam fstab fragmen file. Misalnya, saat menentukan entri ke memasang /vendor di devicetree, yaitu file fstab tidak boleh mengulangi entri tersebut.
  4. Partisi yang memerlukan verifyatboot tidak boleh dipasang lebih awal (tidak didukung).
  5. Mode/status verifikasi untuk partisi terverifikasi harus ditentukan di kernel_cmdline menggunakan opsi androidboot.veritymode (persyaratan yang ada).

Pasang devicetree lebih awal, VBoot 1.0

Di Android 8.x dan yang lebih tinggi, init menguraikan devicetree dan membuat fstab entri untuk memasang partisi di awal tahap pertama. Entri fstab berbentuk:

src mnt_point type mnt_flags fs_mgr_flags

Properti devicetree ditentukan untuk meniru format tersebut:

  • fstab entri harus kurang dari /firmware/android/fstab di devicetree dan harus memiliki string kompatibel yang disetel ke android,fstab.
  • Setiap node di bawah /firmware/android/fstab diperlakukan sebagai satu entri fstab pemasangan awal. Node harus memiliki properti yang ditentukan:
    • dev harus menunjuk ke node perangkat yang mewakili partisi by-name
    • type harus berupa jenis sistem file (seperti dalam fstab file)
    • mnt_flags harus berupa daftar tanda pemasangan yang dipisahkan koma (seperti dalam file fstab)
    • fsmgr_flags harus berupa daftar fs_mgr flags Android (seperti dalam file fstab)
  • Partisi A/B harus memiliki opsi slotselect fs_mgr.
  • Partisi yang mengaktifkan dm-verity harus memiliki verify fs_mgr sebelumnya.

Contoh: /sistem dan /vendor di N6P

Contoh berikut menunjukkan pemasangan awal devicetree untuk system dan partisi vendor di 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 (jangan lupa menambahkan slotselect untuk partisi yang tunduk kepada 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";
        };
      };
    };
  };
};

Memasang partisi lebih awal, VBoot 2.0

VBoot 2.0 adalah Android Verified Boot (AVB). Persyaratan untuk uji coba mount partisi dengan VBoot 2.0 adalah:

  1. Jalur node perangkat harus menggunakan symlink by-name-nya di fstab dan entri devicetree. Misalnya, alih-alih menentukan partisi menggunakan /dev/block/mmcblk0pX, pastikan bahwa partisi diberi nama dan {i>node<i} perangkat 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 yang diperlukan untuk VBoot 2.0. Sebagai gantinya, variabel build yang diperkenalkan di VBoot 2.0 (termasuk BOARD_AVB_ENABLE := true) harus ditentukan; untuk konfigurasi lengkap, lihat Buat Integrasi Sistem untuk AVB.
  3. Entri yang disediakan melalui overlay hierarki perangkat tidak boleh diulang dalam fstab fragmen file. Misalnya, jika Anda menentukan entri ke memasang /vendor di devicetree, yaitu file fstab tidak boleh mengulangi entri tersebut.
  4. VBoot 2.0 tidak mendukung verifyatboot, baik pemasangan awal apakah diaktifkan atau tidak.
  5. Mode/status verifikasi untuk partisi terverifikasi harus ditentukan di kernel_cmdline menggunakan androidboot.veritymode (persyaratan yang ada). Pastikan Anda menyertakan perbaikan berikut untuk AVB:

Pasang devicetree lebih awal, VBoot 2.0

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

  • fsmgr_flag dialihkan dari verify menjadi avb.
  • Semua partisi dengan metadata AVB harus dalam entri VBMeta di devicetree, bahkan saat partisi tidak dipasang lebih awal (misalnya, /boot).

Contoh: /sistem dan /vendor di N5X

Contoh berikut menunjukkan pemasangan awal devicetree untuk Partisi system dan vendor di Nexus 5X. Perhatikan bahwa:

  • /system terpasang dengan AVB dan /vendor merupakan dipasang tanpa verifikasi integritas.
  • Karena Nexus 5X tidak memiliki partisi /vbmeta, sehingga tingkat atas vbmeta 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 lebih awal di Pixel. Perhatikan bahwa:

  • Partisi yang ditentukan dalam entri vbmeta lebih banyak karena partisi tersebut adalah dilindungi oleh AVB.
  • Semua partisi AVB harus disertakan, meskipun hanya /vendor yang dipasang lebih awal.
  • Jangan lupa 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";
            };
          };
        };
      };
    };