En Android 10, el sistema de archivos raíz ya no es
se incluye en ramdisk.img
y, en su lugar, se combina en
system.img
(es decir, system.img
siempre se crea como
si se configuró BOARD_BUILD_SYSTEM_ROOT_IMAGE
). Dispositivos
que se lanzan con Android 10:
- Usa un diseño de partición de sistema como raíz (aplicado automáticamente por el sin opciones para cambiar su comportamiento).
- Se debe usar un ramdisk, que es necesario para dm-linear.
- Se debe configurar
BOARD_BUILD_SYSTEM_ROOT_IMAGE
comofalse
. Este parámetro de configuración solo se usa para diferenciar entre dispositivos que usan un disco RAM y los que no usan un disco RAM (y, en su lugar, activansystem.img
directamente).
El significado de una configuración de sistema como raíz difiere entre Android 9 y
Android 10 En un sistema como raíz de Android 9
de Terraform, se establece BOARD_BUILD_SYSTEM_ROOT_IMAGE
como
true
, que fuerza la compilación a combinar el sistema de archivos raíz en
Luego, system.img
y, luego, activa system.img
como archivo raíz.
(rootfs). Esta configuración es obligatoria para los dispositivos
lanzarse con Android 9, pero es opcional para los dispositivos que se actualizan a
Android 9 y para dispositivos que ejecutan versiones anteriores de Android En un dispositivo Android
hasta 10 configuraciones system-as-root, la compilación siempre
combina $TARGET_SYSTEM_OUT
y $TARGET_ROOT_OUT
en
system.img
; esta configuración es el comportamiento predeterminado para todos los dispositivos
con Android 10.
Android 10 realiza cambios adicionales en la compatibilidad particiones dinámicas, un sistema de partición del espacio de usuario que permite actualizaciones inalámbricas para crear, cambiar el tamaño o destruir particiones. Como parte de este cambio, la consola de Linux kernel ya no puede activar la partición lógica del sistema en dispositivos que se ejecutan Android 10, por lo que esta operación la controla el primer init de la etapa.
En las siguientes secciones, se describen los requisitos del sistema como raíz para OTA solo para el sistema; proporciona orientación sobre la actualización de dispositivos para usar el sistema como raíz. (incluidos los cambios de diseño de partición y los requisitos del kernel de dm-verity). Para detalles sobre cambios en ramdisk, consulta Ramdisk Particiones.
Información acerca de las OTA solo del sistema
OTA solo para el sistema, que permiten que las versiones de Android se actualicen
system.img
y product.img
sin cambiar otra
particiones, requieren un diseño de partición de sistema como raíz. Todos los dispositivos con Android
10 deben usar un diseño de partición de sistema como raíz para
habilitar las OTA solo del sistema.
- Dispositivos A/B, que activan la partición
system
como rootfs, ya usan system-as-root y no requieren cambios para admitir las OTA del sistema. - Dispositivos que no son A/B, que activan la partición
system
en/system
; se debe actualizar para su uso un diseño de partición de sistema como raíz para admitir las OTA del sistema.
Para obtener detalles sobre dispositivos A/B y que no son A/B, consulta Actualizaciones del sistema A/B (sin problemas).
Usar la superposición de proveedores (<=AOSP 14)
La superposición de proveedores te permite superponer los cambios en vendor
al iniciar el dispositivo. Una superposición de proveedor es un conjunto de módulos de proveedor en
la partición product
que se superpone en vendor
cuando se inicia el dispositivo, reemplazando
y agregando a los módulos existentes.
Cuando se inicia el dispositivo, el proceso init
completa la primera
la activación de la etapa
y lee las propiedades predeterminadas. Luego, busca
/product/vendor_overlay/<target_vendor_version>
y activaciones
cada subdirectorio en el directorio de partición vendor
correspondiente
si se cumplen las siguientes condiciones:
/vendor/<overlay_dir>
existe./product/vendor_overlay/<target_vendor_version>/<overlay_dir>
tiene el mismo contexto de archivo que/vendor/<overlay_dir>
.- Se permite activar
init
en el contexto de archivos de/vendor/<overlay_dir>
Implementar la superposición de proveedores
Instala archivos de superposición de proveedores en
/product/vendor_overlay/<target_vendor_version>
Esos archivos
superpone la partición vendor
cuando se inicie el dispositivo para reemplazar los archivos
del mismo nombre y agregando cualquier archivo nuevo. La superposición del proveedor no puede quitar archivos
de la partición vendor
.
Los archivos de superposición de proveedores deben tener el mismo contexto de archivo que los archivos de destino
se reemplazan en la partición vendor
. De forma predeterminada, los archivos del
Directorio /product/vendor_overlay/<target_vendor_version>
tener el contexto vendor_file
. Si el contexto de los archivos no coincide
entre los archivos de superposición de proveedores y los archivos que reemplazan, especifícalo en la
una política específica del dispositivo. El contexto del archivo se establece a nivel del directorio. Si el botón
el contexto del archivo de un directorio de superposición de proveedor no coincide con el directorio de destino.
y no se especifica el contexto de archivo correcto en la política específica del dispositivo
para que el directorio de superposición del proveedor no se superponga en el directorio de destino.
Para usar la superposición de proveedores, el kernel debe habilitar OverlayFS a través de la configuración
CONFIG_OVERLAY_FS=y
Además, el kernel debe combinarse desde el
kernel común 4.4 o posterior, o con el parche de "overlayfs:
override_creds=off option bypass creator_cred"
.
Ejemplo de implementación de superposiciones de proveedores
Este procedimiento demuestra la implementación de una superposición de proveedor que se superpone a
los directorios /vendor/lib/*
, /vendor/etc/*
y
/vendor/app/*
-
Cómo agregar archivos de proveedores compilados previamente en
device/<vendor>/<target>/vendor_overlay/<target_vendor_version>/
:device/google/device/vendor_overlay/28/lib/libfoo.so device/google/device/vendor_overlay/28/lib/libbar.so device/google/device/vendor_overlay/28/etc/baz.xml device/google/device/vendor_overlay/28/app/qux.apk
-
Instala los archivos precompilados del proveedor para
product/vendor_overlay
indevice/google/device/device.mk
PRODUCT_COPY_FILES += \ $(call find-copy-subdir-files,*,device/google/device/vendor_overlay,$(TARGET_COPY_OUT_PRODUCT)/vendor_overlay)
-
Define contextos de archivos si los archivos de partición
vendor
de destino tienen contextos distintos devendor_file
. Porque/vendor/lib/*
usa el contextovendor_file
, esta ejemplo no incluye ese directorio.Agrega lo siguiente a
device/google/device-sepolicy/private/file_contexts
:/(product|system/product)/vendor_overlay/[0-9]+/etc(/.*)? u:object_r:vendor_configs_file:s0 /(product|system/product)/vendor_overlay/[0-9]+/app(/.*)? u:object_r:vendor_app_file:s0
-
Permitir que el proceso
init
active la superposición del proveedor en el archivo contextos distintos devendor_file
. Debido a queinit
ya tiene permiso para activarse en el contextovendor_file
este ejemplo no define la política paravendor_file
.Agrega lo siguiente a
device/google/device-sepolicy/public/init.te
:allow init vendor_configs_file:dir mounton; allow init vendor_app_file:dir mounton;
Validar la superposición del proveedor
Para validar la configuración de la superposición de proveedores, agrega archivos en
/product/vendor_overlay/<target_vendor_version>/<overlay_dir>
y comprobar si los archivos están superpuestos sobre los archivos de
/vendor/<overlay_dir>
En las compilaciones de userdebug
, hay un módulo de prueba para Atest:
$ atest -v fs_mgr_vendor_overlay_test
Actualiza a system-as-root
Si quieres actualizar dispositivos que no sean A/B para usar system-as-root, debes actualizar el
esquema de partición para boot.img
y system.img
, establecer
hacia arriba dm-verity y quita las dependencias de inicio en la raíz específica del dispositivo
individuales.
Actualiza particiones
A diferencia de los dispositivos A/B que reutilizan /boot
como
recovery,
Los dispositivos que no sean A/B deben mantener la partición /recovery
separadas, ya que no tienen la partición de ranura de resguardo (por ejemplo,
de boot_a
a boot_b
). Si /recovery
es
el modo de recuperación se elimina en un dispositivo que no es A/B y se hace similar al esquema A/B.
podría fallar durante una actualización con errores en la partición /boot
. Para
por lo que la partición /recovery
debe ser un
partición separada de /boot
para dispositivos que no son A/B, lo que implica
que la imagen de recuperación continúe actualizándose de manera aplazada (que
es igual a la de los dispositivos con Android 8.1.0 o versiones anteriores).
En la siguiente tabla, se indican las diferencias de partición de imagen para dispositivos que no son A/B antes y después de Android 9.
Imagen | Ramdisk (anterior a 9) | Sistema como raíz (después de 9) |
---|---|---|
boot.img |
Contiene un kernel y un ramdisk.img :
ramdisk.img -/ - init.rc - init - etc -> /system/etc - system/ (mount point) - vendor/ (mount point) - odm/ (mount point) ... |
Contiene solo un kernel de inicio normal. |
recovery.img |
Contiene un kernel de recuperación y un
ramdisk.img |
|
system.img |
Contiene lo siguiente:
system.img -/ - bin/ - etc - vendor -> /vendor - ... |
Incluye el contenido combinado del system.img original y
ramdisk.img
system.img -/ - init.rc - init - etc -> /system/etc - system/ - bin/ - etc/ - vendor -> /vendor - ... - vendor/ (mount point) - odm/ (mount point) ... |
Las particiones en sí no cambian; tanto el disco RAM como el sistema como raíz el siguiente esquema de partición:
/boot
/system
/system
/recovery
/vendor
, etcétera
Configurar dm-verity
En el sistema como raíz, el kernel debe activar system.img
en
/
(punto de activación) con
dm-verity. AOSP admite la siguiente dm-verity
para system.img
.
vboot 1.0
Para vboot 1.0, el kernel debe analizar
Específico para Android
metadatos activados
/system
y, luego, convierte a
parámetros de dm-verity para configurar dm-verity (requiere
estos parches de kernel).
En el siguiente ejemplo, se muestra la configuración relacionada con dm-verity para system-as-root en
línea de comandos de kernel:
ro root=/dev/dm-0 rootwait skip_initramfs init=/init dm="system none ro,0 1 android-verity /dev/sda34" veritykeyid=id:7e4333f9bba00adfe0ede979e28ed1920492b40f
vboot 2.0
Para vboot 2.0
(AVB), el bootloader debe integrarse
external/avb/libavb, que luego analiza los
descriptor de hashtree para /system
, convierte
a
parámetros dm-verity y, por último, los pasa al
a través de la línea de comandos del kernel. (Descriptores de Hashtree de /system
puede estar en /vbmeta
o en /system
).
vboot 2.0 requiere los siguientes parches de kernel:
- https://android-review.googlesource.com/#/c/kernel/common/+/158491/
- parches del kernel 4.4, parches del kernel 4.9, etcétera.
En el siguiente ejemplo, se muestra la configuración relacionada con dm-verity para system-as-root en línea de comandos de kernel:
ro root=/dev/dm-0 rootwait skip_initramfs init=/init dm="1 vroot none ro 1,0 5159992 verity 1 PARTUUID=00000016-0000-0000-0000-000000000000 PARTUUID=00000016-0000-0000-0000-000000000000 4096 4096 644999 644999 sha1 d80b4a8be3b58a8ab86fad1b498640892d4843a2 8d08feed2f55c418fb63447fec0d32b1b107e42c 10 restart_on_corruption ignore_zero_blocks use_fec_from_device PARTUUID=00000016-0000-0000-0000-000000000000 fec_roots 2 fec_blocks 650080 fec_start 650080"
Usa carpetas raíz específicas del dispositivo
Con system-as-root, después de la imagen genérica del sistema
(GSI) se instala en el dispositivo (y antes de ejecutar
del paquete de pruebas del proveedor), cualquier
Carpetas raíz específicas del dispositivo agregadas con BOARD_ROOT_EXTRA_FOLDERS
desaparecieron porque todo el contenido del directorio raíz se reemplazó por
la GSI de sistema como raíz. La eliminación de estas carpetas puede provocar que el dispositivo
no se pueden iniciar si existe una dependencia en las carpetas raíz específicas del dispositivo.
(por ejemplo, se usan como puntos de activación).
Para evitar este problema, no uses BOARD_ROOT_EXTRA_FOLDERS
para
agregar carpetas raíz específicas del dispositivo Si necesitas especificar el soporte específico del dispositivo
puntos, usa /mnt/vendor/<mount point>
(agregado en estos
listas de cambios). Estos puntos de activación específicos del proveedor se pueden
especificado directamente en el árbol de dispositivos fstab
(para la primera etapa
activar) y el archivo /vendor/etc/fstab.{ro.hardware}
sin
configuración adicional (ya que fs_mgr
los crea en
/mnt/vendor/*
automáticamente).