qemu-kvm について
QEMU のシステムエミュレーションと KVM アクセラレーションを扱うエージェント向けガイドです。仮想マシンの設定と管理、デバイスパススルー、QMP、ディスクイメージ、カーネルデバッグを説明します。
主な機能
- 01KVM 対応仮想マシンの設定
- 02virtio デバイスと VFIO パススルー
- 03QMP モニターコマンド
- 04libvirt と virsh による管理
- 05カーネル起動と GDB デバッグ
活用シーン
- 01KVM での Linux 仮想マシン実行
- 02QEMU でのカスタムカーネル検証
- 03GPU や NIC の仮想マシンへの割り当て
- 04仮想マシンのスナップショットとディスクイメージ管理
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill qemu-kvmインストール後、Claude Code で/qemu-kvmを入力して読み込まれたか確認します。
詳細
QEMU / KVM
目的
QEMU システムエミュレーションと KVM アクセラレーションについてエージェントをガイドします。主な qemu-system-x86_64 フラグ、virtio デバイス、VFIO デバイスパススルー、QMP モニタープロトコル、libvirt/virsh による管理、および -kernel -initrd -append を使ったカーネル開発向け QEMU を扱います。
使用する場面
- ハードウェアアクセラレーションを使って Linux VM を実行する
- ベアメタルを使わずにカスタムカーネルをテストする
- VFIO で GPU または NIC を VM にパススルーする
- libvirt と virsh で VM を管理する
- 再現可能なテストのために VM のスナップショットを作成する
- カーネルを直接起動してカーネルまたはブートローダーを開発する
ワークフロー
1. 基本的な KVM VM
# Check KVM support
egrep -c '(vmx|svm)' /proc/cpuinfo
ls -l /dev/kvm
# Minimal Ubuntu VM
qemu-system-x86_64 \
-enable-kvm \
-cpu host \
-m 4096 \
-smp 4 \
-drive file=ubuntu.img,format=qcow2 \
-netdev user,id=net0 \
-device virtio-net-pci,netdev=net0 \
-display none \
-serial mon:stdio
| フラグ | 目的 |
|---|---|
-enable-kvm | KVM アクセラレーションを使用します |
-cpu host | ホストの CPU 機能をパススルーします |
-m | RAM の容量(MB) |
-smp | vCPU 数 |
-drive | ディスクイメージ |
-netdev / -device | ネットワークバックエンド |
2. virtio デバイス
# virtio-blk (paravirtual disk — faster)
-device virtio-blk-pci,drive=hd0 \
-drive if=none,id=hd0,file=disk.qcow2,format=qcow2
# virtio-net
-netdev tap,id=net0,ifname=tap0,script=no,downscript=no \
-device virtio-net-pci,netdev=net0
# virtio-balloon (dynamic memory)
-device virtio-balloon-pci
# virtio-scsi
-device virtio-scsi-pci,id=scsi0 \
-device scsi-hd,drive=hd0,bus=scsi0.0
パフォーマンス向上のため、エミュレートされたデバイスよりも常に virtio を優先してください。
3. VFIO デバイスパススルー
# Bind device to vfio-pci
echo 10de 1c03 | sudo tee /sys/bus/pci/drivers/vfio-pci/new_id
sudo virsh nodedev-detach pci_0000_01_00_0
# QEMU with passthrough
qemu-system-x86_64 \
-enable-kvm -m 8192 -smp 8 \
-device vfio-pci,host=01:00.0 \
...
IOMMU を有効にする必要があります(カーネルコマンドラインで intel_iommu=on または amd_iommu=on を指定します)。
4. QMP モニター
# Start with QMP socket
qemu-system-x86_64 ... \
-qmp unix:/tmp/qmp.sock,server,nowait
# Send QMP commands
socat - UNIX-CONNECT:/tmp/qmp.sock
{"execute":"qmp_capabilities"}
{"execute":"query-status"}
{"execute":"system_powerdown"}
{"execute":"savevm", "arguments":{"name":"checkpoint1"}}
5. libvirt と virsh
# Define VM from XML
virsh define myvm.xml
# Start/stop
virsh start myvm
virsh shutdown myvm
virsh destroy myvm # force power off
# Console
virsh console myvm
# Snapshot
virsh snapshot-create-as myvm snap1 "before upgrade"
# List
virsh list --all
# Create VM interactively
virt-install \
--name ubuntu-vm \
--ram 4096 \
--vcpus 4 \
--disk path=/var/lib/libvirt/images/ubuntu.qcow2,size=20 \
--os-variant ubuntu22.04 \
--network bridge=virbr0 \
--graphics none \
--console pty,target_type=serial \
--location http://archive.ubuntu.com/ubuntu/dists/jammy/main/installer-amd64/ \
--extra-args 'console=ttyS0,115200n8'
6. カーネル開発用の起動
# Direct kernel boot (no disk install needed)
qemu-system-x86_64 \
-enable-kvm \
-m 512 \
-kernel arch/x86/boot/bzImage \
-initrd /path/to/initramfs.cpio.gz \
-append "console=ttyS0 root=/dev/sda rw nokaslr" \
-serial stdio \
-display none \
-no-reboot
# With custom rootfs on virtio disk
-drive file=rootfs.ext4,format=raw,if=virtio \
-append "console=ttyS0 root=/dev/vda rw"
7. QEMU でのカーネルデバッグ
# GDB stub for kernel
qemu-system-x86_64 \
-kernel bzImage -append "console=ttyS0 nokaslr" \
-s -S \ # -s = gdb port 1234, -S = wait for gdb
-serial stdio -display none
# Host GDB
gdb vmlinux
(gdb) target remote :1234
(gdb) break start_kernel
(gdb) continue
8. qcow2 ディスク管理
qemu-img create -f qcow2 disk.qcow2 20G
qemu-img snapshot -c clean disk.qcow2
qemu-img convert -O raw disk.qcow2 disk.raw
qemu-img info disk.qcow2
よくある問題
| 症状 | 原因 | 対処方法 |
|---|---|---|
| KVM が無効という警告 | BIOS で VT-x が無効、またはネスト関連の問題 | VT-x/AMD-V を有効にし、/dev/kvm を確認します |
| VM の動作が非常に遅い | KVM が有効になっていない | -enable-kvm を追加し、kvm モジュールをインストールします |
| VFIO グループエラー | デバイスが IOMMU グループに属していない | find /sys/kernel/iommu_groups/ を使用します |
| VM でネットワークを利用できない | netdev バックエンドが正しくない | user networking と tap/bridge を確認します |
| 起動時にカーネルパニックが発生する | root= が正しくない、またはドライバーが不足している | virtio ドライバーを initrd に追加します |
| QMP 接続が拒否される | ソケットの準備ができていない | QEMU の起動を待ち、パスを確認します |
関連スキル
skills/virtualization/hypervisor-internals— KVM における VT-x/SVM の理論skills/kernel/kernel-testing— QEMU でテスト用カーネルを起動しますskills/kernel/os-dev-scratch— QEMU で最小限の OS を開発しますskills/kernel/kernel-debugging— QEMU の-s -Sを使った kgdbskills/async-io/dpdk— QEMU virtio を使った DPDKskills/platform/riscv-privileged—qemu-system-riscv64
コメント
Markdown 対応