VirtualizationService
управляет несколькими гостевыми виртуальными машинами, защищенными или нет, работающими в системе Android, в основном путем управления экземплярами crosvm. VirtualizationService
предоставляет AIDL API, который системные службы или приложения могут использовать для запуска, мониторинга и остановки виртуальных машин. Чтобы использовать VirtualizationService
, выполните virtmgr
напрямую или импортируйте javalib или RustLib , которые выполняют virtmgr
как дочерний процесс.
Жизненный цикл виртуальной машины
Доступ к виртуальной машине отслеживается объектом IVirtualMachine
. Пока существует хотя бы одна ссылка на объект IVirtualMachine
, виртуальная машина продолжает работать (если только она не выйдет из строя или не выключится сама по себе). Если все ссылки на объект IVirtualMachine
удаляются до завершения работы виртуальной машины, VirtualizationService
автоматически завершает работу виртуальной машины. Этот процесс подразумевает, что если клиент, запустивший виртуальную машину, завершает работу с помощью средства устранения нехватки памяти, то виртуальная машина также отключается, что предотвращает утечку ресурсов.
Каждая виртуальная машина управляется собственным экземпляром crosvm, которым VirtualizationService
в свою очередь, управляет от имени клиента. VirtualizationService
в virtmgr
запускает эти дочерние процессы crosvm по мере необходимости с выделенными глобальными ресурсами, включая CID, предоставленный VirtualizationServiceInternal
в virtualizationservice
, и передает им дескрипторы файлов для изображений, необходимых виртуальной машине. Затем VirtualizationService
отслеживает дочерние процессы на предмет их смерти, чтобы соответствующим образом уведомить всех оставшихся клиентов.
Упаковка виртуальной машины
crosvm поддерживает два разных способа загрузки виртуальной машины: либо предоставляется ядро и initrd, либо предоставляется загрузчик. В любом случае также может быть предоставлено произвольное количество образов дисков, которые могут быть либо необработанными, либо составными из нескольких разделов. Различные изображения предоставляются клиентом в качестве дескрипторов файлов.
VirtualizationService
создает составные образы дисков по требованию. Этот процесс необходим, поскольку файл составного диска внутренне ссылается на различные файлы образов разделов, составляющие диск, которые передаются клиентом и могут быть недоступны напрямую для crosvm. Чтобы обойти эту проблему, VirtualizationService
гарантирует, что номера файловых дескрипторов, унаследованных crosvm, совпадают с номерами файловых дескрипторов, которые VirtualizationService
использовал при создании составных изображений. Составной образ диска использует имена файлов в формате /proc/self/fd/N
для представления каждого файла раздела.
Для pVM Microdroid AVF включает в себя загрузчик, который загружает ядро из раздела составного образа диска в соответствии со стандартным потоком загрузки Android Verified.
Сокеты виртуальной машины (vsock)
Основным интерфейсом для связи между pVM является vsock, стандартный интерфейс сокетов Virtio. Каждая виртуальная машина идентифицируется 32-битным идентификатором контекста (CID), который аналогичен IP-адресу, который VirtualizationServiceInternal
назначает виртуальной машине, когда VirtualizationService
создает виртуальную машину, и может предоставлять услуги на любых номерах портов, которые выбирает виртуальная машина. CID уникален во время работы виртуальной машины, но значение CID может быть повторно использовано, когда виртуальная машина завершается и все дескрипторы связывания IVirtualMachine
, относящиеся к виртуальной машине, удаляются.
Отладочный интерфейс
Команда vm
предназначена для целей отладки. Эта команда позволяет разработчику запускать виртуальную машину из оболочки, просматривать ее журналы и завершать работу виртуальной машины. С помощью команды vm
или других интерфейсов, предоставляемых AVF, виртуальная машина может запускаться либо в отлаживаемом (FULL), либо в неотлаживаемом (NONE) режиме. Используя отлаживаемую виртуальную машину, вы можете просматривать журналы уровня ОС, получать доступ к оболочке ADB и сохранять аварийный дамп или полезную нагрузку приложения. В рабочей среде рекомендуется использовать неотлаживаемую виртуальную машину. Дополнительную информацию об инструменте командной строки и других интерфейсах отладки, предоставляемых AVF, см. в debug/README.md .