VirtualizationService
verwaltet mehrere geschützte oder andere Gast-VMs, die auf einem Android-System ausgeführt werden, hauptsächlich durch die Verwaltung von Crosvm-Instanzen. VirtualizationService
stellt eine AIDL-API bereit, die Systemdienste oder Apps zum Starten, Überwachen und Stoppen von VMs verwenden können. Um VirtualizationService
zu verwenden, führen Sie virtmgr
direkt aus oder importieren Sie Javalib oder Rustlib , das virtmgr
als untergeordneten Prozess ausführt.
VM-Lebenszyklus
Der Zugriff auf eine VM wird vom IVirtualMachine
-Objekt verfolgt. Solange mindestens ein Verweis auf das IVirtualMachine
Objekt vorhanden ist, wird die VM weiter ausgeführt (es sei denn, sie stürzt ab oder fährt von selbst herunter). Wenn alle Verweise auf das IVirtualMachine
Objekt gelöscht werden, bevor die VM heruntergefahren wird, fährt VirtualizationService
die VM automatisch herunter. Dieser Prozess impliziert, dass, wenn der Client, der die VM gestartet hat, durch den Low-Memory-Killer heruntergefahren wird, auch die VM heruntergefahren wird, wodurch Ressourcenlecks verhindert werden.
Jede VM wird von einer eigenen crosvm-Instanz verwaltet, die VirtualizationService
wiederum im Namen des Clients verwaltet. VirtualizationService
in virtmgr
startet diese untergeordneten Crosvm-Prozesse nach Bedarf mit zugewiesenen globalen Ressourcen, einschließlich der von VirtualizationServiceInternal
in virtualizationservice
gewährten CID, und übergibt ihnen die Dateideskriptoren für die Bilder, die die VM benötigt. VirtualizationService
überwacht dann den untergeordneten Prozess auf seinen Tod, sodass er alle verbleibenden Clients entsprechend benachrichtigen kann.
VM-Verpackung
crosvm unterstützt zwei verschiedene Arten, eine VM zu booten: Entweder werden ein Kernel und initrd bereitgestellt oder es wird ein Bootloader bereitgestellt. In beiden Fällen kann auch eine beliebige Anzahl von Disk-Images bereitgestellt werden, bei denen es sich entweder um ein Roh-Image oder um eine Kombination aus mehreren Partitionen handeln kann. Die verschiedenen Bilder werden vom Client als Dateideskriptoren bereitgestellt.
VirtualizationService
erstellt bei Bedarf zusammengesetzte Festplatten-Images. Dieser Vorgang ist erforderlich, da die zusammengesetzte Festplattendatei intern auf die verschiedenen Partitionsbilddateien verweist, aus denen die Festplatte besteht, die vom Client übergeben werden und auf die crosvm möglicherweise nicht direkt zugreifen kann. Um dieses Problem zu umgehen, stellt VirtualizationService
sicher, dass die von crosvm geerbten Dateideskriptornummern mit den Dateideskriptornummern übereinstimmen, die VirtualizationService
beim Erstellen der zusammengesetzten Images verwendet hat. Das zusammengesetzte Festplatten-Image verwendet Dateinamen in der Form /proc/self/fd/N
um jede Partitionsdatei darzustellen.
Für Microdroid-pVMs enthält AVF einen Bootloader, der den Kernel von einer Partition eines zusammengesetzten Festplatten-Images lädt und dabei dem standardmäßigen Android Verified Boot-Ablauf folgt.
VM-Sockets (vsock)
Die primäre Schnittstelle für die Kommunikation zwischen pVMs ist vsock, eine standardmäßige Virtio-Socket-Schnittstelle. Jede VM wird durch eine 32-Bit-Kontextkennung (CID) identifiziert, die einer IP-Adresse entspricht, die VirtualizationServiceInternal
der VM zuweist, wenn VirtualizationService
die VM erstellt, und Dienste auf den von der VM gewählten Portnummern verfügbar machen kann. Die CID ist während der Ausführung der VM eindeutig, aber der CID-Wert kann wiederverwendet werden, wenn die VM beendet wird und alle IVirtualMachine
Binderhandles für die VM gelöscht wurden.
Debug-Schnittstelle
Der Befehl vm
wird für Debugzwecke bereitgestellt. Mit diesem Befehl kann ein Entwickler eine VM über die Shell starten, ihre Protokolle anzeigen und die VM beenden. Mit dem Befehl vm
oder anderen von AVF bereitgestellten Schnittstellen kann eine VM entweder im debuggbaren (FULL) oder im nicht debuggbaren (NONE) Modus gestartet werden. Mit einer debuggbaren VM können Sie Protokolle auf Betriebssystemebene anzeigen, auf die ADB-Shell zugreifen und Crash-Dumps oder App-Payloads erfassen. Es wird empfohlen, in der Produktion eine nicht debuggbare VM zu verwenden. Weitere Informationen zum Befehlszeilentool und anderen Debugschnittstellen, die AVF bereitstellt, finden Sie unter debug/README.md .