VirtualizationService
는 Android 시스템에서 실행되는 여러 게스트 VM(보호 대상 포함)을 관리합니다. 관리는 주로 crosvm 인스턴스를 관리함으로써 이루어집니다.
VirtualizationService
는 시스템 서비스 또는 앱이 VM을 시작, 모니터링, 중지하는 데 사용할 수 있는 AIDL API를 노출합니다. VirtualizationService
를 사용하려면 virtmgr
를 직접 실행하거나 virtmgr
를 하위 프로세스로 실행하는 javalib 또는 rustlib를 가져옵니다.
VM 수명 주기
VM에 대한 액세스는 IVirtualMachine
객체로 추적됩니다. IVirtualMachine
객체에 대한 참조가 최소 하나 이상 존재하는 한 VM이 (비정상 종료되거나 자체적으로 종료되지 않는 한) 계속해서 실행됩니다. VM이 종료되기 전에 IVirtualMachine
객체에 대한 모든 참조가 삭제되면 VirtualizationService
가 자동으로 VM을 종료합니다. 이 프로세스는 VM을 시작한 클라이언트가 로우 메모리 킬러에 의해 종료되면 VM도 종료되어 리소스 누수가 방지된다는 사실을 암시합니다.
각 VM은 crosvm의 자체 인스턴스에서 관리합니다. crosvm 인스턴스는 VirtualizationService
가 클라이언트를 대신하여 관리합니다. virtmgr
의 VirtualizationService
는 virtualizationservice
의 VirtualizationServiceInternal
에서 부여한 CID를 포함하여 할당된 전역 리소스를 사용하여 필요에 따라 crosvm 하위 프로세스를 시작하고 VM에 필요한 이미지의 파일 설명자를 전달합니다. 그러면 VirtualizationService
는 하위 프로세스가 종료될 때 나머지 클라이언트에 알릴 수 있도록 하위 프로세스의 종료 여부를 모니터링합니다.
VM 패키징
crosvm은 커널 및 initrd를 제공하는 방법과 부트로더를 제공하는 방법, 이렇게 두 가지 방식으로 VM을 부팅합니다. 두 경우 모두 임의 개수의 디스크 이미지를 제공할 수 있습니다. 이는 원시 이미지일 수도 있고, 여러 파티션의 복합 이미지일 수도 있습니다. 클라이언트는 이처럼 다양한 이미지를 파일 설명자로 제공합니다.
VirtualizationService
는 복합 디스크 이미지를 주문형으로 빌드합니다. 이는 반드시 필요한 프로세스입니다. 복합 디스크 파일은 디스크를 구성하는 여러 파티션 이미지 파일을 내부적으로 참조하는데 이는 클라이언트에 의해 전달되므로 crosvm에서 직접 액세스하지 못할 수 있기 때문입니다. 이 문제를 해결하기 위해 VirtualizationService
는 crosvm에서 상속한 파일 설명자 번호가 VirtualizationService
가 복합 이미지를 만들 때 사용한 파일 설명자 번호와 동일한지 확인합니다. 복합 디스크 이미지는 /proc/self/fd/N
형식의 파일 이름을 사용하여 각 파티션 파일을 나타냅니다.
Microdroid pVM의 경우 AVF는 표준 Android 자체 검사 부팅 흐름에 따라 복합 디스크 이미지의 파티션에서 커널을 로드하는 부트로더를 포함합니다.
VM 소켓(vsock)
pVM 간 통신을 위한 기본 인터페이스는 표준 virtio 소켓 인터페이스인 vsock입니다. 각 VM은 32비트 컨텍스트 식별자(CID)로 식별됩니다. CID는 VirtualizationService
가 VM을 만들 때 VirtualizationServiceInternal
가 VM에 할당하는 IP 주소와 유사하며, VM이 선택하는 포트 번호에 서비스를 노출할 수 있습니다.
CID는 VM이 실행되는 동안에는 고유하지만 CID 값은 VM이 종료되고 VM의 모든 IVirtualMachine
바인더 핸들이 삭제되면 재사용될 수 있습니다.
디버그 인터페이스
디버그 용도로 vm
명령어가 제공됩니다. 이 명령어를 사용하면 개발자가 셸에서 VM을 시작하고 로그를 보고 VM을 종료할 수 있습니다. AVF에서 제공하는 vm
명령어 또는 기타 인터페이스를 사용하면 디버그 가능한 (FULL) 모드 또는 디버그 불가능한 (NONE) 모드로 VM을 시작할 수 있습니다. 디버그 가능한 VM을 사용하면 OS 수준 로그를 확인하고, ADB 셸에 액세스하고, 크래시 덤프 또는 앱 페이로드를 캡처할 수 있습니다.
프로덕션에서는 디버그할 수 없는 VM을 사용하는 것이 좋습니다. AVF에서 제공하는 명령줄 도구 및 기타 디버그 인터페이스에 관해 자세히 알아보려면 debug/README.md를 참고하세요.