本页目录
QEMU 与 KVM 协作
覆盖: QEMU-KVM 进程模型 → KVM_CREATE_VM/KVM_RUN → 内存布局 → vCPU 线程循环 → 设备模拟 → live migration 内核版本: 2.6.20 ~ 6.x
进程模型
flowchart TD
QEMU["一个 VM = 一个 QEMU 进程"]
QEMU --> MAIN["🧵 Main 线程<br/>event loop, monitor"]
QEMU --> IO["🧵 IO 线程 (iothread)<br/>处理 virtio 设备 IO"]
QEMU --> VCPU["🧵 vCPU 线程 × N<br/>每个执行 KVM_RUN"]
QEMU --> MIGRATE["🧵 迁移线程<br/>live migration"]
classDef root fill:#e3f2fd,stroke:#1565c0
classDef thread fill:#fff3e0,stroke:#ef6c00
class QEMU root
class MAIN,IO,VCPU,MIGRATE thread
VM 创建流程
// QEMU → KVM:
kvm_fd = ;
// 1. 创建 VM
vm_fd = ;
// 2. 分配 guest RAM (QEMU 管理):
guest_ram = ;
// 3. 注册到 KVM:
struct kvm_userspace_memory_region region = ;
;
// 4. 创建 vCPU:
for
vCPU 运行循环
// QEMU: kvm_cpu_exec() (accel/kvm/kvm-all.c)
int
IO 线程与 virtio 处理
// QEMU iothread: 独立的 event loop
// → epoll on eventfd (virtio kick)
// → QEMU 处理 virtio 请求:
// virtio-blk: read/write → 映射到 host 文件 (qcow2/raw)
// virtio-net: tap fd → 读/写 Linux tun/tap
//
// vhost (绕过 QEMU):
// ioeventfd + irqfd → 内核直接处理
// → QEMU 只需配置, 不参与数据路径
Live Migration
QEMU + KVM 协作:
1. 源端: 标记所有 guest RAM 为 read-only
→ 后续写产生 write fault → 记录脏页
2. 迭代复制: RAM 预拷贝到目标
3. 脏页收敛: 每轮 dirty rate ↓ → 到阈值
4. stop-and-copy: 暂停源 VM → 复制最后脏页 + 寄存器状态 → 目标启动
5. downtime ~100ms (取决于工作负载)
参考
- 源码: QEMU
accel/kvm/kvm-all.c(KVM 加速核心), Linuxvirt/kvm/kvm_main.c - 内核文档:
Documentation/virt/kvm/api.rst(ioctl API 手册)
关键词: KVM_RUN, kvm_run, ioctl, KVM_CREATE_VM, vCPU thread, iothread, live migration