1. クイックスタート:5分でCloud-Hypervisor MicroVMを起動する
従来のQEMU/KVM仮想マシンの起動に15〜30秒かかるのは一般的です。しかし、Cloud-Hypervisorを使えば、この起動時間を80ms未満に短縮できます。Rustで書かれたこのオープンソースプロジェクトは、PS/2キーボードや古いPCIバスといった不要なレガシーハードウェアを完全に排除しています。これにより、極限まで無駄を削ぎ落とした、安全かつ超軽量な仮想マシンを瞬時に手に入れることができます。
ステップ1:KVMハードウェア要件の確認
まず、ホストマシンのCPUがハードウェア仮想化(Intel VT-xまたはAMD-V)に対応している必要があります。CPUフラグと/dev/kvmデバイスへのアクセス権限を確認しましょう:
# 戻り値が0より大きければCPUが対応
egrep -c '(vmx|svm)' /proc/cpuinfo
# sudoなしで実行できるよう、現在のユーザーをkvmグループに追加
sudo usermod -aG kvm $USER
newgrp kvm
ls -l /dev/kvm
ステップ2:Cloud-Hypervisorの静的バイナリを取得
libvirtやqemu-system-x86のような大量の依存パッケージをインストールする代わりに、Cloud-Hypervisorは外部ライブラリに依存しない静的バイナリ(static binary)を提供しています:
mkdir -p ~/microvm && cd ~/microvm
# GitHubから最新リリースを自動取得
CH_VER=$(curl -s https://api.github.com/repos/cloud-hypervisor/cloud-hypervisor/releases/latest | grep tag_name | cut -d '"' -f 4)
wget https://github.com/cloud-hypervisor/cloud-hypervisor/releases/download/${CH_VER}/cloud-hypervisor
wget https://github.com/cloud-hypervisor/cloud-hypervisor/releases/download/${CH_VER}/ch-remote
chmod +x cloud-hypervisor ch-remote
sudo mv cloud-hypervisor ch-remote /usr/local/bin/
ステップ3:カーネルとディスクイメージの準備
Cloud-Hypervisorは、GRUBなどのブートローダーを経由せず、ファームウェアまたは非圧縮カーネルをメモリへ直接ロードします。最適化されたファームウェアとUbuntu Cloudイメージをダウンロードします:
# Cloud-Hypervisorのvirtio向けに最適化されたファームウェアを取得
wget https://github.com/cloud-hypervisor/cloud-hypervisor/releases/download/v40.0/hypervisor-fw
# Ubuntu 22.04 LTS Cloud Image(raw形式)を取得
wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.raw
# ヒント:コンソールログイン用にcloud-localdsでcloud-image用のユーザー/パスワードを作成
sudo apt install -y cloud-image-utils
cat > user-data << 'EOF'
#cloud-config
password: admin
chpasswd: { expire: False }
ssh_pwauth: True
EOF
touch meta-data
cloud-localds seed.img user-data meta-data
ステップ4:最初のMicroVMを起動する
cloud-hypervisor \
--kernel ./hypervisor-fw \
--disk path=jammy-server-cloudimg-amd64.raw path=seed.img \
--cpus boot=2 \
--memory size=1024M \
--console off \
--serial tty
Ubuntuのログインプロンプトがほぼ瞬時に表示されます。この時点でホストマシン上で仮想化プロセス全体が消費するRAMは、わずか約20MBに過ぎません。
2. Rust製MicroVMのアーキテクチャ:なぜCloud-Hypervisorが優れているのか?
メモリ安全性と最小限のアタックサーフェス
QEMUは20年以上前(2003年)にPCコンポーネント全体をエミュレートする目的で誕生しました。数百万行に及ぶC言語のコードベースは、バッファオーバーフローやポインタ管理に関する数多くのCVE(脆弱性)を引き起こしてきました。これに対し、IntelとLinux Foundationはrust-vmmをベースにしてCloud-Hypervisorを開発しました。
- メモリ安全性(Memory Safety):Rustはガベージコレクターを必要とせず、コンパイル時にデータ競合やuse-after-freeを根本から防止します。
- 極小のアタックサーフェス(Attack Surface):サウンドチップ、フロッピーディスク、肥大化した16ビットBIOSなどは一切存在しません。すべてのI/Oはvirtioインターフェース(virtio-net、virtio-block、virtio-fs、virtio-vsock)を介して標準化されています。
- 超低オーバーヘッド:QEMUプロセスが静的に約100MB〜150MBのRAMを消費するのに対し、Cloud-Hypervisorは約15MB〜25MBしか消費しません。64GB RAMのベアメタルノード1台で、500〜800台のMicroVMを容易に同時稼働させることが可能です。
ダイレクトカーネルブート(Direct Kernel Boot)の仕組み
従来のブートシーケンスは、Hardware Init -> UEFI/BIOS -> GRUB -> Load Kernel -> Initramfs -> Systemd という6つのステップを経由します。このプロセスには通常10〜25秒かかります。
Cloud-HypervisorはKVMを活用してショートカットを行います。ハイパーバイザがカーネルをゲストのRAMに直接コピーし、CPUのインストラクションポインタをカーネルのエントリポイントに設定します。このアプローチにより、ハードウェアエミュレーションとGRUBメニューが完全にスキップされ、わずか60〜80ミリ秒でシステムが使用可能になります。
3. REST APIとch-remoteによる自動化
サーバーレス環境やCI/CDランナーのインフラでは、リクエストごとに仮想マシンを即座に作成・破棄する必要があります。Cloud-Hypervisorは、Unixドメインソケットを介した完全な制御をサポートしています。
デーモンとしてハイパーバイザを実行
バックグラウンドでプロセスを起動し、制御用ソケットを開きます:
cloud-hypervisor --api-socket /tmp/ch-api.sock &
CLIツール「ch-remote」による仮想マシンの制御
# 1. MicroVMのスペック定義(2 vCPU、2GB RAM、1 ディスク)
ch-remote --api-socket /tmp/ch-api.sock create '{
"cpus": {"boot_vcpus": 2, "max_vcpus": 4},
"memory": {"size": 2147483648},
"payload": {"kernel": "/home/ubuntu/microvm/hypervisor-fw"},
"disks": [{"path": "/home/ubuntu/microvm/jammy-server-cloudimg-amd64.raw"}],
"net": [{"tap": "tap0"}]
}'
# 2. MicroVMの起動
ch-remote --api-socket /tmp/ch-api.sock boot
# 3. メトリクスとステータスの確認
ch-remote --api-socket /tmp/ch-api.sock info
# 4. 一時停止(pause)と再開(resume)
ch-remote --api-socket /tmp/ch-api.sock pause
ch-remote --api-socket /tmp/ch-api.sock resume
cURLを使ったパイプラインへの直接統合
ワーカーノードやBashスクリプトに追加のch-remoteバイナリをインストールする必要はありません。cURLを使って直接制御可能です:
curl -X PUT --unix-socket /tmp/ch-api.sock \
http://localhost/api/v1/vm.boot
4. 本番環境(Production)および自宅ラボ(Homelab)からの実践的なTips
CI/CDテストスイート向けに80台以上のランナーを運用する実際の環境では、I/Oとネットワークの最適化がサーバーコストに直結します。ここでは、特に重要な3つのチューニングを紹介します:
Tips 1:NFSの代わりにvirtiofsdを使って超高速ファイル共有を実現
仮想マシンにNFSやSSHFSをマウントすると、深刻なIOPSのボトルネックが発生しがちです。Rustで書かれたデーモンvirtiofsdは、DAX(Direct Access)経由でホストのページキャッシュをゲストへ直接マッピングします。これにより、ループバック経由の低速なNFS(約200MB/s)に対し、最大850MB/sの読み書き速度を達成できます:
# ホスト側でvirtiofsdデーモンを起動
/usr/libexec/virtiofsd --socket-path=/tmp/vfs.sock --shared-dir=/data/cache --cache=always &
# fsパラメータを指定してMicroVMを起動
cloud-hypervisor \
--api-socket /tmp/ch.sock \
--fs tag=cachefs,socket=/tmp/vfs.sock
MicroVM内では、mount -t virtiofs cachefs /mnt というシンプルなコマンドを実行するだけです。
Tips 2:Linux TAPブリッジによる安定したネットワーク構成
ユーザーモードネットワーク(SLIRP)は速度が遅く、CPU負荷も高くなります。本番環境では、TAPインターフェースを設定して内部ネットワークブリッジに直接接続することを推奨します:
# 現在のユーザーに権限を付与したtap0インターフェースを作成し、ブリッジbr0に追加
sudo ip tuntap add dev tap0 mode tap user $USER
sudo ip link set tap0 master br0
sudo ip link set tap0 up
Tips 3:Snapshot & Restoreによるアプリケーション起動の高速化
サーバーレス用途では、OS起動の80msすらさらに最適化の余地があります。Cloud-Hypervisorは稼働中の仮想マシンのRAMとCPUステート全体をディスクへダンプ(スナップショット)する機能を備えています。新たなリクエストが届いた際は、リストアを行うだけで即座に復帰できます:
# アプリケーションのロードが完了した状態(ウォーム状態)で保存
ch-remote --api-socket /tmp/ch-api.sock snapshot --destination file:///var/snapshots/app-ready
# スナップショットから25ms未満で新規インスタンスを復元
cloud-hypervisor --api-socket /tmp/ch-worker.sock --restore source_url=file:///var/snapshots/app-ready
このアプローチにより、ランタイム(Node.jsやPythonなど)のコールドスタート時間が完全に解消され、25ms未満でトラフィックを受信できる状態へと到達します。

