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 .