Los dispositivos habilitados para agudos deben habilitar el montaje de primera etapa para asegurarse de que init pueda cargar fragmentos de políticas de Linux con seguridad mejorada (SELinux) que se distribuyen en las particiones del system y del vendor . Este acceso también permite la carga de módulos del kernel lo antes posible después del arranque del kernel.
Para realizar el montaje temprano, Android debe tener acceso a los sistemas de archivos en los que residen los módulos. Android 8.0 y versiones posteriores admiten el montaje /system , /vendor o /odm desde la primera etapa de init (es decir, antes de inicializar SElinux).
Entradas de Fstab
En Android 9 y versiones anteriores, los dispositivos pueden especificar entradas fstab para particiones montadas anteriormente mediante superposiciones de árboles de dispositivos (DTO) . En Android 10 y versiones posteriores, los dispositivos deben especificar entradas fstab para las primeras particiones montadas mediante un archivo fstab en el ramdisk de primera etapa. Android 10 presenta las siguientes fs_mgr para usar en el archivo fstab :
-
first_stage_mountindica que la primera etapa montará una partición. -
logicalindica que se trata de una partición dinámica . -
avb= vbmeta-partition-nameespecifica la particiónvbmeta. La primera etapa init inicializa esta partición antes de montar otras particiones. El argumento para este indicador se puede omitir si la particiónvbmetapara la entrada ya se ha especificado mediante otra entradafstaben una línea anterior.
El siguiente ejemplo muestra las entradas de fstab para establecer 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 la partición vbmeta mediante el indicador fs_mgr avb=vbmeta , pero el product omite el argumento vbmeta porque el proveedor ya agregó vbmeta a la lista de particiones.
Los dispositivos que ejecutan Android 10 y versiones posteriores deben colocar el archivo fstab en el ramdisk y en la partición del vendor .
ramdisk
La ubicación del archivo fstab en ramdisk depende de cómo un dispositivo use ramdisk.
Los dispositivos con un ramdisk de arranque deben colocar el archivo fstab en la raíz del ramdisk de arranque. Si el dispositivo tiene un ramdisk de arranque y un ramdisk de recuperación, no se requieren cambios en el ramdisk de recuperación. Ejemplo:
PRODUCT_COPY_FILES += device/google/<product-name>/fstab.hardware:$(TARGET_COPY_OUT_RAMDISK)/fstab.$(PRODUCT_PLATFORM)
Los dispositivos que utilizan la recuperación como ramdisk deben utilizar el parámetro de la línea de comandos del kernel androidboot.force_normal_boot=1 para decidir si iniciar Android o continuar con la recuperación. Los dispositivos que se inician con Android 12 o superior con kernel versión 5.10 o posterior deben usar bootconfig para pasar el parámetro androidboot.force_normal_boot=1 . En estos dispositivos, la primera etapa init realiza una operación de cambio de raíz a /first_stage_ramdisk antes de montar las particiones de montaje inicial, 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 la primera etapa init libera el ramdisk después de completar el montaje inicial 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 de particiones temprano, VBoot 1.0
Los requisitos para el montaje temprano de particiones con VBoot 1.0 incluyen:
- Las rutas de los nodos del dispositivo deben usar sus enlaces simbólicos
by-nameen las entradasfstaby devicetree. Por ejemplo, en lugar de especificar particiones usando/dev/block/mmcblk0pX, asegúrese de que las particiones tengan nombre y que el nodo del dispositivo sea/dev/block/…./by-name/{system,vendor,odm}. - Las rutas proporcionadas para
PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITIONyCUSTOM_IMAGE_VERITY_BLOCK_DEVICEen la configuración del dispositivo para el producto (es decir, endevice/ oem / project /device.mk) deben coincidir con los nodos de dispositivo de bloque correspondientes especificadosby-nameenfstab/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
- Las entradas proporcionadas a través de las superposiciones del árbol de dispositivos no deben repetirse en los fragmentos del archivo
fstab. Por ejemplo, al especificar una entrada para montar/vendoren el árbol de dispositivos, el archivofstabno debe repetir esa entrada. - Las particiones que requieren verificar en
verifyatbootno deben montarse antes (no se admite hacerlo). - El modo/estado de verity para las particiones verificadas se debe especificar en
kernel_cmdlineusando la opciónandroidboot.veritymode(requisito existente).
Montaje de árbol de dispositivos temprano, VBoot 1.0
En Android 8.x y 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 toma la forma:
src mnt_point type mnt_flags fs_mgr_flags
Las propiedades de Devicetree se definen para imitar ese formato:
- Las entradas de
fstabdeben estar en/firmware/android/fstaben el árbol de dispositivos y deben tener una cadena compatible establecida enandroid,fstab. - Cada nodo en
/firmware/android/fstabse trata como una única entradafstabde montaje inicial. Un nodo debe tener definidas las siguientes propiedades:-
devdebe apuntar al nodo del dispositivo que representa la particiónby-name -
typedebe ser el tipo de sistema de archivos (como en los archivosfstab) -
mnt_flagsdebe ser la lista separada por comas de banderas de montaje (como en los archivosfstab) -
fsmgr_flagsdebe ser la lista defs_mgr flagsde Android (como en los archivosfstab)
-
- 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: /sistema y /proveedor en N6P
El siguiente ejemplo muestra el montaje temprano del árbol de dispositivos para particiones de vendor y system 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: /proveedor 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 el montaje temprano de particiones con VBoot 2.0 son:
- Las rutas de los nodos del dispositivo deben usar sus enlaces simbólicos
by-nameen las entradasfstaby devicetree. Por ejemplo, en lugar de especificar particiones mediante/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}. - Las variables del sistema de compilación (como
PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITIONyCUSTOM_IMAGE_VERITY_BLOCK_DEVICE) utilizadas para VBoot 1.0 NO son necesarias para VBoot 2.0. En su lugar, se deben definir las variables de compilación introducidas en VBoot 2.0 (incluidoBOARD_AVB_ENABLE := true); para obtener una configuración completa, consulte Construir integración del sistema para AVB . - Las entradas proporcionadas a través de las superposiciones del árbol de dispositivos no deben repetirse en los fragmentos del archivo
fstab. Por ejemplo, si especifica una entrada para montar/vendoren el árbol de dispositivos, el archivofstabno debe repetir esa entrada. - VBoot 2.0 no es compatible
verifyatboot, ya sea que el montaje temprano esté habilitado o no. - El modo/estado de verity para las particiones verificadas debe especificarse en
kernel_cmdlinemediante la opciónandroidboot.veritymode(requisito existente). Asegúrese de incluir las siguientes correcciones para AVB:
Montaje de devicetree temprano, 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_flagse cambia deverifyaavb. - Todas las particiones con metadatos AVB deben estar en la entrada VBMeta en el árbol de dispositivos, incluso cuando la partición no se monte temprano (por ejemplo,
/boot).
Ejemplo: /sistema y /proveedor en N5X
El siguiente ejemplo muestra un montaje temprano de árbol de dispositivos para el system y las particiones del vendor en Nexus 5X. Tenga en cuenta que:
-
/systemestá montado con AVB y/vendorestá montado sin verificación de integridad. - Como el Nexus 5X no tiene una partición
/vbmeta, la vbmeta de nivel superior reside al final de la partición/boot(para obtener 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: /proveedor en Pixel
El siguiente ejemplo muestra el montaje de /vendor al principio de un Pixel. Tenga en cuenta que:
- Se especifican más particiones en la entrada vbmeta porque esas particiones están protegidas por AVB .
- Se deben incluir todas las particiones AVB, incluso si solo
/vendorse monta antes. - Recuerde agregar
slotselectpara 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"; }; }; }; }; };