Perangkat berkemampuan Treble harus mengaktifkan mount tahap pertama untuk memastikan init dapat memuat fragmen kebijakan Security-Enhanced Linux (SELinux) yang tersebar di seluruh system dan partisi vendor . Akses ini juga memungkinkan pemuatan modul kernel sesegera mungkin setelah kernel boot.
Untuk melakukan pemasangan awal, Android harus memiliki akses ke sistem file tempat modul berada. Android 8.0 dan 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 lebih awal menggunakan overlay pohon perangkat (DTO) . Di Android 10 dan yang lebih tinggi, perangkat harus menentukan entri fstab untuk partisi yang dipasang lebih awal menggunakan file fstab di ramdisk tahap pertama. Android 10 memperkenalkan flag fs_mgr berikut untuk digunakan dalam file fstab :
-
first_stage_mountmenunjukkan bahwa partisi akan dipasang oleh init tahap pertama. -
logicalmenunjukkan bahwa ini adalah partisi dinamis . -
avb= vbmeta-partition-namemenentukan partisivbmeta. Tahap pertama init menginisialisasi partisi ini sebelum memasang partisi lain. Argumen untuk flag ini dapat dihilangkan jika partisivbmetauntuk entri telah ditentukan oleh entrifstablain 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 , tetapi 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 tergantung pada bagaimana perangkat menggunakan ramdisk.
Perangkat dengan boot ramdisk harus menempatkan file fstab di root boot ramdisk. Jika perangkat memiliki boot ramdisk 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 boot ke Android atau melanjutkan boot ke pemulihan. Peluncuran Perangkat 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, init tahap pertama melakukan operasi root switch ke /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)
Penjaja
Semua perangkat harus menempatkan salinan file fstab ke /vendor/etc . Ini karena init tahap pertama membebaskan ramdisk setelah menyelesaikan pemasangan awal partisi dan melakukan operasi root switch untuk memindahkan mount di /system ke / . Oleh karena itu, setiap operasi selanjutnya yang perlu mengakses 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)
Memasang partisi lebih awal, VBoot 1.0
Persyaratan untuk memasang partisi lebih awal dengan VBoot 1.0 meliputi:
- Jalur node perangkat harus menggunakan symlink
by-namemereka di entrifstabdan devicetree. Misalnya, daripada menentukan partisi menggunakan/dev/block/mmcblk0pX, pastikan bahwa partisi diberi nama dan node perangkat adalah/dev/block/…./by-name/{system,vendor,odm}. - Jalur yang diberikan untuk
PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITIONdanCUSTOM_IMAGE_VERITY_BLOCK_DEVICEdalam konfigurasi perangkat untuk produk (yaitu, didevice/ oem / project /device.mk) harus cocok dengan node blok perangkat yang sesuai yang ditentukanby-namedifstab/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
- Entri yang diberikan melalui hamparan pohon perangkat tidak boleh diulang dalam fragmen file
fstab. Misalnya, saat menentukan entri untuk memasang/vendordi devicetree, filefstabtidak boleh mengulangi entri itu. - Partisi yang memerlukan
verifyatboottidak boleh dipasang lebih awal (melakukannya tidak didukung). - Mode/status verity untuk partisi terverifikasi harus ditentukan di
kernel_cmdlinemenggunakan opsiandroidboot.veritymode(persyaratan yang ada).
Memasang devicetree 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 selama tahap pertama. Entri fstab berbentuk:
src mnt_point type mnt_flags fs_mgr_flags
Properti Devicetree didefinisikan untuk meniru format itu:
- entri
fstabharus berada di bawah/firmware/android/fstabdi devicetree dan harus memiliki string yang kompatibel yang disetel keandroid,fstab. - Setiap node di bawah
/firmware/android/fstabdiperlakukan sebagai entrifstabmount awal tunggal. Sebuah node harus memiliki properti berikut yang ditentukan:-
devharus menunjuk ke node perangkat yang mewakiliby-namepartisi -
typeharus tipe sistem file (seperti pada filefstab) -
mnt_flagsharus berupa daftar flag mount yang dipisahkan koma (seperti dalam filefstab) -
fsmgr_flagsharus berupa daftarfs_mgr flagsAndroid (seperti dalam filefstab)
-
- 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 devicetree untuk system dan partisi 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";
};
};
};
};
};
Memasang partisi lebih awal, VBoot 2.0
VBoot 2.0 adalah Android Verified Boot (AVB) . Persyaratan untuk memasang partisi lebih awal dengan VBoot 2.0 adalah:
- Jalur node perangkat harus menggunakan symlink
by-namemereka di entrifstabdan devicetree. Misalnya, daripada menentukan partisi menggunakan/dev/block/mmcblk0pX, pastikan bahwa partisi tersebut diberi nama dan node perangkatnya adalah/dev/block/…./by-name/{system,vendor,odm}. - Membangun variabel sistem (seperti
PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITIONdanCUSTOM_IMAGE_VERITY_BLOCK_DEVICE) yang digunakan untuk VBoot 1.0 TIDAK diperlukan untuk VBoot 2.0. Sebagai gantinya, variabel build yang diperkenalkan di VBoot 2.0 (termasukBOARD_AVB_ENABLE := true) harus didefinisikan; untuk konfigurasi lengkap, lihat Membangun Integrasi Sistem untuk AVB . - Entri yang diberikan melalui hamparan pohon perangkat tidak boleh diulang dalam fragmen file
fstab. Misalnya, jika Anda menentukan entri untuk memasang/vendordi devicetree, filefstabtidak boleh mengulangi entri itu. - VBoot 2.0 tidak mendukung
verifyatboot, apakah pemasangan awal diaktifkan atau tidak. - Mode/status verity untuk partisi terverifikasi harus ditentukan di
kernel_cmdlinemenggunakan opsiandroidboot.veritymode(persyaratan yang ada). Pastikan untuk menyertakan perbaikan berikut untuk AVB:
Memasang devicetree lebih awal, VBoot 2.0
Konfigurasi di devicetree untuk VBoot 2.0 sama dengan di VBoot 1.0 , dengan pengecualian berikut:
-
fsmgr_flagdialihkan dariverifykeavb. - Semua partisi dengan metadata AVB harus berada di entri VBMeta di devicetree, bahkan ketika partisi tidak dipasang lebih awal (misalnya,
/boot).
Contoh: /system dan /vendor di N5X
Contoh berikut menunjukkan pemasangan awal devicetree untuk system dan partisi vendor pada Nexus 5X. Perhatikan bahwa:
-
/systemdipasang dengan AVB dan/vendordipasang 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 awal pada Pixel. Perhatikan bahwa:
- Lebih banyak partisi ditentukan dalam entri vbmeta karena partisi tersebut dilindungi oleh AVB .
- Semua partisi AVB harus disertakan, meskipun hanya
/vendoryang dipasang lebih awal. - Ingatlah untuk menambahkan
slotselectuntuk 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"; }; }; }; }; };