VirtualizationService
gerencia várias VMs convidadas, protegidas ou não, em execução em um sistema Android, principalmente gerenciando instâncias de crosvm. VirtualizationService
expõe uma API AIDL, que serviços ou aplicativos do sistema podem usar para iniciar, monitorar e parar VMs. Para usar VirtualizationService
, execute virtmgr
diretamente ou importe javalib ou rustlib que executa virtmgr
como um processo filho.
Ciclo de vida da VM
O acesso a uma VM é rastreado pelo objeto IVirtualMachine
. Contanto que haja pelo menos uma referência ao objeto IVirtualMachine
, a VM continuará em execução (a menos que trave ou desligue por conta própria). Se todas as referências ao objeto IVirtualMachine
forem descartadas antes do encerramento da VM, o VirtualizationService
desligará automaticamente a VM. Este processo implica que se o cliente que iniciou a VM for encerrado pelo assassino de pouca memória, a VM também será desligada, evitando assim vazamentos de recursos.
Cada VM é gerenciada por sua própria instância do crosvm, que VirtualizationService
por sua vez, gerencia em nome do cliente. VirtualizationService
em virtmgr
inicia esses processos filhos crosvm conforme necessário com recursos globais alocados, incluindo o CID concedido por VirtualizationServiceInternal
em virtualizationservice
e passa a eles os descritores de arquivo para as imagens que a VM precisa. VirtualizationService
então monitora o processo filho quando ele morre, para que possa notificar quaisquer clientes restantes adequadamente.
Embalagem de VM
O crosvm suporta duas maneiras diferentes de inicializar uma VM: um kernel e um initrd são fornecidos ou um gerenciador de inicialização é fornecido. Em ambos os casos, um número arbitrário de imagens de disco também pode ser fornecido, que pode ser uma imagem bruta ou uma composição de diversas partições. As diversas imagens são fornecidas pelo cliente como descritores de arquivos.
VirtualizationService
cria imagens de disco compostas sob demanda. Este processo é necessário porque o arquivo de disco composto refere-se internamente aos vários arquivos de imagem de partição que compõem o disco, que são passados pelo cliente e podem não ser diretamente acessíveis pelo crosvm. Para contornar esse problema, VirtualizationService
garante que os números do descritor de arquivo herdados pelo crosvm sejam iguais aos números do descritor de arquivo que VirtualizationService
usou na criação das imagens compostas. A imagem de disco composta usa nomes de arquivos no formato /proc/self/fd/N
para representar cada arquivo de partição.
Para pVMs Microdroid, o AVF inclui um bootloader, que carrega o kernel de uma partição de uma imagem de disco composta, seguindo o fluxo padrão do Android Verified Boot.
Soquetes VM (vsock)
A interface principal para comunicação entre pVMs é vsock, uma interface de soquete virtio padrão. Cada VM é identificada por um identificador de contexto (CID) de 32 bits, que é análogo a um endereço IP, que VirtualizationServiceInternal
atribui à VM quando VirtualizationService
cria a VM e pode expor serviços em quaisquer números de porta que a VM escolher. O CID é exclusivo enquanto a VM está em execução, mas o valor do CID pode ser reciclado quando a VM for encerrada e todos os identificadores do fichário IVirtualMachine
para a VM forem eliminados.
Interface de depuração
O comando vm
é fornecido para fins de depuração. Este comando permite que um desenvolvedor inicie uma VM a partir do shell, visualize seus logs e encerre a VM. Com o comando vm
ou outras interfaces fornecidas pelo AVF, uma VM pode iniciar no modo depurável (FULL) ou não depurável (NONE). Com a VM depurável, você pode ver logs no nível do sistema operacional, acessar o shell ADB e capturar despejos de memória ou carga útil do aplicativo. É recomendado usar uma VM não depurável em produção. Para obter mais informações sobre a ferramenta de linha de comando e outras interfaces de depuração fornecidas pelo AVF, consulte debug/README.md .