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 .