VirtualizationService

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クライアントに代わって管理します。 virtmgrVirtualizationService必要に応じて、 virtualizationserviceVirtualizationServiceInternalによって付与された 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を参照してください。