Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Montaje temprano de particiones

Los dispositivos habilitados para agudos deben habilitar el montaje de la primera etapa para asegurarse de que init pueda cargar fragmentos de políticas de Linux con seguridad mejorada (SELinux) que se distribuyen en vendor particiones del system y de los vendor . Este acceso también permite la carga de módulos del kernel tan pronto como sea posible después del arranque del kernel.

Para realizar un montaje temprano, Android debe tener acceso a los sistemas de archivos en los que residen los módulos. Android 8.0 y superior admite el montaje de /system , /vendor o /odm desde la primera etapa de init (es decir, antes de que se inicialice SElinux).

Entradas de fstab

En Android 9 y versiones anteriores, los dispositivos pueden especificar entradas fstab para particiones montadas anteriormente mediante superposiciones de árbol de dispositivos (DTO) . En Android 10 y versiones posteriores, los dispositivos deben especificar las entradas fstab para las particiones montadas anteriormente mediante un archivo fstab en el disco ram de la primera etapa. Android 10 presenta las siguientes fs_mgr para su uso en el archivo fstab :

  • first_stage_mount indica que el init de la primera etapa first_stage_mount una partición.
  • logical indica que se trata de una partición dinámica .
  • avb= vbmeta-partition-name especifica la partición vbmeta . La primera etapa init inicializa esta partición antes de montar otras particiones. El argumento de esta bandera se puede omitir si la partición vbmeta para la entrada ya ha sido especificada por otra entrada fstab en una línea anterior.

El siguiente ejemplo muestra las entradas de fstab para configurar las particiones de system , vendor y product como particiones lógicas (dinámicas).

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

En este ejemplo, el proveedor Especifica el vbmeta partición utilizando el fs_mgr bandera avb=vbmeta , pero product omite la vbmeta argumento porque proveedor ya ha añadido vbmeta a la lista de particiones.

Los dispositivos que ejecutan Android 10 y superior deben colocar el archivo fstab en el disco RAM y en la partición del vendor .

Ramdisk

La ubicación del archivo fstab en el ramdisk depende de cómo un dispositivo usa ramdisk.

Los dispositivos con un disco RAM de arranque deben colocar el archivo fstab en la raíz del disco RAM de arranque. Si el dispositivo tiene un disco RAM de arranque y un disco RAM de recuperación, no se requieren cambios en el disco RAM de recuperación. Ejemplo:

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

Los dispositivos que usan la recuperación como un androidboot.force_normal_boot=1 deben usar el parámetro de línea de comando del kernel androidboot.force_normal_boot=1 para decidir si arrancar en Android o continuar arrancando en recuperación. En estos dispositivos, el inicio de la primera etapa realiza una operación de cambio de raíz a /first_stage_ramdisk antes de montar las particiones de montaje temprano, por lo que los dispositivos deben colocar el archivo fstab en $(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk . Ejemplo:

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

Vendedor

Todos los dispositivos deben colocar una copia del archivo fstab en /vendor/etc Esto se debe a que el init de la primera etapa libera el ramdisk después de que completa el montaje temprano de las particiones y realiza una operación de cambio de raíz para mover el montaje en /system a / . Por lo tanto, cualquier operación posterior que necesite acceder a los archivos fstab debe usar la copia en /vendor/etc Ejemplo:

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

Montaje temprano de particiones, VBoot 1.0

Los requisitos para montar particiones con VBoot 1.0 incluyen:

  1. Las rutas de los nodos de dispositivos deben utilizar sus enlaces simbólicos by-name en las entradas de fstab y devicetree. Por ejemplo, en lugar de especificar particiones usando /dev/block/mmcblk0pX , asegúrese de que las particiones tengan un nombre y el nodo del dispositivo sea /dev/block/…./by-name/{system,vendor,odm} .
  2. Las rutas proporcionadas para PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION y CUSTOM_IMAGE_VERITY_BLOCK_DEVICE en la configuración del dispositivo para el producto (es decir, en device/ oem / project /device.mk ) deben coincidir con los nodos de dispositivo de bloque correspondientes especificados by-name en fstab / devicetree entradas. Ejemplo:
    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. Las entradas proporcionadas a través de superposiciones del árbol de dispositivos no deben repetirse en los fragmentos del archivo fstab . Por ejemplo, al especificar una entrada para montar /vendor en el árbol de dispositivos, el archivo fstab no debe repetir esa entrada.
  4. Las particiones que requieran verifyatboot no deben montarse antes (hacerlo no es compatible).
  5. El modo / estado de verdad para las particiones verificadas se debe especificar en kernel_cmdline usando la opción androidboot.veritymode (requisito existente).

Montaje anticipado del árbol de dispositivos, VBoot 1.0

En Android 8.xy versiones posteriores, init analiza el árbol de dispositivos y crea entradas fstab para montar la partición al principio de su primera etapa. Una entrada fstab tiene la forma:

src mnt_point type mnt_flags fs_mgr_flags

Las propiedades del árbol de dispositivos se definen para imitar ese formato:

  • fstab entradas de fstab deben estar en /firmware/android/fstab en el árbol de dispositivos y deben tener una cadena compatible configurada para android,fstab .
  • Cada nodo en /firmware/android/fstab se trata como una única entrada fstab montaje temprano. Un nodo debe tener las siguientes propiedades definidas:
    • dev debe apuntar al nodo del dispositivo que representa la partición by-name
    • type debe ser el tipo de sistema de archivos (como en los archivos fstab )
    • mnt_flags debe ser la lista separada por comas de mnt_flags de montaje (como en los archivos fstab )
    • fsmgr_flags debe ser la lista de fs_mgr flags de Android (como en los archivos fstab )
  • Las particiones A / B deben tener una opción slotselect fs_mgr .
  • Las particiones habilitadas para dm-verity deben tener una opción de verify fs_mgr .

Ejemplo: / system y / vendor en N6P

El siguiente ejemplo muestra el montaje anticipado del árbol de system para vendor particiones del system y del vendor en 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";
    };
      };
    };
  };
};

