Monta le partizioni in anticipo

I dispositivi con gli alti devono attivare il montaggio del primo stadio per garantire init può caricare Security-Enhanced Linux (SELinux) di frammenti di criteri distribuiti tra system e vendor partizioni. Questo accesso consente anche il caricamento il prima possibile dopo l'avvio del kernel.

Per eseguire il montaggio anticipato, Android deve avere accesso ai file system su in cui si trovano i moduli. Android 8.0 e versioni successive supporta il montaggio /system, /vendor o /odm già nel la prima fase di init (prima dell'inizializzazione di SElinux).

Voci FStab

In Android 9 e versioni precedenti, i dispositivi possono specificare fstab voci per montate inizialmente utilizzando la struttura ad albero dei dispositivi overlay (DTO). In Android 10 e versioni successive, i dispositivi devono specificare fstab voci per le partizioni montate in anticipo utilizzando un file fstab nella prima fase ramdisk. Android 10 introduce i seguenti flag fs_mgr per l'utilizzo nel file fstab:

  • first_stage_mount indica che una partizione è montata con il comando init della prima fase.
  • logical indica che si tratta di un partizione dinamica.
  • avb=vbmeta-partition-name specifica vbmeta partizione. L'inizializzazione della prima fase inizializza questa partizione prima di montare altre partizioni. L'argomento di questo flag può essere omesso se la partizione vbmeta per la voce è già stata specificata da un'altra voce fstab in una riga precedente.

L'esempio seguente mostra le voci fstab per impostare la Partizioni system, vendor e product come partizioni logiche (dinamiche).

#<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 questo esempio, il fornitore specifica la partizione vbmeta utilizzando il flag fs_mgr avb=vbmeta, ma product omette l'argomento vbmeta perché il fornitore ha già aggiunto vbmeta all'elenco delle partizioni.

I dispositivi con Android 10 e versioni successive devono inserire l' fstab nel ramdisk e nel vendor della partizione di testo.

Ramdisk

La posizione del file fstab nel ramdisk dipende da come un dispositivo usa ramdisk.

I dispositivi con un ramdisk di avvio devono inserire il fstab nella radice ramdisk di avvio. Se il dispositivo dispone sia di un ramdisk di avvio sia di ramdisk di ripristino, non sono necessarie modifiche al ramdisk di ripristino. Esempio:

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

I dispositivi che usano il ripristino come ramdisk devono usare il parametro della riga di comando del kernel androidboot.force_normal_boot=1 per decidere se avviare Android o continuare con il ripristino. Dispositivi Lancio con Android 12 o versioni successive con il kernel versione 5.10 o successiva deve usare bootconfig per passare Parametro androidboot.force_normal_boot=1. Nella su questi dispositivi, la prima fase init esegue un'operazione di cambio principale /first_stage_ramdisk prima di montare le partizioni di montaggio anticipato, quindi i dispositivi devono inserire il file fstab $(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk. Esempio:

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

Fornitore

Tutti i dispositivi devono inserire una copia del file fstab in /vendor/etc. Questo perché l'init della prima fase libera ramdisk dopo aver completato il montaggio iniziale delle partizioni ed esegue una operazione principale di cambio per spostare la montatura in /system su /. Qualsiasi operazione successiva che richiede l'accesso a fstab devono quindi usare la copia in /vendor/etc. Esempio:

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

Monta le partizioni in anticipo, VBoot 1.0

I requisiti per montare anticipatamente le partizioni con VBoot 1.0 includono:

  1. I percorsi dei nodi dei dispositivi devono utilizzare i relativi link simbolici by-name in Voci fstab e devicetree. Ad esempio, invece di specificare usando /dev/block/mmcblk0pX, assicurati che le partizioni siano e il nodo del dispositivo /dev/block/…./by-name/{system,vendor,odm}.
  2. Percorsi specificati per PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION e CUSTOM_IMAGE_VERITY_BLOCK_DEVICE nella configurazione del dispositivo per del prodotto (vale a dire device/oem/project/device.mk) deve corrispondere ai nodi di dispositivi a blocchi corrispondenti specificati by-name nel fstab voci/devicetree. Esempio:
    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. Le voci fornite tramite gli overlay ad albero dei dispositivi non devono ripetersi nel fstab frammenti di file. Ad esempio, quando specifichi una voce monta /vendor nella struttura ad albero dei dispositivi, il file fstab non devono ripetere l'immissione.
  4. Le partizioni che richiedono verifyatboot non devono montare anticipatamente (questa operazione non è supportata).
  5. Lo stato o la modalità di verifica per le partizioni verificate devono essere specificati in kernel_cmdline con l'opzione androidboot.veritymode (requisito esistente).

Monta in anticipo il dispositivo, VBoot 1.0

In Android 8.x e versioni successive, init analizza la struttura ad albero dei dispositivi e crea fstab voci per montare la partizione all'inizio nella prima fase. Una voce fstab ha il seguente formato:

src mnt_point type mnt_flags fs_mgr_flags

Le proprietà Devicetree vengono definite in modo da simulare questo formato:

  • fstab voci devono essere inferiori a /firmware/android/fstab nel devicetree e deve avere un oggetto stringa compatibile impostata su android,fstab.
  • Ogni nodo in /firmware/android/fstab viene considerato singola voce di inizio montaggio fstab. Un nodo deve avere quanto segue proprietà definite:
    • dev deve puntare al nodo dispositivo che rappresenta il partizione by-name
    • type deve essere il tipo di file system (ad esempio fstab file)
    • mnt_flags deve essere l'elenco separato da virgole dei flag di montaggio (come in fstab file)
    • fsmgr_flags deve essere l'elenco di Android fs_mgr flags (come in fstab file)
  • Le partizioni A/B devono avere un'opzione slotselect fs_mgr.
  • Le partizioni abilitate per dm-verity devono avere un verify fs_mgr .

Esempio: /system e /vendor su N6P

L'esempio seguente mostra il montaggio iniziale di devicetree per system e vendor partizioni sul 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";
        };
      };
    };
  };
};

