2025 年 3 月 27 日より、AOSP のビルドとコントリビューションには aosp-main
ではなく android-latest-release
を使用することをおすすめします。詳細については、AOSP の変更をご覧ください。
VirtualizationService
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
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 をご覧ください。
このページのコンテンツやコードサンプルは、コンテンツ ライセンスに記載のライセンスに従います。Java および OpenJDK は Oracle および関連会社の商標または登録商標です。
最終更新日 2025-04-04 UTC。
[[["わかりやすい","easyToUnderstand","thumb-up"],["問題の解決に役立った","solvedMyProblem","thumb-up"],["その他","otherUp","thumb-up"]],[["必要な情報がない","missingTheInformationINeed","thumb-down"],["複雑すぎる / 手順が多すぎる","tooComplicatedTooManySteps","thumb-down"],["最新ではない","outOfDate","thumb-down"],["翻訳に関する問題","translationIssue","thumb-down"],["サンプル / コードに問題がある","samplesCodeIssue","thumb-down"],["その他","otherDown","thumb-down"]],["最終更新日 2025-04-04 UTC。"],[],[],null,["# VirtualizationService\n\n`VirtualizationService` manages multiple guest VMs, protected or otherwise,\nrunning on an Android system, primarily by managing instances of crosvm.\n`VirtualizationService` exposes an AIDL API, which system services or apps can\nuse to start, monitor, and stop VMs. To use `VirtualizationService`, execute\n`virtmgr` directly or import [javalib](https://cs.android.com/android/platform/superproject/+/main:packages/modules/Virtualization/javalib/ \"javalib\") or [rustlib](https://cs.android.com/android/platform/superproject/+/main:packages/modules/Virtualization/vmclient/ \"rustlib\") which executes `virtmgr` as\na child process.\n\nVM lifecycle\n------------\n\nAccess to a VM is tracked by the `IVirtualMachine` object. As long as there's\nat least one reference to `IVirtualMachine` object then the VM continues to\nrun (unless it crashes or shuts down of its own accord). If all references to\nthe `IVirtualMachine` object are dropped before the VM shuts down, then\n`VirtualizationService` automatically shuts down the VM. This process implies\nthat if the client that started the VM is shut down by the low memory killer,\nthen the VM is also shut down, thus preventing resource leaks.\n\nEach VM is managed by its own instance of crosvm, which `VirtualizationService`\nin turn manages on behalf of the client. `VirtualizationService` in `virtmgr`\nstarts these crosvm child processes as required with allocated global resources\nincluding the CID granted by `VirtualizationServiceInternal` in\n`virtualizationservice`, and passes them the file descriptors for the images the\nVM needs. `VirtualizationService` then monitors the child process for when they\ndie, so it can notify any remaining clients accordingly.\n\nVM packaging\n------------\n\ncrosvm supports two different ways of booting a VM: either a kernel and initrd\nare provided or a bootloader is provided. In either case, an\narbitrary number of disk images can also be provided, which might be either\na raw image or a composite of several partitions. The various images are\nprovided by the client as file descriptors.\n\n`VirtualizationService` builds composite disk images on demand. This process is\nnecessary because the composite disk file refers internally to the various\npartition image files composing the disk, which are passed by the client and\nmight not be directly accessible by crosvm. To get around this issue,\n`VirtualizationService` ensures that the file descriptor numbers inherited by\ncrosvm are the same as the file descriptor numbers which `VirtualizationService`\nused in creating the composite images. The composite disk image uses filenames\nin the form to `/proc/self/fd/N` to represent each partition file.\n\nFor Microdroid pVMs, AVF includes a bootloader, which loads the kernel from\na partition of a composite disk image, following the standard Android\nVerified Boot flow.\n\nVM Sockets (vsock)\n------------------\n\nThe primary interface for communication between pVMs is vsock, a standard\nvirtio socket interface. Each VM is identified by a 32-bit context identifier\n(CID), which is analogous to an IP address, which\n`VirtualizationServiceInternal` assigns to the VM when `VirtualizationService`\ncreates the VM, and can expose services on whatever port numbers the VM chooses.\nThe CID is unique while the VM is running, but the CID value can be recycled\nwhen the VM is terminated and all the `IVirtualMachine` binder handles to the VM\nhave been dropped.\n\nDebug interface\n---------------\n\nThe `vm` command is provided for debug purposes. This command lets a developer\nstart a VM from the shell, view its logs, and terminate the VM. With the `vm`\ncommand or other interfaces provided by AVF, a VM can start in either\ndebuggable (FULL) or non-debuggable (NONE) mode. With a debuggable VM, you can\nsee OS-level logs, access the ADB shell, and capture crash-dump or app payload.\nIt's recommended to use a non-debuggable VM in production. For more on\nthe command line tool and other debug interfaces that AVF provides, see\n[debug/README.md](https://cs.android.com/android/platform/superproject/+/android-latest-release:packages/modules/Virtualization/docs/debug/README.md \"Debugging protected VMs\")."]]