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