Installer les partitions de manière anticipée

Les appareils compatibles avec Treble doivent activer le premier étage d'installation pour s'assurer init peut charger des applications Security-Enhanced Linux (SELinux) répartis entre system et vendor partitions. Cet accès permet aussi de charger le noyau modules dès que possible après le démarrage du noyau.

Pour effectuer un montage anticipé, Android doit avoir accès aux systèmes de fichiers sur qui hébergent les modules. Android 8.0 ou version ultérieure est compatible avec /system, /vendor ou /odm dès le Première étape de init (c'est-à-dire avant l'initialisation de SElinux).

Entrées fstab

Sous Android 9 ou version antérieure, les appareils peuvent spécifier des entrées fstab pour partitions installées de façon anticipée à l'aide de l'arborescence de périphériques superpositions. Sur Android 10 et versions ultérieures, les appareils doivent spécifier les entrées fstab pour les partitions installées de façon anticipée en utilisant un fichier fstab lors de la première étape ramdisk. Android 10 introduit les options fs_mgr suivantes à utiliser dans le fichier fstab:

  • first_stage_mount indique qu'une partition est installée à la première étape de l'initialisation.
  • logical indique qu'il s'agit d'un partition dynamique.
  • avb=vbmeta-partition-name spécifie la partition vbmeta. La première étape initialise cette partition avant de monter d'autres partitions. L'argument de cet indicateur peut être omis si la partition vbmeta de l'entrée a déjà été spécifiée par une autre entrée fstab dans une ligne précédente.

L'exemple suivant montre des entrées fstab pour définir le Partitions system, vendor et product sous forme de partitions logiques (dynamiques).

#<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

Dans cet exemple, le fournisseur spécifie la partition vbmeta à l'aide de l'indicateur fs_mgr avb=vbmeta, mais product omet l'argument vbmeta, car le fournisseur a déjà ajouté vbmeta à la liste des partitions.

Les appareils équipés d'Android 10 ou version ultérieure doivent placer le fstab dans le ramdisk et dans vendor partition.

Disque RAM

L'emplacement du fichier fstab dans ramdisk dépend de la façon dont un appareil utilise ramdisk.

Les appareils dotés d'un disque RAM de démarrage doivent placer l'fstab à la racine ramdisk de démarrage. Si l'appareil dispose à la fois d'un ramdisk de démarrage et d'un aucune modification n'est requise sur le ramdisk de récupération. Exemple :

PRODUCT_COPY_FILES +=  device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_RAMDISK)/fstab.$(PRODUCT_PLATFORM)

Les appareils utilisant la récupération en tant que ramdisk doivent utiliser la le paramètre de ligne de commande du noyau androidboot.force_normal_boot=1 à décider de démarrer sur Android ou de continuer à démarrer avec la récupération. Appareils Lancer avec Android 12 ou version ultérieure avec version 5.10 ou ultérieure du noyau doit utiliser bootconfig pour transmettre le Paramètre androidboot.force_normal_boot=1. Dans sur ces appareils, la première étape init effectue une opération switch à la racine /first_stage_ramdisk avant d'installer les partitions d'installation anticipée Les appareils doivent donc placer le fichier fstab $(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk Exemple :

PRODUCT_COPY_FILES +=  device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk/fstab.$(PRODUCT_PLATFORM)

Fournisseur

Tous les appareils doivent placer une copie du fichier fstab dans /vendor/etc En effet, la première étape init libère ramdisk après avoir installé tôt les partitions et effectué une basculez sur l'opération racine pour déplacer le montage sur /system vers / Toute opération ultérieure nécessitant d'accéder à fstab doivent donc utiliser la copie dans /vendor/etc. Exemple :

PRODUCT_COPY_FILES +=  device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.$(PRODUCT_PLATFORM)

Installer des partitions de manière anticipée, VBoot 1.0

Les conditions requises pour l'installation anticipée de partitions avec VBoot 1.0 incluent les éléments suivants:

  1. Les chemins d'accès des nœuds de l'appareil doivent utiliser leurs liens symboliques by-name dans fstab et les entrées devicetree. Par exemple, au lieu de spécifier partitions à l'aide de /dev/block/mmcblk0pX, assurez-vous qu'elles sont et que le nœud de l'appareil est /dev/block/…./by-name/{system,vendor,odm}
  2. Chemins d'accès fournis pour PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION et CUSTOM_IMAGE_VERITY_BLOCK_DEVICE dans la configuration de l'appareil pour le produit (c'est-à-dire, device/oem/project/device.mk) doit correspondre à nœuds d'appareil de stockage en mode bloc correspondants spécifiés by-name dans fstab/devicetree. Exemple:
    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. Les entrées fournies via des superpositions d'arborescence de périphériques ne doivent pas être répétées dans les fstab fragments de fichiers. Par exemple, si vous spécifiez une entrée installer /vendor dans l'arborescence des appareils, le fichier fstab ne doit pas répéter cette entrée.
  4. Les partitions nécessitant verifyatboot ne doivent pas être installé en avance (cela n'est pas pris en charge).
  5. Le mode et l'état de vérification des partitions validées doivent être spécifiés dans kernel_cmdline avec l'option androidboot.veritymode (exigence existante).

Installer l'arborescence de périphériques à un stade précoce, VBoot 1.0

Dans Android 8.x et versions ultérieures, init analyse l'arborescence de l'appareil et crée des entrées fstab pour installer la partition de manière anticipée la première étape. Une entrée fstab se présente sous la forme suivante:

src mnt_point type mnt_flags fs_mgr_flags

Les propriétés Devicetree sont définies pour imiter ce format:

  • fstab entrées doivent être inférieures à /firmware/android/fstab dans l'arborescence des appareils et doit avoir un élément chaîne compatible définie sur android,fstab.
  • Chaque nœud sous /firmware/android/fstab est traité comme une seule entrée d'installation anticipée (fstab). Un nœud doit disposer des éléments suivants : définies: <ph type="x-smartling-placeholder">
      </ph>
    • dev doit pointer vers le nœud d'appareil représentant le partition by-name
    • type doit être le type du système de fichiers (comme dans fstab fichiers)
    • mnt_flags doit être la liste des indicateurs d'installation séparés par une virgule (comme dans les fichiers fstab)
    • fsmgr_flags doit correspondre à la liste d'Android fs_mgr flags (comme dans les fichiers fstab).
  • Les partitions A/B doivent avoir une option slotselect fs_mgr.
  • Les partitions pour lesquelles dm-verity est activé doivent avoir un verify fs_mgr .

Exemple: /system et /vendor sur N6P

L'exemple suivant illustre l'installation anticipée de devicetree pour system et vendor sur le 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";
        };
      };
    };
  };
};

