VirtualizationService

VirtualizationService verwaltet mehrere Gast-VMs, geschützte und andere, die auf einem Android-System ausgeführt werden, hauptsächlich durch die Verwaltung von Instanzen von crosvm. VirtualizationService stellt eine AIDL-API bereit, mit der Systemdienste oder Apps VMs starten, überwachen und beenden können. Um VirtualizationService zu verwenden, führen Sie virtmgr direkt aus oder importieren Sie javalib oder rustlib, wodurch virtmgr als untergeordneter Prozess ausgeführt wird.

VM-Lebenszyklus

Der Zugriff auf eine VM wird vom IVirtualMachine-Objekt erfasst. Solange es mindestens eine Referenz auf das IVirtualMachine-Objekt gibt, 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 gelöscht werden, bevor die VM heruntergefahren wird, 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, wodurch Ressourcenlecks verhindert werden.

Jede VM wird von einer eigenen Instanz von crosvm 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 von der VM benötigten Images. VirtualizationService überwacht dann den untergeordneten Prozess, um festzustellen, wann er beendet wird, damit alle verbleibenden Clients entsprechend benachrichtigt werden können.

VM-Verpackung

crosvm unterstützt zwei verschiedene Arten des Bootens einer VM: entweder werden ein Kernel und eine Initramfs bereitgestellt oder ein Bootloader. In beiden Fällen kann auch eine beliebige Anzahl von Datenträger-Images angegeben werden, die entweder ein Rohbild oder ein Zusammenschluss mehrerer Partitionen sein können. Die verschiedenen Bilder werden vom Client als Dateideskriptoren bereitgestellt.

VirtualizationService erstellt zusammengesetzte Laufwerk-Images auf Anfrage. Dieser Vorgang ist erforderlich, da die zusammengesetzte Festplattendatei intern auf die verschiedenen Partitionsabbilddateien verweist, aus denen die Festplatte besteht. Diese werden vom Client übergeben und sind möglicherweise nicht direkt über crosvm zugänglich. Um dieses Problem zu umgehen, sorgt VirtualizationService dafür, dass die von crosvm übernommenen Dateideskriptornummern mit den Dateideskriptornummern übereinstimmen, die VirtualizationService beim Erstellen der zusammengesetzten Bilder verwendet hat. Im zusammengesetzten Datenträger-Image werden Dateinamen im Format /proc/self/fd/N verwendet, um jede Partitionsdatei darzustellen.

Für Microdroid-pVMs enthält AVF einen Bootloader, der den Kernel aus einer Partition eines zusammengesetzten Datenträger-Images lädt. Dabei wird der standardmäßige Android Verified Boot-Ablauf verwendet.

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-Kontext-ID (CID) identifiziert, die einer IP-Adresse entspricht. VirtualizationServiceInternal weist sie der VM zu, wenn VirtualizationService die VM erstellt, und kann Dienste auf beliebigen Portnummern bereitstellen, die die VM auswählt. Die CID ist eindeutig, solange die VM ausgeführt wird. Der CID-Wert kann jedoch wiederverwendet werden, wenn die VM beendet wird und alle IVirtualMachine-Binder-Handles für die VM gelöscht wurden.

Debugging-Schnittstelle

Der Befehl vm wird zu Debugging-Zwecken bereitgestellt. Mit diesem Befehl kann ein Entwickler eine VM über die Shell starten, ihre Logs ansehen und die VM beenden. Mit dem Befehl vm oder anderen von AVF bereitgestellten Schnittstellen kann eine VM entweder im debugfähigen (FULL) oder im nicht debugfähigen (NONE) Modus gestartet werden. Mit einer debugfähigen VM können Sie Protokolle auf Betriebssystemebene aufrufen, auf die ADB-Shell zugreifen und Crash-Dumps oder App-Nutzlasten erfassen. Es wird empfohlen, in der Produktion eine nicht debugfähige VM zu verwenden. Weitere Informationen zum Befehlszeilentool und zu anderen Debugging-Schnittstellen, die AVF bietet, finden Sie unter debug/README.md.