Ejemplo: / vendor en Pixel

El siguiente ejemplo muestra el montaje temprano de devicetree para /vendor en Pixel (recuerde agregar slotselect para particiones sujetas 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";
        };
      };
    };
  };
};

Montaje temprano de particiones, VBoot 2.0

VBoot 2.0 es un arranque verificado de Android (AVB) . Los requisitos para montar particiones anticipadamente con VBoot 2.0 son:

  1. Las rutas de los nodos del dispositivo deben utilizar sus enlaces simbólicos by-name en las entradas fstab y devicetree. Por ejemplo, en lugar de especificar particiones usando /dev/block/mmcblk0pX , asegúrese de que las particiones tengan un nombre y el nodo del dispositivo sea /dev/block/…./by-name/{system,vendor,odm} .
  2. Las variables del sistema de compilación (como PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION y CUSTOM_IMAGE_VERITY_BLOCK_DEVICE ) utilizadas para VBoot 1.0 NO son necesarias para VBoot 2.0. En su lugar, deben definirse las variables de compilación introducidas en VBoot 2.0 (incluido BOARD_AVB_ENABLE := true ); para obtener una configuración completa, consulte Integración del sistema de compilación para AVB .
  3. Las entradas proporcionadas a través de superposiciones del árbol de dispositivos no deben repetirse en los fragmentos del archivo fstab . Por ejemplo, si especifica una entrada para montar /vendor en el árbol de dispositivos, el archivo fstab no debe repetir esa entrada.
  4. VBoot 2.0 no admite la verifyatboot , ya sea que el montaje temprano esté habilitado o no.
  5. El modo / estado de verdad para las particiones verificadas se debe especificar en kernel_cmdline mediante la opción androidboot.veritymode (requisito existente). Asegúrese de incluir las siguientes correcciones para AVB:

Montaje anticipado del árbol de dispositivos, VBoot 2.0

La configuración en devicetree para VBoot 2.0 es la misma que en VBoot 1.0 , con las siguientes excepciones:

  • El fsmgr_flag se cambia de verify a avb .
  • Todas las particiones con metadatos AVB deben estar en la entrada VBMeta en el árbol de dispositivos, incluso cuando la partición no se está montando antes (por ejemplo, /boot ).

Ejemplo: / system y / vendor en N5X

El siguiente ejemplo muestra un montaje anticipado del árbol de dispositivos para el system y vendor particiones del vendor en Nexus 5X. Tenga en cuenta que:

  • /system se monta con AVB y /vendor se monta sin verificación de integridad.
  • Como el Nexus 5X no tiene partición /vbmeta , el vbmeta de nivel superior reside al final de la partición /boot (para obtener más detalles, consulte la lista de cambios de 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";
            };
          };
        };
      };
    };
    

Ejemplo: / vendor en Pixel

El siguiente ejemplo muestra el montaje /vendor de un Pixel. Tenga en cuenta que:

  • Se especifican más particiones en la entrada vbmeta porque esas particiones están protegidas por AVB .
  • Deben incluirse todas las particiones AVB, incluso si solo /vendor se ha montado antes.
  • Recuerde agregar slotselect para particiones sujetas a 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";
            };
          };
        };
      };
    };