Exemple: /vendor sur Pixel

L'exemple suivant illustre l'installation anticipée de devicetree pour /vendor sur le Pixel (n'oubliez pas d'ajouter slotselect pour les partitions soumises à 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";
        };
      };
    };
  };
};

Installer des partitions de manière anticipée, VBoot 2.0

VBoot 2.0 est le démarrage validé Android (AVB). Les conditions requises pour sont les suivantes:

  1. Les chemins d'accès des nœuds de l'appareil doivent utiliser leurs liens symboliques by-name dans fstab et les entrées devicetree. Par exemple, au lieu de spécifier partitions à l'aide de /dev/block/mmcblk0pX, assurez-vous qu'elles sont nommées et le nœud de l'appareil /dev/block/…./by-name/{system,vendor,odm}
  2. Les variables système de compilation (telles que PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION et CUSTOM_IMAGE_VERITY_BLOCK_DEVICE) utilisés pour VBoot 1.0 ne sont PAS requise pour VBoot 2.0. À la place, les variables de compilation introduites dans VBoot 2.0 (y compris BOARD_AVB_ENABLE := true) doit être défini. pendant configuration complète, reportez-vous Créer une intégration système pour AVB
  3. Les entrées fournies via des superpositions d'arborescence de périphériques ne doivent pas être répétées dans les fstab fragments de fichiers. Par exemple, si vous spécifiez une entrée pour installer /vendor dans l'arborescence des appareils, le fichier fstab ne doit pas répéter cette entrée.
  4. VBoot 2.0 n'est pas compatible avec verifyatboot, qu'il s'agisse d'une installation anticipée est activé ou non.
  5. Le mode et l'état de vérification des partitions validées doivent être spécifiés dans kernel_cmdline avec androidboot.veritymode (exigence existante). Assurez-vous d'inclure les correctifs suivants pour AVB: <ph type="x-smartling-placeholder">

Installer l'arborescence de périphériques à un stade précoce, VBoot 2.0

La configuration de l'arborescence des appareils pour VBoot 2.0 est la même que celle de VBoot 1.0, avec le les exceptions suivantes:

  • L'appareil fsmgr_flag est passé de verify à avb
  • Toutes les partitions avec des métadonnées AVB doivent figurer dans l'entrée VBMeta du devicetree, même lorsque la partition n'est pas installée en avance (par exemple, /boot).

Exemple: /system et /vendor sur N5X

L'exemple suivant illustre un montage anticipé de l'arborescence de périphériques pour le Partitions system et vendor sur le Nexus 5X. Gardez à l'esprit les points suivants :

  • /system est installé avec AVB et /vendor est installé monté sans vérification de l'intégrité.
  • Comme le Nexus 5X n'a pas de partition /vbmeta, les partitions de premier niveau vbmeta se trouve à la fin de la partition /boot (pour en savoir plus, reportez-vous à la liste de modifications 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";
            };
          };
        };
      };
    };
    

Exemple: /vendor sur Pixel

L'exemple suivant montre comment installer /vendor de manière anticipée sur un Pixel. Gardez à l'esprit les points suivants :

  • Davantage de partitions sont spécifiées dans l'entrée vbmeta, car ces partitions sont protégés par AVB.
  • Toutes les partitions AVB doivent être incluses, même si seule /vendor est montés tôt.
  • N'oubliez pas d'ajouter slotselect pour les partitions soumises à 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";
            };
          };
        };
      };
    };