Partitionen frühzeitig bereitstellen

Treble-fähige Geräte müssen die Montage der ersten Stufe aktivieren, um sicherzustellen, init kann Sicherheitsoptimiertes Linux laden (SELinux) Richtlinienfragmente, die über system und vendor Partitionen. Dieser Zugriff ermöglicht auch das Laden des Kernels, so schnell wie möglich nach dem Kernel-Bootvorgang.

Für eine frühe Bereitstellung benötigt Android Zugriff auf die Dateisysteme auf in dem sich die Module befinden. Android 8.0 und höher unterstützt die Montage /system, /vendor oder /odm bereits ab in der ersten Phase von init (also bevor SElinux initialisiert wird).

Fstab-Einträge

Unter Android 9 und niedriger können Geräte fstab-Einträge für Frühzeitig bereitgestellte Partitionen mithilfe der Gerätestruktur Overlays (DTOs). Unter Android 10 und höher Geräte müssen fstab-Einträge für vorzeitig bereitgestellte Partitionen angeben Verwendung einer fstab-Datei in der ersten Phase ramdisks. Android-Geräte In 10 werden die folgenden fs_mgr-Flags eingeführt: zur Verwendung in der Datei fstab:

  • first_stage_mount gibt an, dass eine Partition bereitgestellt wurde. der ersten Init-Phase.
  • logical gibt an, dass dies ein dynamische Partition.
  • avb=vbmeta-partition-name gibt die Partition vbmeta. Mit der ersten Initialisierungsphase wird diese Partition initialisiert. bevor Sie andere Partitionen bereitstellen. Das Argument für dieses Flag kann weggelassen werden, wenn Die Partition vbmeta für den Eintrag wurde bereits durch weiteren fstab-Eintrag in einer vorherigen Zeile.

Das folgende Beispiel zeigt fstab-Einträge zum Festlegen des system-, vendor- und product-Partitionen als logische (dynamische) Partitionen.

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

In diesem Beispiel gibt der Anbieter die Partition vbmeta mit das fs_mgr-Flag avb=vbmeta, aber product lässt das Argument vbmeta weg, da der Anbieter dies bereits getan hat vbmeta für die Liste der Partitionen.

Auf Geräten mit Android 10 und höher muss fstab-Datei in der Ramdisk und im vendor -Partition an.

Ramdisk

Der Speicherort der Datei fstab in der Ramdisk hängt davon ab, wie ein Gerät verwendet Ramdisk.

Geräte mit einem Bootlaufwerk müssen das fstab im Stammverzeichnis der Boot-ramdisk. Hat das Gerät sowohl ein Bootlaufwerk als auch eine Wiederherstellungs-RAMdisk: Es sind keine Änderungen an der Wiederherstellungs-RAMdisk erforderlich. Beispiel:

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

Geräte, die die Wiederherstellung als RAM-Disk nutzen, müssen den Kernel-Befehlszeilenparameter androidboot.force_normal_boot=1 zu entscheiden, ob Android gestartet oder die Wiederherstellung gestartet werden soll. Geräte Markteinführung mit Android 12 oder höher mit Kernel-Version 5.10 oder höher muss bootconfig verwenden, um den androidboot.force_normal_boot=1-Parameter. In Init wird in der ersten Phase ein Root-Vorgang zum Umschalten ausgeführt. /first_stage_ramdisk, bevor Sie die Early-mount-Partitionen bereitstellen, Die Datei fstab muss also $(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk Beispiel:

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

Vendor

Auf allen Geräten muss eine Kopie der Datei „fstab“ abgelegt werden: /vendor/etc. Das liegt daran, dass in der ersten Phase ramdisk ein, nachdem die Partitionen bereits bereitgestellt wurden Root-Vorgang wechseln, um die Bereitstellung unter /system zu verschieben /. Alle nachfolgenden Vorgänge, die Zugriff auf fstab benötigen Dateien müssen daher die Kopie in /vendor/etc verwenden. Beispiel:

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

Partitionen frühzeitig bereitstellen, VBoot 1.0

Zu den Anforderungen für Early-mount-Partitionen mit VBoot 1.0 gehören:

  1. Pfade von Geräteknoten müssen ihre by-name-Symlinks in fstab- und devicetree-Einträge. Anstatt z. B. anstelle von mit /dev/block/mmcblk0pX, achten Sie darauf, dass die Partitionen benannt ist und der Geräteknoten /dev/block/…./by-name/{system,vendor,odm}.
  2. Für PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION und CUSTOM_IMAGE_VERITY_BLOCK_DEVICE in der Gerätekonfiguration für das Produkt (d. h. in device/oem/project/device.mk) muss mit den entsprechende Blockgeräteknoten, die im Feld by-name angegeben sind fstab/devicetree-Einträge. Beispiel:
    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. Einträge, die über Gerätestruktur-Overlays bereitgestellt werden, dürfen sich nicht im fstab Dateifragmente. Wenn Sie z. B. einen Eintrag für Stellen Sie /vendor im Devicetree, die Datei fstab, bereit darf diesen Eintrag nicht wiederholen.
  4. Partitionen, die verifyatboot erfordern, dürfen nicht frühzeitig bereitgestellt werden (wird nicht unterstützt).
  5. Der Versionsmodus bzw. -status für bestätigte Partitionen muss angegeben werden in kernel_cmdline mit androidboot.veritymode-Option (bestehende Anforderung).

Devicetree frühzeitig bereitstellen, VBoot 1.0

In Android 8.x und höher parst init den Devicetree und erstellt fstab-Einträge, um die Partition frühzeitig bereitzustellen. in der ersten Phase. Ein fstab-Eintrag hat das folgende Format:

src mnt_point type mnt_flags fs_mgr_flags

Devicetree-Eigenschaften sind so definiert, dass sie dieses Format imitieren:

  • fstab-Einträge müssen unter dem folgenden Wert liegen: /firmware/android/fstab in der Gerätestruktur und muss einen kompatibler String auf android,fstab festgelegt.
  • Jeder Knoten unter /firmware/android/fstab wird behandelt als einzelner Early-mount-fstab-Eintrag. Ein Knoten muss Folgendes haben: Definition der Eigenschaften: <ph type="x-smartling-placeholder">
      </ph>
    • dev muss auf den Geräteknoten verweisen, der den Partition by-name
    • type muss der Dateisystemtyp sein (z. B. fstab Dateien)
    • mnt_flags muss die durch Kommas getrennte Liste der Bereitstellungs-Flags sein (wie in fstab-Dateien)
    • fsmgr_flags muss die Liste der Android-fs_mgr flags sein (wie in fstab-Dateien).
  • A/B-Partitionen müssen die Option slotselect fs_mgr haben.
  • Partitionen mit aktiviertem dm-verity müssen eine verify fs_mgr haben Option.

Beispiel: /system und /vendor auf N6P

Das folgende Beispiel zeigt die Early-Bereitstellung für system von Devicetree und vendor Partitionen auf 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";
        };
      };
    };
  };
};

