VirtualizationService
verwaltet mehrere geschützte oder andere Gast-VMs, die auf einem Android-System ausgeführt werden, hauptsächlich durch Verwalten von Instanzen von crosvm.
VirtualizationService
stellt eine AIDL API bereit, mit der Systemdienste oder Apps VMs starten, überwachen und beenden können. Wenn Sie VirtualizationService
verwenden möchten, führen Sie virtmgr
direkt aus oder importieren Sie javalib oder rustlib, die virtmgr
als untergeordneten Prozess ausführen.
VM-Lebenszyklus
Der Zugriff auf eine VM wird über das IVirtualMachine
-Objekt erfasst. Solange mindestens ein Verweis auf ein IVirtualMachine
-Objekt vorhanden ist, wird die VM weiter ausgeführt, es sei denn, sie stürzt ab oder wird von selbst heruntergefahren. Wenn alle Verweise auf das IVirtualMachine
-Objekt vor dem Herunterfahren der VM entfernt werden, fährt VirtualizationService
die VM automatisch herunter. Wenn der Client, der die VM gestartet hat, vom Low Memory Killer heruntergefahren wird, wird auch die VM heruntergefahren, um Ressourcenlecks zu vermeiden.
Jede VM wird von ihrer eigenen Instanz von crosvm verwaltet, die wiederum VirtualizationService
im Namen des Clients verwaltet. VirtualizationService
in virtmgr
startet diese untergeordneten Crosvm-Prozesse bei Bedarf mit zugewiesenen globalen Ressourcen, einschließlich der von VirtualizationServiceInternal
in virtualizationservice
gewährten CID, und übergibt ihnen die Dateideskriptoren für die Images, die die VM benötigt. VirtualizationService
überwacht dann den untergeordneten Prozess auf den Zeitpunkt ihrer Absturz, sodass alle verbleibenden Clients entsprechend benachrichtigt werden können.
VM-Verpackung
Crosvm unterstützt zwei verschiedene Möglichkeiten zum Starten einer VM: Entweder werden ein Kernel und initrd bereitgestellt oder ein Bootloader. In beiden Fällen kann auch eine beliebige Anzahl von Laufwerk-Images bereitgestellt werden, die entweder ein Roh-Image oder ein zusammengesetztes Image aus mehreren Partitionen sein kann. Die verschiedenen Bilder werden vom Client als Dateideskriptoren bereitgestellt.
VirtualizationService
erstellt bei Bedarf Images für zusammengesetzte Laufwerke. Dieser Vorgang ist erforderlich, da die zusammengesetzte Laufwerkdatei intern auf die verschiedenen Partitions-Imagedateien verweist, aus denen das Laufwerk besteht. Diese werden vom Client übergeben und sind möglicherweise nicht direkt für crosvm zugänglich. Zur Umgehung dieses Problems sorgt VirtualizationService
dafür, dass die von Crosvm übernommenen Dateideskriptornummern mit den Dateideskriptornummern übereinstimmen, die VirtualizationService
beim Erstellen der zusammengesetzten Images verwendet hat. Im zusammengesetzten Laufwerk-Image werden Dateinamen im Format /proc/self/fd/N
für jede Partitionsdatei verwendet.
Für Microdroid-PVms enthält AVF einen Bootloader, der den Kernel gemäß dem standardmäßigen Android-Verified Boot-Ablauf aus einer Partition eines zusammengesetzten Laufwerk-Images lädt.
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 identifiziert, die einer IP-Adresse entspricht. VirtualizationServiceInternal
weist der VM zu, wenn VirtualizationService
die VM erstellt, und kann Dienste an den von der VM ausgewählten Portnummern verfügbar machen.
Während die VM ausgeführt wird, ist die CID eindeutig. Der CID-Wert kann jedoch wiederverwendet werden, wenn die VM beendet und alle IVirtualMachine
-Binder-Handles zur VM entfernt wurden.
Debug-Oberfläche
Der Befehl vm
wird zur Fehlerbehebung bereitgestellt. Mit diesem Befehl können Entwickler eine VM über die Shell starten, ihre Protokolle ansehen und die VM beenden. Mit dem Befehl vm
oder anderen von AVF bereitgestellten Schnittstellen kann eine VM entweder im debugfähigen (FULL) oder nicht debugfähigen (NONE) Modus gestartet werden. Mit einer debugfähigen VM können Sie Logs auf Betriebssystemebene aufrufen, auf die ADB-Shell zugreifen und Crash-Dumps oder App-Nutzlast erfassen.
Es wird empfohlen, in der Produktion eine nicht Debug-fähige VM zu verwenden. Weitere Informationen zum Befehlszeilentool und anderen Debug-Oberflächen, die AVF bietet, finden Sie unter debug/README.md.