0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Cloud Hypervisorで最小のLinux VMを起動してみる――QEMU・Firecrackerとの違いも整理

0
Posted at

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をブートする構成を試すと理解が深まります。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?