Служба виртуализации

VirtualizationService управляет несколькими гостевыми виртуальными машинами, защищенными или нет, работающими в системе Android, в основном, путем управления экземплярами crosvm. VirtualizationService предоставляет API AIDL, который системные службы или приложения могут использовать для запуска, мониторинга и остановки виртуальных машин. Для использования 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 для представления каждого файла раздела.

Для Microdroid pVM протокол AVF включает загрузчик, который загружает ядро ​​с раздела составного образа диска в соответствии со стандартным процессом проверки загрузки Android.

Сокеты виртуальных машин (vsock)

Основным интерфейсом для связи между виртуальными машинами (pVM) является vsock, стандартный интерфейс сокетов virtio. Каждая виртуальная машина идентифицируется 32-битным контекстным идентификатором (CID), который аналогичен IP-адресу. VirtualizationServiceInternal назначает виртуальной машине при ее создании службой VirtualizationService и может предоставлять доступ к службам через любые выбранные виртуальной машиной порты. CID уникален во время работы виртуальной машины, но значение CID может быть использовано повторно после завершения работы виртуальной машины и удаления всех дескрипторов IVirtualMachine , связанных с виртуальной машиной.

Отладочный интерфейс

Команда vm предназначена для отладки. Она позволяет разработчику запускать виртуальную машину из командной строки, просматривать её журналы и завершать работу виртуальной машины. С помощью команды vm или других интерфейсов, предоставляемых AVF, виртуальная машина может запускаться как в отлаживаемом (FULL), так и в неотлаживаемом (NONE) режиме. В отлаживаемом режиме виртуальной машины можно просматривать журналы на уровне операционной системы, получать доступ к оболочке ADB и захватывать дампы сбоев или полезную нагрузку приложения. В производственной среде рекомендуется использовать неотлаживаемую виртуальную машину. Дополнительную информацию об инструменте командной строки и других отлаживающих интерфейсах, предоставляемых AVF, см. в файле debug/README.md .