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

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. Каждая VM идентифицируется 32-битным идентификатором контекста (CID), который аналогичен IP-адресу, который VirtualizationServiceInternal назначает VM, когда VirtualizationService создает VM, и может предоставлять службы на любых номерах портов, которые выбирает VM. CID уникален, пока VM работает, но значение CID может быть повторно использовано, когда VM завершается, и все дескрипторы привязки IVirtualMachine к VM были удалены.

Интерфейс отладки

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