Los dispositivos habilitados para Treble deben habilitar el montaje de primera etapa para garantizar que init
pueda cargar fragmentos de políticas de Linux con seguridad mejorada (SELinux) que están distribuidos en las particiones system
y vendor
. Este acceso también permite la carga de módulos del kernel lo antes posible después del inicio 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 versiones posteriores admiten 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 tempranamente mediante superposiciones de árbol de dispositivos (DTO) . En Android 10 y versiones posteriores, los dispositivos deben especificar entradas fstab
para las particiones montadas inicialmente usando un archivo fstab
en el disco ram de la primera etapa. Android 10 introduce los siguientes indicadores fs_mgr
para usar en el archivo fstab
:
-
first_stage_mount
indica que el inicio de la primera etapa montará una partición. -
logical
indica que se trata de una partición dinámica . -
avb= vbmeta-partition-name
especifica 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ónvbmeta
para la entrada ya ha sido especificada por otra entradafstab
en una línea anterior.
El siguiente ejemplo muestra entradas fstab
para configurar las particiones del 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
usando el indicador fs_mgr
avb=vbmeta
, pero 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 disco RAM y en la partición vendor
.
disco ram
La ubicación del archivo fstab
en el disco ram depende de cómo un dispositivo usa el disco ram.
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 utilizan la recuperación como disco ram deben usar el parámetro de línea de comando 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 la versión del kernel 5.10 o posterior deben usar bootconfig para pasar el parámetro androidboot.force_normal_boot=1
. 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 iniciales, 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 la primera etapa init libera el disco ram 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 archivos fstab
debe utilizar 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 anticipadamente con VBoot 1.0 incluyen:
- Las rutas de los nodos del dispositivo deben utilizar sus enlaces simbólicos
by-name
en las entradasfstab
y devicetree. Por ejemplo, en lugar de especificar particiones usando/dev/block/mmcblk0pX
, asegúrese de que las particiones tengan un nombre y que el nodo del dispositivo sea/dev/block/…./by-name/{system,vendor,odm}
. - Las rutas proporcionadas para
PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION
yCUSTOM_IMAGE_VERITY_BLOCK_DEVICE
en 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-name
enfstab
/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 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 archivofstab
no debe repetir esa entrada. - Las particiones que requieren
verifyatboot
no se deben montar anticipadamente (no se admite hacerlo). - El modo/estado de verdad para las particiones verificadas se debe especificar en
kernel_cmdline
usando la opciónandroidboot.veritymode
(requisito existente).
Montaje temprano del árbol de dispositivos, 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 temprano durante su primera etapa. Una entrada fstab
toma la forma:
src mnt_point type mnt_flags fs_mgr_flags
Las propiedades del árbol de dispositivos se definen para imitar ese formato:
- Las entradas
fstab
deben estar en/firmware/android/fstab
en el árbol de dispositivos y deben tener una cadena compatible configurada enandroid,fstab
. - Cada nodo en
/firmware/android/fstab
se trata como una única entradafstab
de montaje inicial. Un nodo debe tener definidas las siguientes propiedades:-
dev
debe apuntar al nodo del dispositivo que representa la particiónby-name
-
type
debe ser el tipo de sistema de archivos (como en los archivosfstab
). -
mnt_flags
debe ser la lista de indicadores de montaje separados por comas (como en los archivosfstab
) -
fsmgr_flags
debe ser la lista defs_mgr flags
de 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
verify fs_mgr
.
Ejemplo: /system y /vendor en N6P
El siguiente ejemplo muestra el montaje inicial del árbol de dispositivos para particiones 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: /proveedor en Pixel
El siguiente ejemplo muestra el montaje inicial del árbol de dispositivos 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:
- Las rutas de los nodos del dispositivo deben utilizar sus enlaces simbólicos
by-name
en las entradasfstab
y 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 variables del sistema de compilación (como
PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION
yCUSTOM_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 (incluidaBOARD_AVB_ENABLE := true
); para obtener una configuración completa, consulte Integración del sistema de compilación para AVB . - 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 archivofstab
no debe repetir esa entrada. - VBoot 2.0 no admite
verifyatboot
, ya sea que el montaje anticipado esté habilitado o no. - El modo/estado de verdad para las particiones verificadas se debe especificar en
kernel_cmdline
usando la opciónandroidboot.veritymode
(requisito existente). Asegúrese de incluir las siguientes correcciones para AVB:
Montaje temprano 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 deverify
aavb
. - 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 temprano (por ejemplo,
/boot
).
Ejemplo: /system y /vendor en N5X
El siguiente ejemplo muestra un montaje inicial de un árbol de dispositivos para las particiones del system
y vendor
en Nexus 5X. Tenga en cuenta que:
-
/system
está montado con AVB y/vendor
está 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 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: /proveedor en Pixel
El siguiente ejemplo muestra el montaje /vendor
en una fase temprana 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
/vendor
se monta anticipadamente. - 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"; }; }; }; }; };