Cloud Hypervisorは、Rustで書かれたオープンソースのVMM(仮想マシンモニタ)です。Linux Foundation配下のプロジェクトで、KVM(およびHyper-V)上でクラウド向けのVMを動かすことに絞って設計されています。
この記事では、バイナリを2つ落としてLinuxカーネルとinitramfsを用意し、最小のVMを起動するところまでを実際に手を動かして確認します。最後に、QEMUやFirecrackerとの違いも簡単に整理します。
動作確認した環境
- Ubuntu(Linux 7.0)、x86_64、物理マシン(KVM利用可)
- Cloud Hypervisor v54.0
- ゲストカーネル: cloud-hypervisor/linux のリリース(7.2.8)
1. KVMが使えるか確認する
Cloud Hypervisorは /dev/kvm を使います。まず読み書きできることを確認します。
ls -l /dev/kvm
test -r /dev/kvm -a -w /dev/kvm && echo kvm-ok
kvm-ok と出なければ、kvm グループに自分を追加するか、ACLで権限を付けてください。
sudo usermod -aG kvm $USER # 再ログインが必要
2. バイナリを取得する
GitHubのリリースページに、依存ライブラリを含まない静的リンク版があります。
V=v54.0
curl -sLO https://github.com/cloud-hypervisor/cloud-hypervisor/releases/download/$V/cloud-hypervisor-static
curl -sLO https://github.com/cloud-hypervisor/cloud-hypervisor/releases/download/$V/ch-remote-static
chmod +x *-static
./cloud-hypervisor-static --version
# cloud-hypervisor v54.0
-
cloud-hypervisor: VMM本体 -
ch-remote: 実行中のVMMをREST API経由で操作するクライアント
3. カーネルとinitramfsを用意する
ディスクイメージを作る代わりに、カーネル+initramfsだけで起動します。これなら最小構成で済み、VMMの動きが見やすくなります。
カーネルは、Cloud Hypervisorプロジェクトが配布しているゲスト用のものを使います。
curl -sLO https://github.com/cloud-hypervisor/linux/releases/download/ch-release-v7.2.8-20261009/vmlinux-x86_64
initramfsは、静的リンクのBusyBoxで作ります(Ubuntuなら busybox パッケージのものが静的リンクです)。
mkdir -p rootfs/{bin,proc,sys,dev,etc}
cp /usr/bin/busybox rootfs/bin/
for c in sh ls cat mount uname poweroff ps free; do ln -s busybox rootfs/bin/$c; done
cat > rootfs/init <<'EOF'
#!/bin/busybox sh
mount -t proc proc /proc
mount -t sysfs sys /sys
mount -t devtmpfs dev /dev
echo "Hello from Cloud Hypervisor guest!"
uname -a
exec sh
EOF
chmod +x rootfs/init
(cd rootfs && find . | cpio -o -H newc 2>/dev/null | gzip) > initramfs.gz
4. VMを起動する
./cloud-hypervisor-static \
--api-socket path=ch.sock \
--kernel vmlinux-x86_64 \
--initramfs initramfs.gz \
--cmdline "console=ttyS0" \
--cpus boot=1,max=4 \
--memory size=256M \
--serial tty --console off
ターミナルにカーネルのログが流れ、最後にinitが動きます。
[ 0.381934] Run /init as init process
Hello from Cloud Hypervisor guest!
Linux cloud-hypervisor 7.2.8+ #3 SMP PREEMPT ... x86_64 GNU/Linux
BusyBox v1.37.0 (Ubuntu 1:1.37.0-7ubuntu1) built-in shell (ash)
~ #
手元の環境では、カーネルが起動して /init に到達するまで約0.38秒でした。ファームウェアを挟まずカーネルを直接ロードしているので速いです。
主なオプションの意味は次のとおりです。
| オプション | 意味 |
|---|---|
--kernel |
直接ロードするカーネル(vmlinux またはbzImage) |
--initramfs |
initramfs |
--cmdline |
カーネルコマンドライン。console=ttyS0 でシリアルに出力 |
--cpus boot=1,max=4 |
起動時1vCPU、最大4vCPU(ホットプラグの上限) |
--memory size=256M |
ゲストメモリ |
--api-socket |
REST API用のUNIXソケット |
5. REST APIで実行中のVMを操作する
--api-socket を付けて起動しておくと、別のターミナルから ch-remote で操作できます。
R="./ch-remote-static --api-socket ch.sock"
$R ping
# {"build_version":"v54.0","version":"54.0.0","pid":...,"features":["io_uring","kvm","mshv"]}
一時停止と再開
$R pause
$R info | grep -o '"state":"[A-Za-z]*"' # "state":"Paused"
$R resume
$R info | grep -o '"state":"[A-Za-z]*"' # "state":"Running"
vCPUのホットプラグ
--cpus max=4 で上限を決めておけば、起動後にvCPUを増やせます。
$R resize --cpus 3
ゲストのカーネルログには、次のように出ていました。
ACPI: CPU1 has been hot-added
ACPI: CPU2 has been hot-added
VMを再起動せずに、ACPI経由でvCPUが2つ追加されたことが分かります。
メモリのホットプラグでハマった点
同じ要領でメモリを増やそうとすると、失敗しました。
$R resize --memory 512M
# Memory manager error
# Not enough space in the hotplug RAM region: 268435456 exceeds 0
メモリのホットプラグ領域は起動時に確保しておく必要があります。--memory に hotplug_size を足して起動し直すと、resize がエラーなしで通りました。
--memory size=256M,hotplug_size=1G
CPUは max で、メモリは hotplug_size で上限を決める、と覚えておくと迷いません。
終了
$R shutdown-vmm
6. QEMU・Firecrackerとの違い
触ってみて分かった点と、公式ドキュメントの方針を合わせて整理します。
| QEMU | Firecracker | Cloud Hypervisor | |
|---|---|---|---|
| 言語 | C | Rust | Rust |
| 方針 | 何でもエミュレートできる汎用VMM | マイクロVM特化(サーバーレス向け) | クラウド向けの現代的なVMM |
| デバイス | 非常に多い(レガシーも含む) | 最小限 | virtio中心で、レガシーは絞る |
| ホットプラグ | 対応 | 限定的 | CPU・メモリ・デバイスに対応 |
| VFIO(GPUなどのパススルー) | 対応 | 非対応 | 対応 |
| 操作インターフェース | QMP | REST API | REST API(ch-remote) |
- QEMUとの違い: エミュレーションを広く持たない代わりに、攻撃対象領域とコード量が小さくなります。古いOSや珍しいハードウェアを動かしたいならQEMUが向いています。
- Firecrackerとの違い: 同じRust製で、小さく速いという方向性は近いです。ただしFirecrackerは用途を絞っており、Cloud Hypervisorはホットプラグ・VFIO・vhost-userなど、より汎用的なVM機能を持ちます。短命な大量のマイクロVMならFirecracker、通常のクラウドVMやGPUパススルーが必要ならCloud Hypervisor、というのが目安です。
なお、Kata Containersなど、コンテナを軽量VMで隔離するプロジェクトからもバックエンドとして使われています。
まとめ
- バイナリ2つ、カーネル、initramfsがあれば、数分で最小のLinux VMを起動できる
- カーネルを直接ロードするので、ゲストが
/initに到達するまで約0.4秒 -
--api-socketとch-remoteで、pause/resumeやvCPUホットプラグを実行時に行える - メモリのホットプラグは
hotplug_sizeを起動時に指定しておく必要がある
次の段階として、ディスクイメージ(--disk)とネットワーク(--net)を付けて、本物のOSをブートする構成を試すと理解が深まります。