VirtualizationService

VirtualizationService 주로 crosvm 인스턴스를 관리하여 Android 시스템에서 실행되는 보호되거나 다른 방식으로 실행되는 여러 게스트 VM을 관리합니다. VirtualizationService 시스템 서비스 또는 앱이 VM을 시작, 모니터링 및 중지하는 데 사용할 수 있는 AIDL API를 노출합니다. VirtualizationService 사용하려면 virtmgr 직접 실행하거나 virtmgr 하위 프로세스로 실행하는 javalib 또는 Rustlib를 가져옵니다.

VM 수명주기

VM에 대한 액세스는 IVirtualMachine 개체에 의해 추적됩니다. IVirtualMachine 개체에 대한 참조가 하나 이상 있는 한 VM은 계속 실행됩니다(자체적으로 충돌하거나 종료되지 않는 한). VM이 종료되기 전에 IVirtualMachine 개체에 대한 모든 참조가 삭제되면 VirtualizationService 자동으로 VM을 종료합니다. 이 프로세스는 VM을 시작한 클라이언트가 메모리 부족 킬러에 의해 종료되면 VM도 종료되어 리소스 누수를 방지함을 의미합니다.

각 VM은 VirtualizationService 클라이언트를 대신하여 관리하는 자체 crosvm 인스턴스에 의해 관리됩니다. virtmgrVirtualizationService virtualizationserviceVirtualizationServiceInternal 에서 부여한 CID를 포함하여 할당된 전역 리소스를 사용하여 필요에 따라 이러한 crosvm 하위 프로세스를 시작하고 VM에 필요한 이미지에 대한 파일 설명자를 전달합니다. 그런 다음 VirtualizationService 하위 프로세스가 종료되는 시점을 모니터링하여 그에 따라 나머지 클라이언트에게 알릴 수 있습니다.

VM 패키징

crosvm은 VM을 부팅하는 두 가지 방법을 지원합니다. 커널과 initrd가 제공되거나 부트로더가 제공됩니다. 두 경우 모두 임의 개수의 디스크 이미지가 제공될 수 있으며, 이는 원시 이미지이거나 여러 파티션의 합성일 수 있습니다. 클라이언트는 다양한 이미지를 파일 설명자로 제공합니다.

VirtualizationService 필요에 따라 복합 디스크 이미지를 구축합니다. 복합 디스크 파일은 클라이언트가 전달하고 crosvm에서 직접 액세스할 수 없는 디스크를 구성하는 다양한 파티션 이미지 파일을 내부적으로 참조하기 때문에 이 프로세스가 필요합니다. 이 문제를 해결하기 위해 VirtualizationService crosvm이 상속한 파일 설명자 번호가 VirtualizationService 합성 이미지 생성에 사용한 파일 설명자 번호와 동일한지 확인합니다. 복합 디스크 이미지는 /proc/self/fd/N 형식의 파일 이름을 사용하여 각 파티션 파일을 나타냅니다.

Microdroid pVM의 경우 AVF에는 표준 Android 자체 검사 부팅 흐름에 따라 복합 디스크 이미지의 파티션에서 커널을 로드하는 부트로더가 포함되어 있습니다.

VM 소켓(vsock)

pVM 간 통신을 위한 기본 인터페이스는 표준 virtio 소켓 인터페이스인 vsock입니다. 각 VM은 VirtualizationService 가 VM을 생성할 때 VirtualizationServiceInternal 이 VM에 할당하고 VM이 선택하는 모든 포트 번호에 서비스를 노출할 수 있는 IP 주소와 유사한 32비트 CID(컨텍스트 식별자)로 식별됩니다. CID는 VM이 ​​실행되는 동안 고유하지만 VM이 종료되고 VM에 대한 모든 IVirtualMachine 바인더 핸들이 삭제되면 CID 값이 재활용될 수 있습니다.

디버그 인터페이스

vm 명령은 디버그 목적으로 제공됩니다. 이 명령을 사용하면 개발자는 셸에서 VM을 시작하고 해당 로그를 보고 VM을 종료할 수 있습니다. vm 명령 또는 AVF에서 제공하는 다른 인터페이스를 사용하면 VM은 디버그 가능(FULL) 또는 디버그 불가능(NONE) 모드에서 시작할 수 있습니다. 디버그 가능한 VM을 사용하면 OS 수준 로그를 보고, ADB 셸에 액세스하고, 크래시 덤프 또는 앱 페이로드를 캡처할 수 있습니다. 프로덕션에서는 디버그할 수 없는 VM을 사용하는 것이 좋습니다. AVF가 제공하는 명령줄 도구 및 기타 디버그 인터페이스에 대한 자세한 내용은 debug/README.md를 참조하세요.