Устройства с поддержкой 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
. Первый этап инициализации инициализирует этот раздел перед монтированием других разделов. Аргумент для этого флага можно опустить, если раздел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
на виртуальном диске зависит от того, как устройство использует виртуальный диск.
Устройства с загрузочным виртуальным диском должны поместить файл fstab
в корень загрузочного виртуального диска. Если устройство имеет как загрузочный виртуальный диск, так и виртуальный диск восстановления, никаких изменений в виртуальном диске восстановления не требуется. Пример:
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
. В этих устройствах первый этап инициализации выполняет операцию переключения корневого каталога на /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
. Это связано с тем, что первый этап инициализации освобождает виртуальный диск после завершения раннего монтирования разделов и выполняет операцию переключения корня для перемещения монтирования из /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
(существующее требование).
Раннее монтирование дерева устройств, 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.
В следующем примере показано раннее монтирование дерева устройств для 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
В следующем примере показано раннее монтирование дерева устройств для /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:
Раннее монтирование дерева устройств, 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"; }; }; }; }; };