Esempio: /fornitore su Pixel

L'esempio seguente mostra il montaggio iniziale di devicetree per /vendor su Pixel (ricorda di aggiungere slotselect per le partizioni soggette a 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";
        };
      };
    };
  };
};

Monta le partizioni in anticipo, VBoot 2.0

VBoot 2.0 è Avvio verificato di Android (AVB). I requisiti per le partizioni di montaggio con VBoot 2.0 sono:

  1. I percorsi dei nodi dei dispositivi devono utilizzare i relativi link simbolici by-name Voci fstab e devicetree. Ad esempio, invece di specificare partizioni utilizzando /dev/block/mmcblk0pX, assicurati che le partizioni e il nodo dispositivo /dev/block/…./by-name/{system,vendor,odm}.
  2. Crea variabili di sistema, ad esempio PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION e CUSTOM_IMAGE_VERITY_BLOCK_DEVICE) utilizzati per VBoot 1.0 NON sono richiesta per VBoot 2.0. Invece, le variabili di build introdotte in VBoot 2.0 (incluso BOARD_AVB_ENABLE := true) deve essere definito; per un per la configurazione completa, consulta Build System Integration for AVB (Crea integrazione di sistema per AVB).
  3. Le voci fornite tramite gli overlay ad albero dei dispositivi non devono ripetersi nel fstab frammenti di file. Ad esempio, se specifichi una voce monta /vendor nella struttura ad albero dei dispositivi, il file fstab non devono ripetere l'immissione.
  4. VBoot 2.0 non supporta verifyatboot, che si tratti di montaggio anticipato sia abilitato o meno.
  5. Lo stato o la modalità di verifica per le partizioni verificate devono essere specificati in kernel_cmdline tramite androidboot.veritymode (requisito esistente). Assicurati di includere le seguenti correzioni per Tempo medio di esecuzione:

Monta in anticipo il dispositivo, VBoot 2.0

La configurazione in devicetree per VBoot 2.0 è la stessa di quella in VBoot 1.0, con le seguenti eccezioni:

  • Il valore fsmgr_flag è cambiato da verify a avb.
  • Tutte le partizioni con metadati AVB devono essere inserite nella voce VBMeta nella devicetree, anche quando la partizione non viene montata in anticipo (ad esempio, /boot).

Esempio: /system e /vendor su N5X

L'esempio seguente mostra un montaggio iniziale di devicetree per Partizioni system e vendor su Nexus 5X. Tieni presente che:

  • /system è montato con AVB, mentre /vendor è montati senza verifica dell'integrità.
  • Poiché il Nexus 5X non ha una partizione /vbmeta, il file di primo livello vbmeta si trova alla fine della partizione /boot (per maggiori dettagli, consulta l'elenco delle modifiche 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";
            };
          };
        };
      };
    };
    

Esempio: /fornitore su Pixel

L'esempio seguente mostra il montaggio anticipato di /vendor su Pixel. Tieni presente che:

  • Nella voce vbmeta sono specificate più partizioni perché quelle partizioni sono protette da AVB.
  • Tutte le partizioni AVB devono essere incluse, anche se solo /vendor è montato inizialmente.
  • Ricordati di aggiungere slotselect per le partizioni soggette ad 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";
            };
          };
        };
      };
    };