关于 qemu-kvm
为 Agent 提供 QEMU 系统模拟和 KVM 加速指南,涵盖虚拟机设置与管理、设备直通、QMP、磁盘映像及内核调试流程。
主要功能
- 01配置 KVM 加速虚拟机
- 02virtio 设备与 VFIO 直通
- 03QMP 监控器命令
- 04使用 libvirt 和 virsh 管理
- 05内核启动与 GDB 调试
适用场景
- 01使用 KVM 运行 Linux 虚拟机
- 02在 QEMU 中测试自定义内核
- 03将 GPU 或 NIC 直通到虚拟机
- 04管理虚拟机快照和磁盘映像
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill qemu-kvm安装后在 Claude Code 中输入/qemu-kvm确认已加载。
详细介绍
QEMU / KVM
用途
指导 Agent 使用 QEMU 系统仿真和 KVM 加速:qemu-system-x86_64 的关键标志、virtio 设备、VFIO 设备直通、QMP 监控协议、libvirt/virsh 管理,以及使用 -kernel -initrd -append 进行内核开发。
适用场景
- 使用硬件加速运行 Linux 虚拟机
- 无需裸机即可测试自定义内核
- 通过 VFIO 将 GPU 或 NIC 直通给虚拟机
- 使用 libvirt 和 virsh 管理虚拟机
- 创建虚拟机快照,以便进行可复现测试
- 通过直接启动内核来开发内核或引导加载程序
工作流
1. 基本 KVM 虚拟机
# 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 |
| 虚拟机运行很慢 | KVM 未启用 | 添加 -enable-kvm;安装 kvm 模块 |
| VFIO 组错误 | 设备不在 IOMMU 组中 | 使用 find /sys/kernel/iommu_groups/ |
| 虚拟机中没有网络 | netdev 后端错误 | 使用用户网络或 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进行 kgdb 调试skills/async-io/dpdk— 使用 QEMU virtio 运行 DPDKskills/platform/riscv-privileged—qemu-system-riscv64
评论
支持 Markdown