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 lavbmeta
. 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ónvbmeta
para la entrada ya fue especificada por otra entradafstab
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:
- Las rutas de los nodos del dispositivo deben usar sus symlinks
by-name
en Entradas defstab
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}
- Rutas proporcionadas para
PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION
yCUSTOM_IMAGE_VERITY_BLOCK_DEVICE
en la configuración del dispositivo del el producto (es decir, endevice/oem/project/device.mk
) debe coincidir con la nodos del dispositivo de bloques correspondientes que se especifiquenby-name
en elfstab
/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
- 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 archivofstab
no deben repetir esa entrada. - Las particiones que requieren
verifyatboot
no deben se activará de forma anticipada (no es compatible hacerlo). - El modo/estado de verity de las particiones verificadas se debe especificar en
kernel_cmdline
con la opciónandroidboot.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 enandroid,fstab
. - Cada nodo en
/firmware/android/fstab
se trata como un una sola entradafstab
de activación anticipada. Un nodo debe tener lo siguiente propiedades definidas:dev
debe apuntar al nodo del dispositivo que representa el particiónby-name
type
debe ser el tipo de sistema de archivos (como enfstab
archivos)mnt_flags
debe ser la lista de marcas de activación separadas 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 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:
- Las rutas de los nodos del dispositivo deben usar sus symlinks
by-name
en Entradas defstab
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}
- Compila variables de sistema (como
PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION
yCUSTOM_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 (incluidoBOARD_AVB_ENABLE := true
). durante un configuración completa, consulta Compilación de sistemas de integración para AVB - 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 archivofstab
no deben repetir esa entrada. - VBoot 2.0 no admite
verifyatboot
, ya sea con activación anticipada si la cuenta está habilitada o no. - El modo/estado de verity de las particiones verificadas se debe especificar en
kernel_cmdline
conandroidboot.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
deverify
aavb
- 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"; }; }; }; }; };