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

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 .