VirtualizationService
gestisce più VM guest, protette o meno,
in esecuzione su un sistema Android, principalmente gestendo le istanze di crosvm.
VirtualizationService
espone un'API AIDL, che i servizi di sistema o le app possono
utilizzare per avviare, monitorare e arrestare le VM. Per utilizzare VirtualizationService
, esegui
virtmgr
direttamente o importa javalib o rustlib che esegue virtmgr
come
processo secondario.
Ciclo di vita della VM
L'accesso a una VM viene monitorato dall'oggetto IVirtualMachine
. Finché è presente
almeno un riferimento all'oggetto IVirtualMachine
, la VM continua a
essere eseguita (a meno che non si arresti in modo anomalo o si spenga di propria iniziativa). Se tutti i riferimenti all'oggetto IVirtualMachine
vengono eliminati prima dell'arresto della VM, VirtualizationService
arresta automaticamente la VM. Questo processo implica
che se il client che ha avviato la VM viene arrestato dal processo di eliminazione per memoria insufficiente,
anche la VM viene arrestata, impedendo così perdite di risorse.
Ogni VM è gestita dalla propria istanza di crosvm, che VirtualizationService
a sua volta gestisce per conto del client. VirtualizationService
in virtmgr
avvia questi processi secondari crosvm in base alle necessità con risorse globali allocate
incluso il CID concesso da VirtualizationServiceInternal
in
virtualizationservice
e passa loro i descrittori di file per le immagini di cui
la VM ha bisogno. VirtualizationService
monitora il processo secondario per quando termina, in modo da poter notificare di conseguenza i client rimanenti.
Packaging della VM
crosvm supporta due modi diversi di avviare una VM: vengono forniti un kernel e initrd oppure un bootloader. In entrambi i casi, possono essere fornite anche un numero arbitrario di immagini disco, che potrebbero essere un'immagine non elaborata o un composito di più partizioni. Le varie immagini vengono fornite dal client come descrittori di file.
VirtualizationService
crea immagini del disco composite on demand. Questa procedura è
necessaria perché il file del disco composito fa riferimento internamente ai vari
file immagine di partizione che compongono il disco, che vengono passati dal client e
potrebbero non essere direttamente accessibili da crosvm. Per risolvere questo problema,
VirtualizationService
garantisce che i numeri dei descrittori di file ereditati da
crosvm siano gli stessi dei numeri dei descrittori di file utilizzati da VirtualizationService
per creare le immagini composite. L'immagine disco composita utilizza nomi di file
nel formato /proc/self/fd/N
per rappresentare ogni file di partizione.
Per le pVM Microdroid, AVF include un bootloader, che carica il kernel da una partizione di un'immagine disco composita, seguendo il flusso di avvio verificato standard di Android.
Socket VM (vsock)
L'interfaccia principale per la comunicazione tra le pVM è vsock, un'interfaccia
socket virtio standard. Ogni VM è identificata da un identificatore di contesto (CID) a 32 bit, analogo a un indirizzo IP, che VirtualizationServiceInternal
assegna alla VM quando VirtualizationService
crea la VM e può esporre i servizi su qualsiasi numero di porta scelto dalla VM.
L'ID client è univoco mentre la VM è in esecuzione, ma il valore dell'ID client può essere riciclato
quando la VM viene terminata e tutti gli handle del binder IVirtualMachine
alla VM
sono stati eliminati.
Interfaccia di debug
Il comando vm
viene fornito a scopo di debug. Questo comando consente a uno sviluppatore
di avviare una VM dalla shell, visualizzarne i log e terminarla. Con il comando vm
o altre interfacce fornite da AVF, una VM può essere avviata in modalità
di debug (FULL) o non di debug (NONE). Con una VM di cui è possibile eseguire il debug, puoi
visualizzare i log a livello di sistema operativo, accedere alla shell ADB e acquisire il dump degli arresti anomali o il payload dell'app.
È consigliabile utilizzare una VM non eseguibile in modalità di debug in produzione. Per saperne di più
sullo strumento a riga di comando e sulle altre interfacce di debug fornite da AVF, consulta
debug/README.md.