VirtualizationService

VirtualizationService主要通过管理 crosvm 实例来管理在 Android 系统上运行的多个受保护或其他方式的来宾 VM。 VirtualizationService公开了一个 AIDL API,系统服务或应用程序可以使用该 API 来启动、监视和停止 VM。要使用VirtualizationService ,请直接执行virtmgr或导入javalibrustlibvirtmgr作为子进程执行。

虚拟机生命周期

对 VM 的访问由IVirtualMachine对象跟踪。只要至少有一个对IVirtualMachine对象的引用,VM 就会继续运行(除非它自行崩溃或关闭)。如果在 VM 关闭之前删除对IVirtualMachine对象的所有引用,则VirtualizationService会自动关闭 VM。这个过程意味着,如果启动VM的客户端被低内存杀手关闭,那么VM也会被关闭,从而防止资源泄漏。

每个虚拟机都由其自己的 crosvm 实例进行管理,而VirtualizationService又代表客户端进行管理。 virtmgr中的VirtualizationService根据需要使用分配的全局资源(包括virtualizationserviceVirtualizationServiceInternal授予的 CID)启动这些 crosvm 子进程,并向它们传递 VM 所需映像的文件描述符。然后, VirtualizationService会监视子进程何时终止,以便相应地通知任何剩余的客户端。

虚拟机包装

crosvm 支持两种不同的虚拟机启动方式:提供内核和 initrd 或提供引导加载程序。在任何一种情况下,都可以提供任意数量的磁盘映像,这些映像可以是原始映像,也可以是多个分区的组合。各种图像由客户端作为文件描述符提供。

VirtualizationService根据需要构建复合磁盘映像。这个过程是必要的,因为复合磁盘文件在内部指的是组成磁盘的各个分区映像文件,这些文件是由客户端传递的,并且可能无法被 crosvm 直接访问。为了解决这个问题, VirtualizationService确保 crosvm 继承的文件描述符编号与VirtualizationService在创建复合映像时使用的文件描述符编号相同。复合磁盘映像使用/proc/self/fd/N形式的文件名来表示每个分区文件。

对于 Microdroid pVM,AVF 包含一个引导加载程序,它按照标准 Android 验证引导流程从复合磁盘映像的分区加载内核。

虚拟机套接字 (vsock)

pVM 之间通信的主要接口是 vsock,一个标准 virtio 套接字接口。每个 VM 由 32 位上下文标识符 (CID) 标识,该标识符类似于 IP 地址,当VirtualizationService创建 VM 时, VirtualizationServiceInternal会将该地址分配给 VM,并且可以在 VM 选择的任何端口号上公开服务。当VM运行时,CID是唯一的,但是当VM终止并且VM的所有IVirtualMachine绑定器句柄都已被删除时,CID值可以被回收。

调试接口

提供vm命令用于调试目的。此命令允许开发人员从 shell 启动 VM、查看其日志以及终止 VM。使用vm命令或 AVF 提供的其他接口,VM 可以以可调试 (FULL) 或不可调试 (NONE) 模式启动。借助可调试虚拟机,您可以查看操作系统级别日志、访问 ADB shell 并捕获故障转储或应用程序负载。建议在生产中使用不可调试的虚拟机。有关 AVF 提供的命令行工具和其他调试接口的更多信息,请参阅debug/README.md