KVM 的整体架构如图 Q30-1所示,主要包括 QEMU(Quick Emulator,虚拟操作系统模拟器)和KVM两个组件。
QEMU 是一个通用的开源机器模拟器和虚拟器,每个 Qemu-kvm 进程代表一个虚拟机,针对每个 vCPU 创建一个线程。Qemu-kvm 主要完成虚拟机初始环境准备,模拟虚拟机的用户空间组件,提供I/O设备模拟、访问外设的途径。
图Q30-1 KVM的整体架构
KVM 内核模块是嵌入在 Linux 操作系统标准内核中的一个虚拟化模块,分为两个部分,Kvm.ko 和 Kvm-intel.ko(或 Kvm-amd.ko)。KVM 为公用框架部分,Kvm-intel 为体系结构相关部分。KVM 提供/dev/kvm 接口,供用户态的QEMU 访问,实现虚拟机创建、vCPU 管理等接口。KVM 内核模块主要完成CPU root和Non-root运行模式的切换、内存映射管理、关键指令模拟等操作。
Virtio 提供了通用的虚拟化接口,相对于完全模拟硬件,Virtio 的接口更加简单,因此性能相对通用硬件来说也好一些。Virtio 提供了 Virtio_net、Virtio_blk,实现网卡和磁盘的模拟。
KVM 所支持的功能包括:
(1)支持CPU和Memory超分(Overcommit);
(2)支持半虚拟化I/O(Virtio);
(3)支持热插拔(CPU、块设备、网络设备等);
(4)支持对称多处理(Symmetric Multi-Processing,SMP);
(5)支持实时迁移(Live Migration);
(6)支持PCI设备直接分配和单根I/O 虚拟化(Single Root I/O Virtualization,SR-IOV);
(7)支持内核同页合并(Kernel Samepage Merging,KSM);
(8)支持非一致存储访问结构(Non-Uniform Memory Access,NUMA)。