VirtualizationService
主に crosvm のインスタンスを管理することによって、Android システム上で実行される、保護されているかどうかに関係なく、複数のゲスト VM を管理します。 VirtualizationService
、システム サービスまたはアプリが VM の起動、監視、停止に使用できる AIDL API を公開します。 VirtualizationService
を使用するには、 virtmgr
直接実行するか、 virtmgr
子プロセスとして実行するjavalibまたはRustlibをインポートします。
VMのライフサイクル
VM へのアクセスはIVirtualMachine
オブジェクトによって追跡されます。 IVirtualMachine
オブジェクトへの参照が少なくとも 1 つある限り、VM は実行を続けます (クラッシュしたり、自然にシャットダウンしたりしない限り)。 VM がシャットダウンする前にIVirtualMachine
オブジェクトへのすべての参照が削除された場合、 VirtualizationService
VM を自動的にシャットダウンします。このプロセスは、VM を起動したクライアントがメモリ不足キラーによってシャットダウンされた場合、VM もシャットダウンされ、リソース リークが防止されることを意味します。
各 VM は独自の crosvm インスタンスによって管理され、 VirtualizationService
クライアントに代わって管理します。 virtmgr
のVirtualizationService
必要に応じて、 virtualizationservice
のVirtualizationServiceInternal
によって付与された CID を含む割り当てられたグローバル リソースを使用してこれらの crosvm 子プロセスを開始し、VM が必要とするイメージのファイル記述子をそれらに渡します。次にVirtualizationService
子プロセスがいつ終了するかを監視し、残りのクライアントにそれに応じて通知できるようにします。
VMのパッケージ化
crosvm は、VM を起動する 2 つの異なる方法をサポートしています。カーネルと initrd が提供されるか、ブートローダーが提供されます。どちらの場合も、任意の数のディスク イメージを提供することもできます。これは、生のイメージまたは複数のパーティションの複合体のいずれかになります。さまざまなイメージは、クライアントによってファイル記述子として提供されます。
VirtualizationService
オンデマンドで複合ディスク イメージを構築します。このプロセスが必要となるのは、複合ディスク ファイルがディスクを構成するさまざまなパーティション イメージ ファイルを内部的に参照しており、これらのファイルはクライアントによって渡され、crosvm からは直接アクセスできない可能性があるためです。この問題を回避するために、 VirtualizationService
、crosvm によって継承されたファイル記述子番号が、 VirtualizationService
複合イメージの作成に使用したファイル記述子番号と同じであることを保証します。複合ディスク イメージは/proc/self/fd/N
の形式のファイル名を使用して各パーティション ファイルを表します。
Microdroid pVM の場合、AVF には標準の Android 検証ブート フローに従って、複合ディスク イメージのパーティションからカーネルをロードするブートローダーが含まれています。
VM ソケット (vsock)
pVM 間の通信用の主要なインターフェイスは、標準の virtio ソケット インターフェイスである vsock です。各 VM は 32 ビットのコンテキスト識別子 (CID) によって識別されます。これは IP アドレスに似ており、 VirtualizationService
VM を作成するときにVirtualizationServiceInternal
によって VM に割り当てられ、VM が選択する任意のポート番号でサービスを公開できます。 VM の実行中は CID は一意ですが、VM が終了し、VM に対するすべてのIVirtualMachine
バインダー ハンドルが削除された場合、CID 値はリサイクルできます。
デバッグインターフェース
vm
コマンドはデバッグ目的で提供されています。このコマンドを使用すると、開発者はシェルから VM を起動し、そのログを表示し、VM を終了できます。 vm
コマンドまたは AVF が提供する他のインターフェイスを使用すると、VM はデバッグ可能 (FULL) モードまたはデバッグ不可 (NONE) モードのいずれかで起動できます。デバッグ可能な VM を使用すると、OS レベルのログを確認したり、ADB シェルにアクセスしたり、クラッシュダンプやアプリのペイロードをキャプチャしたりできます。実稼働環境ではデバッグ不可能な VM を使用することをお勧めします。 AVF が提供するコマンド ライン ツールおよびその他のデバッグ インターフェイスの詳細については、 debug/README.mdを参照してください。