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

VirtualizationService управляет несколькими гостевыми виртуальными машинами, защищёнными или нет, работающими в системе Android, в первую очередь путём управления экземплярами crosvm. VirtualizationService предоставляет API AIDL, который системные службы или приложения могут использовать для запуска, мониторинга и остановки виртуальных машин. Чтобы использовать VirtualizationService , выполните virtmgr напрямую или импортируйте javalib или rustlib , которые запускают virtmgr как дочерний процесс.

Жизненный цикл виртуальной машины

Доступ к виртуальной машине отслеживается объектом IVirtualMachine . Пока существует хотя бы одна ссылка на объект IVirtualMachine , виртуальная машина продолжает работать (если только она не выйдет из строя или не завершит работу сама). Если все ссылки на объект IVirtualMachine будут удалены до завершения работы виртуальной машины, VirtualizationService автоматически завершит её работу. Этот процесс подразумевает, что если клиент, запустивший виртуальную машину, будет остановлен функцией «Low Memory Killer», виртуальная машина также будет остановлена, что предотвращает утечки ресурсов.

Каждая виртуальная машина управляется собственным экземпляром 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 уникален во время работы виртуальной машины, но его значение может быть использовано повторно после завершения работы виртуальной машины и удаления всех дескрипторов привязки IVirtualMachine к ней.

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

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