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écute 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 processus de suppression en cas de mémoire insuffisante, la VM est également arrêtée, ce qui évite les fuites de ressources.

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

Packaging de VM

crosvm permet de démarrer une VM de deux manières différentes : en fournissant un noyau et un initrd, ou en fournissant un bootloader. Dans les deux cas, un nombre arbitraire d'images de disque peut également être fourni, qui peut être une image brute ou une composition de plusieurs partitions. Les différentes images sont fournies par le client sous forme de 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 image de partition qui composent le disque, qui sont transmis par le client et qui 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 ceux utilisés par 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 bootloader qui charge le noyau à partir d'une partition d'une image de disque composite, en suivant le flux de démarrage sécurisé Android standard.

Sockets de VM (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, context identifier) de 32 bits, qui est analogue à une adresse IP. VirtualizationServiceInternal l'attribue à la VM lorsque VirtualizationService crée la VM, et peut exposer des services sur les numéros de port choisis par la VM. Le CID est unique pendant l'exécution de la VM, mais sa valeur peut être réutilisée lorsque la VM est arrêtée et que tous les handles de binder 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 le fichier de vidage sur erreur 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 debug/README.md.