VirtualizationService

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.

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

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

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

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