Устройства с поддержкой Treble должны включить монтирование на первом этапе, чтобы убедиться, что init может загружать фрагменты политики Security-Enhanced Linux (SELinux) , которые распределены по разделам system и vendor . Этот доступ также позволяет загружать модули ядра как можно быстрее после загрузки ядра.
Для раннего монтирования Android должен иметь доступ к файловым системам, в которых находятся модули. Android 8.0 и выше поддерживает монтирование /system , /vendor или /odm уже на первом этапе init (то есть до инициализации SElinux).
Записи Fstab
В Android 9 и более ранних версиях устройства могут указывать записи fstab для предварительно смонтированных разделов с помощью наложений дерева устройств (DTO) . В Android 10 и выше устройства должны указывать записи fstab для ранее смонтированных разделов с помощью файла fstab на первом этапе ramdisk . В Android 10 представлены следующие флаги fs_mgr для использования в fstab :
-
first_stage_mountуказывает, что раздел будет смонтирован на первом этапе инициализации. -
logicalуказывает, что это динамический раздел . -
avb= vbmeta-partition-nameуказывает разделvbmeta. Первый этап init инициализирует этот раздел перед монтированием других разделов. Аргумент для этого флага можно опустить, если разделvbmetaдля записи уже указан другой записьюfstabв предыдущей строке.
В следующем примере показаны записи fstab для установки разделов system , vendor и product в качестве логических (динамических) разделов.
#<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
В этом примере поставщик указывает раздел vbmeta с помощью флага fs_mgr avb=vbmeta , но product опускает аргумент vbmeta , поскольку поставщик уже добавил vbmeta в список разделов.
Устройства под управлением Android 10 и выше должны разместить файл fstab на виртуальном диске и в разделе vendor .
Рамдиск
Расположение файла fstab на виртуальном диске зависит от того, как устройство использует RAM-диск.
Устройства с загрузочным RAM -диском должны поместить файл fstab в корень загрузочного RAM-диска. Если на устройстве есть и загрузочный виртуальный диск, и виртуальный диск восстановления, никаких изменений в виртуальный диск восстановления не требуется. Пример:
PRODUCT_COPY_FILES += device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_RAMDISK)/fstab.$(PRODUCT_PLATFORM)
Устройства , которые используют восстановление в качестве виртуального диска, должны использовать параметр командной строки ядра androidboot.force_normal_boot=1 , чтобы решить, следует ли загрузиться в Android или продолжить загрузку в режиме восстановления. Устройства, запускаемые с Android 12 или более поздней версии с ядром версии 5.10 или более поздней, должны использовать bootconfig для передачи параметра androidboot.force_normal_boot=1 . В этих устройствах первый этап инициализации выполняет операцию переключения root на /first_stage_ramdisk перед монтированием разделов раннего монтирования, поэтому устройства должны поместить файл fstab в $(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk . Пример:
PRODUCT_COPY_FILES += device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk/fstab.$(PRODUCT_PLATFORM)
Продавец
Все устройства должны поместить копию файла fstab в /vendor/etc . Это связано с тем, что первый этап инициализации освобождает виртуальный диск после завершения раннего монтирования разделов и выполняет операцию переключения root для перемещения монтирования из /system в / . Поэтому любые последующие операции, требующие доступа к файлам fstab , должны использовать копию в /vendor/etc . Пример:
PRODUCT_COPY_FILES += device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.$(PRODUCT_PLATFORM)
Раннее монтирование разделов, VBoot 1.0
Требования для раннего монтирования разделов с помощью VBoot 1.0 включают:
- Пути к узлам устройств должны использовать их символические ссылки
by-nameв записяхfstabи devicetree. Например, вместо указания разделов с помощью/dev/block/mmcblk0pXубедитесь, что разделы названы, а узел устройства —/dev/block/…./by-name/{system,vendor,odm}. - Пути, указанные для
PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITIONиCUSTOM_IMAGE_VERITY_BLOCK_DEVICEв конфигурации устройства для продукта (то есть вdevice/ oem / project /device.mk), должны совпадать с соответствующими узлами блочных устройств, указаннымиby-nameвfstab/devicetree. записи. Пример: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
- Записи, предоставленные через наложения дерева устройств, не должны повторяться во фрагментах файла
fstab. Например, при указании записи для монтирования/vendorв дереве устройств файлfstabне должен повторять эту запись. - Разделы, требующие
verifyatbootпри загрузке , не должны монтироваться заранее (это не поддерживается). - Режим/состояние истинности для проверенных разделов должен быть указан в
kernel_cmdlineс использованием опцииandroidboot.veritymode(существующее требование).
Раннее монтирование devicetree, VBoot 1.0
В Android 8.x и выше init анализирует дерево устройств и создает записи fstab для монтирования раздела на ранней стадии его первого этапа. Запись fstab имеет вид:
src mnt_point type mnt_flags fs_mgr_flags
Свойства Devicetree определены для имитации этого формата:
- Записи
fstabдолжны находиться в/firmware/android/fstabв дереве устройств и должны иметь совместимую строку, установленную наandroid,fstab. - Каждый узел в
/firmware/android/fstabрассматривается как одна записьfstabраннего монтирования. Для узла должны быть определены следующие свойства:-
devдолжен указывать на узел устройства, представляющий разделby-name -
typeдолжен быть типом файловой системы (как в файлахfstab) -
mnt_flagsдолжен быть разделенным запятыми списком флагов монтирования (как в файлахfstab) -
fsmgr_flagsдолжен быть спискомfs_mgr flags(как в файлахfstab)
-
- Разделы A/B должны иметь
slotselect fs_mgr. - Разделы с поддержкой dm-verity должны иметь опцию
verify fs_mgr.
Пример: /system и /vendor на N6P
В следующем примере показано раннее монтирование devicetree для system и vendor разделов на 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";
};
};
};
};
};
Пример: /vendor в Pixel.
В следующем примере показано раннее монтирование devicetree для /vendor на Pixel (не забудьте добавить slotselect для разделов, подпадающих под 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";
};
};
};
};
};
Раннее монтирование разделов, VBoot 2.0
VBoot 2.0 — это проверенная загрузка Android (AVB) . Требования для раннего монтирования разделов с помощью VBoot 2.0:
- Пути к узлам устройств должны использовать их символические ссылки
by-nameв записяхfstabи devicetree. Например, вместо указания разделов с помощью/dev/block/mmcblk0pXубедитесь, что разделы названы, а узел устройства —/dev/block/…./by-name/{system,vendor,odm}. - Системные переменные сборки (такие как
PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITIONиCUSTOM_IMAGE_VERITY_BLOCK_DEVICE), используемые для VBoot 1.0, НЕ требуются для VBoot 2.0. Вместо этого должны быть определены переменные сборки, представленные в VBoot 2.0 (включаяBOARD_AVB_ENABLE := true); полную конфигурацию см. в разделе Интеграция системы сборки для AVB . - Записи, предоставленные через наложения дерева устройств, не должны повторяться во фрагментах файла
fstab. Например, если вы укажете запись для монтирования/vendorв дереве устройств, файлfstabне должен повторять эту запись. - VBoot 2.0 не поддерживает
verifyatbootнезависимо от того, включено раннее монтирование или нет. - Режим/состояние истинности для проверенных разделов должен быть указан в
kernel_cmdlineс помощью параметраandroidboot.veritymode(существующее требование). Обязательно включите следующие исправления для AVB:
Раннее монтирование devicetree, VBoot 2.0
Конфигурация в дереве устройств для VBoot 2.0 такая же, как и в VBoot 1.0 , со следующими исключениями:
-
fsmgr_flagпереключается сverifyнаavb. - Все разделы с метаданными AVB должны быть в записи VBMeta в дереве устройств, даже если раздел не монтируется раньше (например,
/boot).
Пример: /system и /vendor на N5X
В следующем примере показано раннее монтирование дерева устройств для system и vendor разделов на Nexus 5X. Обратите внимание, что:
-
/systemмонтируется с помощью AVB, а/vendorмонтируется без проверки целостности. - Поскольку в Nexus 5X нет раздела
/vbmeta, то vbmeta верхнего уровня находится в конце раздела/boot(подробности см. в списке изменений 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"; }; }; }; }; };
Пример: /vendor в Pixel.
В следующем примере показано раннее монтирование /vendor на Pixel. Обратите внимание, что:
- В записи vbmeta указано больше разделов, потому что эти разделы защищены AVB .
- Все разделы AVB должны быть включены, даже если предварительно смонтирован только
/vendor. - Не забудьте добавить
slotselectдля разделов, подпадающих под 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"; }; }; }; }; };