Монтируйте разделы заранее

Устройства с поддержкой 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 включают:

  1. Пути к узлам устройств должны использовать символические ссылки by-name в записях fstab и devicetree. Например, вместо указания разделов с помощью /dev/block/mmcblk0pX убедитесь, что разделам присвоены имена, а узлом устройства является /dev/block/…./by-name/{system,vendor,odm} .
  2. Пути, указанные для 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
  3. Записи, предоставленные через наложения дерева устройств, не должны повторяться во фрагментах файла fstab . Например, при указании записи для монтирования /vendor в дереве устройств файл fstab не должен повторять эту запись.
  4. Разделы, требующие verifyatboot не должны монтироваться досрочно (это не поддерживается).
  5. Режим/состояние достоверности для проверенных разделов должен быть указан в kernel_cmdline с использованием параметра androidboot.veritymode (существующее требование).

Раннее монтирование дерева устройств, VBoot 1.0

В Android 8.x и более поздних версиях init анализирует дерево устройств и создает записи fstab для монтирования раздела на раннем этапе его первого этапа. Запись fstab имеет вид:

src mnt_point type mnt_flags fs_mgr_flags

Свойства дерева устройств определены для имитации этого формата:

  • Записи 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:

  1. Пути к узлам устройств должны использовать символические ссылки by-name в записях fstab и devicetree. Например, вместо указания разделов с помощью /dev/block/mmcblk0pX убедитесь, что разделам присвоены имена, а узлом устройства является /dev/block/…./by-name/{system,vendor,odm} .
  2. Системные переменные сборки (такие как PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION и CUSTOM_IMAGE_VERITY_BLOCK_DEVICE ), используемые для VBoot 1.0, НЕ требуются для VBoot 2.0. Вместо этого следует определить переменные сборки, представленные в VBoot 2.0 (включая BOARD_AVB_ENABLE := true ); полную конфигурацию см. в разделе Интеграция системы сборки для AVB .
  3. Записи, предоставляемые через наложения дерева устройств, не должны повторяться во фрагментах файла fstab . Например, если вы укажете запись для монтирования /vendor в дереве устройств, файл fstab не должен повторять эту запись.
  4. VBoot 2.0 не verifyatboot независимо от того, включено раннее монтирование или нет.
  5. Режим/состояние достоверности для проверенных разделов необходимо указать в 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";
            };
          };
        };
      };
    };