Service de virtualisation

VirtualizationService gère plusieurs machines virtuelles invitées, protégées ou non, fonctionnant 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 machines virtuelles. Pour utiliser VirtualizationService , exécutez virtmgr directement ou importez javalib ou rustlib qui exécute virtmgr en tant que processus enfant.

Cycle de vie de la machine virtuelle

L'accès à une VM est suivi par l'objet IVirtualMachine . Tant qu'il y a au moins une référence à l'objet IVirtualMachine , la VM continue de s'exécuter (à moins qu'elle ne plante ou ne s'arrête de son propre chef). Si toutes les références à l'objet IVirtualMachine sont supprimées avant l'arrêt de la machine virtuelle, VirtualizationService arrête automatiquement la machine virtuelle. Ce processus implique que si le client qui a démarré la VM est arrêté par le tueur de mémoire faible, la VM est également arrêtée, empêchant ainsi 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 comme requis avec les 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 jusqu'à sa mort, afin de pouvoir informer tous les clients restants en conséquence.

Emballage de machine virtuelle

crosvm prend en charge deux manières différentes de démarrer une VM : soit un noyau et initrd sont fournis, soit un chargeur de démarrage est fourni. Dans les deux cas, un nombre arbitraire d'images disque peut également être fourni, qui peut être soit une image brute, soit un composite de plusieurs partitions. Les différentes images sont fournies par le client sous forme de descripteurs de fichiers.

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

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

Sockets de machine virtuelle (vsock)

L'interface principale pour la communication entre les pVM est vsock, une interface de socket virtio standard. Chaque VM est identifiée par un identifiant de contexte (CID) de 32 bits, analogue à une adresse IP, que VirtualizationServiceInternal attribue à la VM lorsque VirtualizationService crée la VM, et peut exposer les services sur les numéros de port choisis par la VM. Le CID est unique pendant l'exécution de la VM, mais la valeur CID peut être recyclée lorsque la VM est arrêtée et que tous les descripteurs de classeur IVirtualMachine de 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 mettre fin à la VM. Avec la commande vm ou d'autres interfaces fournies par AVF, une VM peut démarrer en mode débogable (FULL) ou non débuggable (NONE). Avec une VM déboguable, vous pouvez consulter les journaux au niveau du système d'exploitation, accéder au shell ADB et capturer le vidage sur incident ou la charge utile de l'application. Il est recommandé d'utiliser une VM non déboguable en production. Pour en savoir plus sur l'outil de ligne de commande et les autres interfaces de débogage fournies par AVF, consultez debug/README.md .