实现虚拟化的方式两种:
1、vmm (Virtual Machine Monitor,虚拟机监控器 )直接运行在硬件平台上,控制所有硬件并管理客户的操作系统,如xen,vmware
2、vmm运行在一个传统的操作系统里,在系统之上运行一套软件,在软件之上运行客户的操作系统,如kvm
完全虚拟化:
通过客户机和宿主机直接通过一个虚拟化逻辑层hypervisor来完全模拟底层硬件细节,客户机的操作系统无需任何修改
半虚拟化:
事先修改客户机操作系统内核,共享宿主机底层硬件来实现的,虚拟主机内核能直接管理底层硬件
相比完全虚拟化使用灵活,性能不够强,半虚拟化直接管理底层硬件,性能很好,但需要修改系统内核,使用繁琐
一、 KVM概述
KVM是Kernel-based Virtual Machine的缩写,即基于Linux内核的虚拟机,是一种的完全虚拟化的解决方案,也就是说普通的操作系统不需经过修改就可以在KVM上运行。它使用linux自身的调度器进行管理,所以相对于xen,其核心源码很少。KVM的虚拟化需要硬件的支持(如intel VT技术或者AMD V技术),是基于硬件的完全虚拟化。
准确来说,KVM是Linux的一个模块。可以用modprobe去加载KVM模块。加载了模块后,就可以使用KVM模块创建虚拟机,实现虚拟内存的分配,虚拟CPU寄存器的读写以及管理虚拟CPU的运行。但仅有KVM模块是远远不够的,因为用户无法直接控制内核模块去作事情,所以还必须有一个用户空间的工具才行。这个用户空间的工具,开发者选择了已经成型的开源虚拟化软件 QEMU,使用它来模拟PC硬件的用户空间组件,模拟I/O设备模型以及提供访问外设的途径。后边会详细的介绍QEMU,这里先知道它用了QEMU就好了。
KVM基本架构如下图所示。
其中KVM被加入到标准的Linux内核中,被组织成Linux中标准的字符设备(/dev/kvm)。Qemu利用KVM提供的LibKvm应用程序接口,通过ioctl系统调用创建和运行虚拟机。KVM Driver使得整个Linux成为一个虚拟机监控器。并且在原有的Linux两种执行模式(内核模式和用户模式)的基础上,新增加了客户模式,客户模式拥有自己的内核模式和用户模式。在虚拟机运行下,三种模式的分工如下:
客户模式:执行非I/O的客户代码,虚拟机运行在客户模式下。
内核模式:实现到客户模式的切换,处理因为I/O或者其它指令引起的从客户模式的退出,KVM Driver工作在这种模式下。
用户模式:代表客户执行I/O指令Qemu运行在这种模式下。
## KVM的具体工作流程如下: