VirtualizationService
주로 crosvm의 인스턴스를 관리하여 Android 시스템에서 실행되는 보호되거나 그렇지 않은 모든 게스트 VM을 관리합니다. VirtualizationService
시스템 서비스 또는 앱이 VM을 시작, 모니터링 및 중지하는 데 사용할 수 있는 AIDL API를 노출합니다.
AIDL API
VirtualizationService
클라이언트가 이미지를 제공하고 VM을 시작하는 데 사용할 수 있는 AIDL API를 노출합니다. 이 설명은 부트로더 또는 커널에 대한 파일 설명자와 VM에 포함할 다양한 디스크 이미지가 있는 원시 VM 구성이거나 클라이언트가 페이로드만 제공하고 VM이 표준 Microdroid 커널 및 인프라로 시작되는 Microdroid 구성일 수 있습니다. . 그런 다음 VirtualizationService
VM을 나타내는 IVirtualMachine
Binder 개체를 반환합니다. VM을 시작한 클라이언트는 일반적인 바인더 메커니즘을 사용하여 바인더 개체를 다른 프로세스와 공유하도록 선택할 수 있습니다.
IVirtualMachine
에는 vsock을 통해 통신하는 데 사용할 수 있는 CID와 같은 VM에 대한 정보를 가져오는 AIDL 메서드가 있으며 VM이 중지될 때 호출되도록 콜백을 등록할 수도 있습니다. Microdroid VM의 경우 IVirtualMachine
개체를 사용하여 VM에 대한 바인더 연결을 설정할 수도 있습니다.
VM 수명 주기
VM에 대한 액세스는 IVirtualMachine
개체에 의해 추적됩니다. IVirtualMachine
개체에 대한 참조가 하나 이상 있는 한 VM은 계속 실행됩니다(충돌하거나 자체적으로 종료되지 않는 한). VM이 종료되기 전에 IVirtualMachine
개체에 대한 모든 참조가 삭제되면 VirtualizationService
자동으로 VM을 종료합니다. 이 프로세스는 VM을 시작한 클라이언트가 low memory killer에 의해 종료되면 VM도 종료되어 리소스 누수를 방지함을 의미합니다.
각 VM은 crosvm의 자체 인스턴스에 의해 관리되며 VirtualizationService
클라이언트 대신 관리합니다. VirtualizationService
필요에 따라 이러한 crosvm 하위 프로세스를 시작하고 VM에 필요한 이미지에 대한 파일 설명자를 전달합니다. 그런 다음 VirtualizationService
자식 프로세스가 종료될 때 이를 모니터링하여 그에 따라 나머지 클라이언트에 알릴 수 있습니다.
VM 패키징
crosvm은 커널과 initrd가 제공되거나 부트로더가 제공되는 두 가지 VM 부팅 방법을 지원합니다. 두 경우 모두 원시 이미지이거나 여러 파티션의 합성물일 수 있는 임의의 수의 디스크 이미지를 제공할 수도 있습니다. 클라이언트는 다양한 이미지를 파일 디스크립터로 제공합니다.
VirtualizationService
필요에 따라 복합 디스크 이미지를 구축합니다. 복합 디스크 파일은 디스크를 구성하는 다양한 파티션 이미지 파일을 내부적으로 참조하기 때문에 이 프로세스가 필요합니다. 이 파일은 클라이언트에서 전달되며 crosvm에서 직접 액세스할 수 없습니다. 이 문제를 해결하기 위해 VirtualizationService
crosvm이 상속한 파일 설명자 번호가 VirtualizationService가 합성 이미지 생성에 사용한 파일 설명자 번호와 동일한지 확인합니다. 복합 디스크 이미지는 /proc/self/fd/N
형식의 파일 이름을 사용하여 각 파티션 파일을 나타냅니다.
Microdroid pVM의 경우 AVF에는 표준 Android Verified Boot 흐름에 따라 복합 디스크 이미지의 파티션에서 커널을 로드하는 부트로더가 포함되어 있습니다.
VM 소켓(vsock)
pVM 간의 통신을 위한 기본 인터페이스는 표준 virtio 소켓 인터페이스인 vsock입니다. 각 VM은 VM이 생성될 때 VirtualizationService
VM에 할당하는 IP 주소와 유사한 32비트 CID(컨텍스트 식별자)로 식별되며 VM이 선택하는 모든 포트 번호에서 서비스를 노출할 수 있습니다. CID는 VM이 실행되는 동안 고유하지만 VM이 종료되고 VM에 대한 모든 IVirtualMachine
Binder 핸들이 삭제된 경우 CID 값을 재활용할 수 있습니다.
디버그 인터페이스
vm
명령은 디버그 목적으로 제공됩니다. 이 명령을 사용하면 개발자가 셸에서 VM을 시작하고 해당 로그를 보고 VM을 종료할 수 있습니다. AVF에서 제공하는 명령줄 도구 및 기타 디버그 인터페이스에 대한 자세한 내용은 https://android.googlesource.com/platform/packages/modules/Virtualization/+/refs/heads/main/docs/debug 를 방문하세요.