2. 虚拟化与KVM基础

在开始管理KVM虚拟机生命周期之前,必须先建立一张清晰的“技术地图”:虚拟化到底分几类,KVM处在哪一层,QEMU、libvirt各自扮演什么角色,内核模块与用户态组件如何协作。只有把这条链路理顺,后续创建、启动、迁移、销毁虚拟机时,遇到报错才能快速定位是内核层、设备模拟层还是管理接口层的问题。

一、虚拟化技术分类:从抽象层次理解

虚拟化按抽象对象不同,通常分为以下几类:

  • 全虚拟化:Guest OS无需修改,敏感指令由Hypervisor动态捕获并模拟。KVM配合QEMU即属于此类,Guest认为自己运行在真实硬件上。
  • 半虚拟化:Guest OS需修改内核,主动配合Hypervisor,典型如Xen PV。性能好但兼容性差。
  • 硬件辅助虚拟化:依赖CPU指令集扩展,Intel VT-x与AMD-V提供根模式/非根模式,让敏感指令自动陷入Hypervisor,是全虚拟化高性能的基础。
  • 操作系统级虚拟化:如LXC、Docker,共享同一内核,隔离的是进程与命名空间,不是完整硬件抽象。

KVM属于“硬件辅助全虚拟化”路线:它把Linux内核本身变成一个Hypervisor,借助VT-x/AMD-V实现CPU虚拟化,内存虚拟化由EPT/NPT完成,设备虚拟化则交给QEMU。

二、KVM架构原理:内核态与用户态的分工

KVM不是完整的Hypervisor,而是Linux内核中的一个模块。加载kvm.ko与kvm_intel.ko(或kvm_amd.ko)后,内核获得创建虚拟CPU、虚拟内存的能力。用户态通过/dev/kvm字符设备调用KVM_CREATE_VM、KVM_CREATE_VCPU、KVM_RUN等ioctl进入Guest执行;当Guest执行敏感指令或发生I/O时,CPU从非根模式退出到根模式,KVM处理后再返回用户态QEMU。

因此KVM的架构可以概括为:内核态KVM负责CPU与内存虚拟化,用户态QEMU负责设备模拟与虚拟机生命周期控制。两者通过ioctl和共享内存区域协作。

KVM 架构与组件协作关系 用户态(User Space) libvirt virsh / API / XML 统一管理接口 libvirtd 守护进程 QEMU 进程 设备模拟:磁盘/网卡/显卡 BIOS/UEFI、ACPI 虚拟机生命周期控制 Guest OS 客户机内核 + 应用 运行于非根模式 vCPU / vMemory 调用 模拟硬件 内核态(Kernel Space) kvm.ko 核心虚拟化模块 /dev/kvm 字符设备 kvm_intel.ko / kvm_amd.ko VT-x / AMD-V 硬件加速 VMX 非根模式切换 Linux 内核调度/内存 vCPU 调度、EPT/NPT 中断、时钟、I/O 路径 ioctl / KVM_RUN 物理硬件:CPU(VT-x/AMD-V)、内存、磁盘、网卡

三、QEMU与libvirt的关系:管理接口与执行引擎

很多初学者会把QEMU和libvirt混为一谈。实际上:

  • QEMU是虚拟机执行引擎,负责创建vCPU线程、模拟设备、加载Guest镜像。它可以直接用命令行启动,例如qemu-system-x86_64 -m 2048 -smp 2 -hda disk.qcow2。
  • libvirt是管理抽象层,提供统一API、XML描述和virsh工具,屏蔽不同Hypervisor(KVM、Xen、QEMU)差异。它不直接模拟硬件,而是调用QEMU。

关系可以概括为:libvirt 管“怎么定义和调度”,QEMU 管“怎么执行和模拟”,KVM 管“怎么加速”。使用virsh define定义XML后,libvirt会生成对应的QEMU命令行并启动进程。

# 查看 libvirt 为某虚拟机生成的 QEMU 命令行
virsh domxml-to-native qemu-argv /etc/libvirt/qemu/vm01.xml

# 直接查看 QEMU 进程
ps -ef | grep qemu-kvm

# 查看 KVM 模块是否加载
lsmod | grep kvm
# kvm_intel             315392  0
# kvm                   831488  1 kvm_intel

四、KVM内核模块与用户态组件清单

组件 所在层 核心职责 常用观察命令
kvm.ko 内核态 提供 /dev/kvm,创建 VM 与 vCPU lsmod | grep kvm
kvm_intel.ko / kvm_amd.ko 内核态 启用 VT-x / AMD-V 硬件加速 cat /proc/cpuinfo | grep vmx
QEMU 用户态 设备模拟、镜像加载、生命周期控制 ps -ef | grep qemu
libvirtd 用户态 管理守护进程,统一 API 与 XML systemctl status libvirtd
virsh 用户态 命令行管理工具 virsh list --all
virt-install 用户态 快速创建虚拟机 virt-install --help

五、典型场景与常见误区

场景:执行virsh start vm01后虚拟机无法启动。排查顺序应为:先确认lsmod | grep kvm模块是否加载,再检查/dev/kvm权限,然后查看/var/log/libvirt/qemu/vm01.log中QEMU报错,最后确认XML中磁盘路径与网络配置是否正确。这条链路正好对应“libvirt → QEMU → KVM → 硬件”的分层结构。

常见误区:
  • 认为“装了QEMU就等于有了KVM”。QEMU可纯软件模拟运行,性能极低;只有加载KVM模块并启用-enable-kvm才是硬件加速。
  • 认为libvirt是Hypervisor。libvirt只是管理框架,真正执行虚拟化的是QEMU+KVM。
  • 在虚拟机内再次加载KVM模块。嵌套虚拟化需宿主机显式开启nested参数,否则Guest内/dev/kvm不可用。
记忆口诀:libvirt 是“管家”,QEMU 是“演员”,KVM 是“加速器”,硬件是“舞台”。四者各司其职,缺一不可。理解这条分层链路,是后续生命周期管理排障的基础。