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 .