VirtualizationService

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가 클라이언트를 대신하여 관리합니다. virtmgrVirtualizationServicevirtualizationserviceVirtualizationServiceInternal에서 부여한 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를 참고하세요.