Activa las particiones con anticipación

Los dispositivos compatibles con Treble deben habilitar el montaje de la primera etapa para garantizar init puede cargar Security-Enhanced Linux (SELinux), que se distribuyen en system y vendor. Este acceso también permite cargar kernel los módulos en cuanto sea posible después del inicio del kernel.

Para realizar la activación anticipada, Android debe tener acceso a los sistemas de archivos de la ubicación de los módulos. Android 8.0 y las versiones posteriores admiten el montaje /system, /vendor o /odm a partir del La primera etapa de init (es decir, antes de que se inicialice SElinux).

Entradas fstab

En Android 9 y versiones anteriores, los dispositivos pueden especificar entradas fstab para particiones activadas de manera anticipada con el árbol de dispositivos (DTO). En Android 10 y versiones posteriores, Los dispositivos deben especificar entradas fstab para las particiones activadas de manera anticipada con un archivo fstab en la primera etapa ramdisk En Android 10 introduce las siguientes marcas fs_mgr para usar en el archivo fstab:

  • first_stage_mount indica que una partición está activada el init de la primera etapa.
  • logical indica que este es un partición dinámica.
  • avb=vbmeta-partition-name especifica la vbmeta. El init de la primera etapa inicializa esta partición antes de activar otras particiones. El argumento para esta marca se puede omitir si la partición vbmeta para la entrada ya fue especificada por otra entrada fstab en una línea anterior.

En el siguiente ejemplo, se muestran entradas fstab para establecer la Particiones 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 la partición vbmeta con la marca fs_mgr avb=vbmeta, pero product omite el argumento vbmeta porque el proveedor ya agregó vbmeta a la lista de particiones.

Los dispositivos con Android 10 y versiones posteriores deben colocar el fstab en el ramdisk y en el archivo vendor por cada partición.

Ramdisk

La ubicación del archivo fstab en el ramdisk depende de la manera en que un dispositivo usa ramdisk.

Los dispositivos con un ramdisk de inicio deben colocar el fstab en la raíz del disco RAM de arranque. Si el dispositivo tiene un disco RAM de inicio y un ramdisk 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 ramdisk deben usar el parámetro de la línea de comandos del kernel androidboot.force_normal_boot=1 como decide si quieres iniciar Android o continuar con el proceso de recuperación. Dispositivos Cómo realizar el lanzamiento con Android 12 o versiones posteriores con versión de kernel 5.10 o posterior debe usar bootconfig para pasar el Parámetro androidboot.force_normal_boot=1. En estos dispositivos, el init de la primera etapa realiza una operación de cambio de raíz a /first_stage_ramdisk antes de activar las particiones de activación anticipada, 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)

Proveedor

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 completar la activación anticipada de las particiones y realizar una Cambiar operación raíz para mover la activación en /system a / Cualquier operación posterior que necesite acceder a fstab por lo tanto, los archivos deben usar la copia en /vendor/etc. Ejemplo:

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

Activa particiones antes de tiempo, VBoot 1.0

Entre los requisitos para las particiones de activación anticipada con VBoot 1.0, se incluyen los siguientes:

  1. Las rutas de los nodos del dispositivo deben usar sus symlinks by-name en Entradas de fstab y devicetree. Por ejemplo, en lugar de especificar particiones con /dev/block/mmcblk0pX, asegúrate de que se y el nodo del dispositivo se /dev/block/…./by-name/{system,vendor,odm}
  2. Rutas proporcionadas para PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION y CUSTOM_IMAGE_VERITY_BLOCK_DEVICE en la configuración del dispositivo del el producto (es decir, en device/oem/project/device.mk) debe coincidir con la nodos del dispositivo de bloques correspondientes que se especifiquen by-name en el fstab/devicetree. 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 mediante superposiciones del árbol de dispositivos no deben repetirse en la Fragmentos de archivo fstab. Por ejemplo, si especificas una entrada a activa /vendor en el árbol de dispositivos, el archivo fstab no deben repetir esa entrada.
  4. Las particiones que requieren verifyatboot no deben se activará de forma anticipada (no es compatible hacerlo).
  5. El modo/estado de verity de las particiones verificadas se debe especificar en kernel_cmdline con la opción androidboot.veritymode (requisito existente).