Beispiel: /vendor auf Pixel

Das folgende Beispiel zeigt die Early-Bereitstellung für /vendor von Devicetree auf Pixel (vergessen Sie nicht, slotselect für Partitionen gemäß 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";
        };
      };
    };
  };
};

Partitionen frühzeitig bereitstellen, VBoot 2.0

VBoot 2.0 ist Android Verified Boot (AVB). Die Voraussetzungen für eine Bereitstellung von Partitionen mit VBoot 2.0 sind:

  1. Die Pfade der Geräteknoten müssen ihre by-name-Symlinks verwenden in fstab- und devicetree-Einträge. Anstatt z. B. anstelle von mit /dev/block/mmcblk0pX verwenden, müssen Sie sicherstellen, benannt und der Geräteknoten ist /dev/block/…./by-name/{system,vendor,odm}.
  2. Erstellen Sie Systemvariablen (z. B. PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION und CUSTOM_IMAGE_VERITY_BLOCK_DEVICE), die für VBoot 1.0 verwendet werden, sind NICHT erforderlich für VBoot 2.0. Erstellen Sie stattdessen in VBoot 2.0 eingeführte Variablen (einschließlich BOARD_AVB_ENABLE := true) muss definiert werden. für ein vollständige Konfiguration, siehe Systemintegration für AVB erstellen.
  3. Einträge, die über Gerätestruktur-Overlays bereitgestellt werden, dürfen sich nicht im fstab Dateifragmente. Wenn Sie beispielsweise einen Eintrag für Stellen Sie /vendor im Devicetree, die Datei fstab, bereit darf diesen Eintrag nicht wiederholen.
  4. verifyatboot wird von VBoot 2.0 nicht unterstützt, unabhängig davon, ob Early Mount aktiviert ist oder nicht.
  5. Der Versionsmodus bzw. -status für bestätigte Partitionen muss angegeben werden in kernel_cmdline mit androidboot.veritymode Option (bestehende Anforderung). Nehmen Sie die folgenden Korrekturen AVB: <ph type="x-smartling-placeholder">

Devicetree frühzeitig bereitstellen, VBoot 2.0

Die Konfiguration im Devicetree für VBoot 2.0 ist die gleiche wie in VBoot 1.0 mit dem Parameter folgende Ausnahmen:

  • fsmgr_flag wurde von verify auf umgestellt avb
  • Alle Partitionen mit AVB-Metadaten müssen sich im VBMeta-Eintrag in der Devicetree zu starten, auch wenn die Partition nicht vorzeitig bereitgestellt wird (z. B. /boot.

Beispiel: /system und /vendor auf N5X

Das folgende Beispiel zeigt eine Early-Mounted-Installation von Devicetree für die Partitionen system und vendor auf Nexus 5X Hinweise:

  • /system ist mit AVB bereitgestellt und /vendor ist ohne Integritätsprüfung bereitgestellt werden.
  • Da das Nexus 5X keine /vbmeta-Partition hat, vbmeta befindet sich am Ende der Partition /boot (weitere Informationen siehe AOSP-Änderungsliste).
    / {
      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";
            };
          };
        };
      };
    };
    

Beispiel: /vendor auf Pixel

Das folgende Beispiel zeigt, wie /vendor auf einem Pixel früh montiert wird. Hinweise:

  • Im vbmeta-Eintrag sind mehr Partitionen angegeben, da diese Partitionen sind durch AVB geschützt.
  • Alle AVB-Partitionen müssen enthalten sein, auch wenn nur /vendor ist bereits montiert sind.
  • Denken Sie daran, slotselect für Partitionen hinzuzufügen, die A/B unterliegen.
    / {
      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";
            };
          };
        };
      };
    };