Устройства с поддержкой 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"; }; }; }; }; };