VirtualizationService

VirtualizationService gère plusieurs VM invitées, protégées ou non, exécutées sur un système Android, principalement en gérant les instances de crosvm. VirtualizationService expose une API AIDL, que les services système ou les applications peuvent utiliser pour démarrer, surveiller et arrêter les VM. Pour utiliser VirtualizationService, exécutez virtmgr directement ou importez javalib ou rustlib, qui exécutent virtmgr en tant que processus enfant.

Cycle de vie d'une VM

L'accès à une VM est suivi par l'objet IVirtualMachine. Tant qu'il existe au moins une référence à l'objet IVirtualMachine, la VM continue de s'exécuter (sauf en cas de plantage ou d'arrêt de sa propre initiative). Si toutes les références à l'objet IVirtualMachine sont supprimées avant l'arrêt de la VM, VirtualizationService arrête automatiquement la VM. Ce processus implique que si le client qui a démarré la VM est arrêté par le programme d'arrêt en cas de faible mémoire, la VM est également arrêtée, ce qui empêche les fuites de ressources.

Chaque VM est gérée par sa propre instance de crosvm, que VirtualizationService gère à son tour pour le compte du client. VirtualizationService dans virtmgr démarre ces processus enfants crosvm selon les besoins avec des ressources globales allouées, y compris le CID accordé par VirtualizationServiceInternal dans virtualizationservice, et leur transmet les descripteurs de fichiers pour les images dont la VM a besoin. VirtualizationService surveille ensuite le processus enfant pour savoir quand ils meurent, afin d'informer les clients restants en conséquence.

Emballage de la VM

Crosvm propose deux méthodes de démarrage d'une VM: un kernel et un initrd sont fournis, ou un bootloader est fourni. Dans les deux cas, un nombre arbitraire d'images de disque peut également être fourni, qui peut être une image brute ou un composite de plusieurs partitions. Les différentes images sont fournies par le client en tant que descripteurs de fichiers.

VirtualizationService crée des images disque composites à la demande. Ce processus est nécessaire, car le fichier de disque composite fait référence en interne aux différents fichiers d'image de partition qui composent le disque, qui sont transmis par le client et qui ne sont peut-être pas directement accessibles par crosvm. Pour contourner ce problème, VirtualizationService s'assure que les numéros de descripteurs de fichiers hérités de crosvm sont les mêmes que les numéros de descripteurs de fichiers que VirtualizationService a utilisés pour créer les images composites. L'image de disque composite utilise des noms de fichier au format /proc/self/fd/N pour représenter chaque fichier de partition.

Pour les pVM Microdroid, l'AVF inclut un bootloader, qui charge le noyau à partir d'une partition d'une image disque composite, en suivant le flux standard de démarrage validé Android.

VM Sockets (vsock)

L'interface principale de communication entre les pVM est vsock, une interface de socket virtio standard. Chaque VM est identifiée par un identifiant de contexte (CID) 32 bits, qui est analogue à une adresse IP, que VirtualizationServiceInternal attribue à la VM lorsque VirtualizationService la crée, et peut exposer des services sur les numéros de port que la VM choisit. Le CID est unique tant que la VM est en cours d'exécution, mais la valeur du CID peut être recyclée lorsque la VM est arrêtée et que tous les gestionnaires de liaison IVirtualMachine vers la VM ont été supprimés.

Interface de débogage

La commande vm est fournie à des fins de débogage. Cette commande permet à un développeur de démarrer une VM à partir du shell, d'afficher ses journaux et de l'arrêter. Avec la commande vm ou d'autres interfaces fournies par AVF, une VM peut démarrer en mode débogable (FULL) ou non débogable (NONE). Avec une VM débogable, vous pouvez consulter les journaux au niveau de l'OS, accéder au shell ADB et capturer un crash-dump ou la charge utile de l'application. Il est recommandé d'utiliser une VM non débogable en production. Pour en savoir plus sur l'outil de ligne de commande et les autres interfaces de débogage fournies par AVF, consultez le fichier debug/README.md.