VirtualizationService

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 eine Referenz auf das 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. Bei diesem Verfahren wird davon ausgegangen, dass die VM ebenfalls heruntergefahren wird, wenn der Client, der die VM gestartet hat, vom Low Memory Killer beendet wird. So werden Ressourcenlecks verhindert.

Jede VM wird von einer eigenen Instanz von crosvm verwaltet, die VirtualizationService wiederum im Namen des Kunden 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, um alle verbleibenden Clients entsprechend zu benachrichtigen.

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. Dies kann entweder ein Roh-Image oder ein zusammengesetztes Image aus mehreren Partitionen sein. Die verschiedenen Bilder werden vom Client als Dateideskriptoren bereitgestellt.

VirtualizationService erstellt zusammengesetzte Laufwerk-Images auf Abruf. 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. 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 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-Kontext-ID (CID) identifiziert, die analog zu einer IP-Adresse ist. Diese wird von VirtualizationService beim Erstellen der VM zugewiesen und kann Dienste an beliebigen Portnummern der VM bereitstellen.VirtualizationServiceInternal Die CID ist eindeutig, solange die VM ausgeführt wird. Der CID-Wert kann jedoch wiederverwendet werden, wenn die VM beendet und alle IVirtualMachine-Binder-Handles für die VM gelöscht wurden.

Debug-Oberfläche

Der Befehl vm dient zu Debugging-Zwecken. 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 debuggbare VM zu verwenden. Weitere Informationen zum Befehlszeilentool und anderen Debug-Oberflächen, die AVF bietet, finden Sie unter debug/README.md.