KVM (Kernel-based Virtual Machine)
LinuxカーネルにビルトインされたCPU仮想化機能。CPUが持つハードウェア仮想化支援機能(Intel VT-x / AMD-V)を、/dev/kvmというデバイスファイル経由でユーザー空間のプログラムに使わせる。2007年、Linuxカーネル2.6.20にマージされた。 #virtualization #linux
KVM単体ではVMは動かない
KVMはデバイスのエミュレーションを一切やらない。ディスクI/O、ネットワークアダプタ、画面出力、USB、PCIデバイス、ファームウェア(BIOS相当)——これらはすべてKVMの管轄外で、QEMUやFirecracker、Cloud Hypervisorのような「ユーザー空間のVMM」側が担当する。KVMが提供するのは「CPUを仮想的に走らせる」部分だけ。
/dev/kvmとioctlインターフェース
VMMと/dev/kvmの間のやり取りはioctl呼び出しで行われる。
KVM_CREATE_VM— VM用のファイルディスクリプタを作るKVM_CREATE_VCPU— 仮想CPU(1つのLinuxスレッドとして実装される)を割り当てるKVM_SET_USER_MEMORY_REGION— ゲストの物理メモリをVMのアドレス空間にマップするKVM_RUN— 実際にゲストCPUをホストCPU上で直接実行させる
VMMがKVM_RUNを呼ぶと、ゲストのコードがホストCPU上でほぼネイティブ速度で直接実行される。ゲストがI/Oを起こすなど「VM exit」が発生するとKVMから制御がVMM側に戻り、VMM側がそのデバイス動作をエミュレートしてからまたKVMに実行を戻す、というループになっている。
なぜカーネル内蔵なのか
カーネルの一部として動くことで、Linuxが既に持っているプロセススケジューラ・メモリ管理・デバイスドライバの資産をそのまま仮想化にも使い回せる、という設計になっている。
実際に動かしてみる
QEMU等を使わず/dev/kvmのioctlを直接叩いて最小限のVMを起動する実験をkvm-hello-world実験で行った。「VM exit」がどう発生し、ユーザー空間のVMMがどう処理するかを手を動かして確認できる。
このシリーズの文脈での位置づけ
Firecracker・Cloud Hypervisor・crosvmは、いずれもこの「KVMというCPU仮想化の土台」の上に、自前のデバイスモデル(ミニマルなvirtioデバイス群など)を実装したVMMという位置づけになる。rust-vmmのkvm-ioctls/kvm-bindingsクレートは、この/dev/kvmのioctl呼び出しをRustから安全に扱うためのラッパー。
コンテナ向け軽量VM技術の中での位置づけ
Firecracker・Cloud Hypervisor・crosvmが共通して依拠する、Linuxカーネル側のCPU仮想化基盤。