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の管轄外で、QEMUFirecrackerCloud 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がどう処理するかを手を動かして確認できる。

このシリーズの文脈での位置づけ

FirecrackerCloud Hypervisorcrosvmは、いずれもこの「KVMというCPU仮想化の土台」の上に、自前のデバイスモデル(ミニマルなvirtioデバイス群など)を実装したVMMという位置づけになる。rust-vmmkvm-ioctls/kvm-bindingsクレートは、この/dev/kvmのioctl呼び出しをRustから安全に扱うためのラッパー。

コンテナ向け軽量VM技術の中での位置づけ

FirecrackerCloud Hypervisorcrosvmが共通して依拠する、Linuxカーネル側のCPU仮想化基盤。

出典

作成日時: 2026-08-12 23:36 / 更新日時: 2026-08-13 22:06