Servicio de virtualización

VirtualizationService gestiona múltiples máquinas virtuales invitadas, protegidas o no, que se ejecutan en un sistema Android, principalmente mediante la gestión de instancias de crosvm. VirtualizationService expone una API AIDL, que los servicios o aplicaciones del sistema pueden usar para iniciar, monitorear y detener máquinas virtuales. Para usar VirtualizationService , ejecute virtmgr directamente o importe javalib o Rustlib que ejecuta virtmgr como un proceso secundario.

ciclo de vida de la máquina virtual

El objeto IVirtualMachine realiza un seguimiento del acceso a una máquina virtual. Mientras haya al menos una referencia al objeto IVirtualMachine , la VM continúa ejecutándose (a menos que falle o se apague por sí sola). Si todas las referencias al objeto IVirtualMachine se eliminan antes de que se apague la VM, VirtualizationService apaga automáticamente la VM. Este proceso implica que si el cliente que inició la VM es apagado por el asesino de baja memoria, entonces la VM también se apaga, evitando así fugas de recursos.

Cada VM es administrada por su propia instancia de crosvm, que VirtualizationService a su vez administra en nombre del cliente. VirtualizationService en virtmgr inicia estos procesos secundarios de crosvm según sea necesario con recursos globales asignados, incluido el CID otorgado por VirtualizationServiceInternal en virtualizationservice , y les pasa los descriptores de archivos para las imágenes que la VM necesita. VirtualizationService luego monitorea el proceso secundario para saber cuándo muere, de modo que pueda notificar a los clientes restantes en consecuencia.

Empaquetado de máquinas virtuales

crosvm admite dos formas diferentes de iniciar una VM: se proporcionan un kernel e initrd o se proporciona un gestor de arranque. En cualquier caso, también se puede proporcionar una cantidad arbitraria de imágenes de disco, que pueden ser una imagen sin formato o una combinación de varias particiones. El cliente proporciona las distintas imágenes como descriptores de archivos.

VirtualizationService crea imágenes de disco compuestas bajo demanda. Este proceso es necesario porque el archivo de disco compuesto hace referencia internamente a los distintos archivos de imagen de partición que componen el disco, que pasa el cliente y es posible que crosvm no pueda acceder directamente a ellos. Para solucionar este problema, VirtualizationService garantiza que los números de descriptor de archivo heredados por crosvm sean los mismos que los números de descriptor de archivo que VirtualizationService utilizó para crear las imágenes compuestas. La imagen de disco compuesta utiliza nombres de archivo en el formato /proc/self/fd/N para representar cada archivo de partición.

Para los pVM de Microdroid, AVF incluye un gestor de arranque, que carga el kernel desde una partición de una imagen de disco compuesta, siguiendo el flujo de arranque verificado estándar de Android.

Enchufes de máquina virtual (vsock)

La interfaz principal para la comunicación entre pVM es vsock, una interfaz de socket virtio estándar. Cada VM se identifica mediante un identificador de contexto (CID) de 32 bits, que es análogo a una dirección IP, que VirtualizationServiceInternal asigna a la VM cuando VirtualizationService crea la VM y puede exponer servicios en cualquier número de puerto que la VM elija. El CID es único mientras la máquina virtual se está ejecutando, pero el valor de CID se puede reciclar cuando la máquina virtual finaliza y se eliminan todos los identificadores del cuaderno IVirtualMachine de la máquina virtual.

Interfaz de depuración

El comando vm se proporciona con fines de depuración. Este comando permite a un desarrollador iniciar una VM desde el shell, ver sus registros y finalizar la VM. Con el comando vm u otras interfaces proporcionadas por AVF, una VM puede iniciarse en modo depurable (COMPLETO) o no depurable (NINGUNO). Con la máquina virtual depurable, puede ver registros a nivel del sistema operativo, acceder al shell ADB y capturar volcados de falla o carga útil de la aplicación. Se recomienda utilizar una máquina virtual no depurable en producción. Para obtener más información sobre la herramienta de línea de comandos y otras interfaces de depuración que proporciona AVF, consulte debug/README.md .