Activa devicetree antes y VBoot 1.0.

En Android 8.x y versiones posteriores, init analiza el árbol de dispositivos y crea entradas fstab para activar la partición con anticipación durante su primera etapa. Una entrada fstab tiene el siguiente formato:

src mnt_point type mnt_flags fs_mgr_flags

Las propiedades del árbol de dispositivos están definidas para imitar ese formato:

  • Las entradas de fstab deben tener menos de /firmware/android/fstab en el árbol de dispositivos y debe tener un string compatible establecida en android,fstab.
  • Cada nodo en /firmware/android/fstab se trata como un una sola entrada fstab de activación anticipada. Un nodo debe tener lo siguiente propiedades definidas:
    • dev debe apuntar al nodo del dispositivo que representa el partición by-name
    • type debe ser el tipo de sistema de archivos (como en fstab archivos)
    • mnt_flags debe ser la lista de marcas de activación separadas por comas (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 un verify fs_mgr de 12 a 1 con la nueva opción de compresión.

Ejemplo: /system y /vendor en N6P

En el siguiente ejemplo, se muestra la activación anticipada de devicetree para system y 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

En el siguiente ejemplo, se muestra la activación anticipada de devicetree para /vendor en Pixel (recuerda agregar slotselect para las 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";
        };
      };
    };
  };
};

Activa particiones antes de tiempo, VBoot 2.0

VBoot 2.0 es el inicio verificado de Android (AVB). Los requisitos para iniciar activar particiones con VBoot 2.0 son las siguientes:

  1. Las rutas de los nodos del dispositivo deben usar sus symlinks by-name en Entradas de fstab y devicetree. Por ejemplo, en lugar de especificar particiones con /dev/block/mmcblk0pX, asegúrate de que las particiones tienen un nombre, y el nodo del dispositivo se /dev/block/…./by-name/{system,vendor,odm}
  2. Compila variables de sistema (como PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION y CUSTOM_IMAGE_VERITY_BLOCK_DEVICE) que se usan para VBoot 1.0 NO son que se requiere para VBoot 2.0. En su lugar, las variables de compilación incorporadas en VBoot 2.0 (incluido BOARD_AVB_ENABLE := true). durante un configuración completa, consulta Compilación de sistemas de integración para AVB
  3. Las entradas proporcionadas mediante superposiciones del árbol de dispositivos no deben repetirse en la Fragmentos de archivo fstab. Por ejemplo, si especificas una entrada a activa /vendor en el árbol de dispositivos, el archivo fstab no deben repetir esa entrada.
  4. VBoot 2.0 no admite verifyatboot, ya sea con activación anticipada si la cuenta está habilitada o no.
  5. El modo/estado de verity de las particiones verificadas se debe especificar en kernel_cmdline con androidboot.veritymode (requisito existente). Asegúrate de incluir las siguientes correcciones para AVB:

Activa devicetree antes y VBoot 2.0.

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

  • Se cambió fsmgr_flag de verify a avb
  • Todas las particiones con metadatos de AVB deben estar en la entrada de VBMeta en la devicetree, incluso cuando la partición no se active antes (por ejemplo, /boot).

Ejemplo: /system y /vendor en N5X

En el siguiente ejemplo, se muestra la activación temprana de un devicetree para el Particiones system y vendor en Nexus 5X. Ten en cuenta lo siguiente:

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

En el siguiente ejemplo, se muestra cómo activar /vendor antes en un Pixel. Ten en cuenta lo siguiente:

  • Se especifican más particiones en la entrada de vbmeta, ya que esas particiones son protegida por el AVB.
  • Se deben incluir todas las particiones de AVB, incluso si solo se incluye /vendor activar de forma anticipada.
  • Recuerda agregar slotselect para las 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";
            };
          };
        };
      };
    };