首先要理解什么是虚拟化
虚拟化技术
系统虚拟化是将底层物理设备与上层操作系统、软件分离的一种去耦合技术,在一台物理机器上逻辑的划分出多台机器。
• 虚拟化的目标是实现IT资源利用效率和灵活性的最大化
然后要了解Hypervisor
hypervisor:一种运行在物理服务器和操作系统之间的中间层软件,可以允许多个操作系统和应用共享一套基础物理硬件。可以将hypervisor看做是虚拟环境中的“元”操作系统,可以协调访问服务器上的所有物理设备和虚拟机,所以又称为虚拟机监视器(virtual machine monitor)。hypervisor是所有虚拟化技术的核心,非中断的支持多工作负载迁移是hypervisor的基本功能。当服务器启动并执行hypervisor时,会给每一台虚拟机分配适量的内存,cpu,网络和磁盘资源,并且加载所有虚拟机的客户操作系统。
详细可见https://www.ibm.com/developerworks/cn/linux/l-hypervisor/,讲的很不错
开始说KVM
kvm就是一种中间件,是一个linux的内核模块,将linux变成一个hypervisor,可以虚拟化cpu和内存,在系统需要虚拟化功能的时候,内核把kvm模块调入内存中运行。但用户无法直接控制内核,所以需要一个处于linux内核和用户之间的一个桥梁-qemu
QEMU
qemu是一个完整独立的虚拟化方案,可以对各种底层硬件进行虚拟,用于模拟用户空间,比如I/O,kvm需要借助qemu
QEMU-KVM
kvm运行在内核空间,qemu运行在用户空间,两者结合起来,其中kvm实现对cpu和内存的虚拟化,qemu实现对其他硬件的虚拟化(比如网卡, 硬盘)和对虚拟硬件的调用管理,这样用户创建的虚拟机的cpu指令就不用经过qemu转译,可以直接运行,性能得到很大的提升。
Libvirt
libvirt是目前使用最为广泛的对KVM虚拟机进行管理的工具和API,libvirt调用qemu-kvm来管理虚拟机。个人理解它就是给用户提供对虚拟机控制的一个工具,可以用命令也可以用图形化对虚拟机进行控制,使用 C 语言编写,可以由 Python,Ruby, Perl, PHP, Java 等语言调用。可以操作包括 KVM,vmware,XEN,Hyper-v, LXC 等 Hypervisor。
综上可见,kvm和qemu就是两种不同的hypervisor,下图中第一个就是普遍的虚拟化结构图,图二就是qemu-kvm架构的虚拟化结构图