虚拟化的目的:是为了提高资源的利用率,提高管理的便携性,是云计算的底层基础。
虚拟化的实现:是将底层的物理硬件都抽象成各种逻辑资源,也就是资源池化(虚拟化),然后再在这些逻辑资源之上,建立虚拟机操作系统。
虚拟化需要解决的一个大问题就是,如何感知内核模式,即:现有的系统是这样的,操作系统运行在内核态中,用户程序运行在用户态中,当用户程序需要执行内核态功能(比如IO操作)的时候,会被系统捕捉,并由内核执行并返回。然而,在虚拟化中,如果不更改操作系统代码,则虚拟机操作系统系统也运行在内核态中,这样就会产生冲突,因为这时候宿主系统和虚拟系统内核同时运行在内核态中,这就会出问题。所以,虚拟化的重要的一步就在于,如何截获虚拟机命令对物理硬件的访问(内核态),并且将其重定向到逻辑资源池中。基于此又有两种不同的方式
基于软件的方法
比如VMware workstation,它监控虚拟机操作系统的指令,并将虚拟机中的内核态命令截取,并转化为软件调用来实现该功能。
另外一种就是著名的Qemu,它通过软件来仿真每条指令的取指令,解码指令,和执行指令,虚拟机操作系统的所有指令都是用软件模拟的,这种方式的性能较低。基于硬件的方法
就是依靠物理平台的本身提供对特殊指令的截获或者重定向的硬件支持,从而提升性能,
为了能在一台物理设备上能够安装多个虚拟机操作系统,目前已经出现了多种技术,比如Qemu,xen,kvm,vmware 等多种技术。
Qemu:用软件的形式,模拟一个虚拟机操作系统的所有设备。
Xen: 刚开始支持半虚拟化,后来支持全虚拟化,Xen是一个直接在硬件上运行的管理程序,也就是说Xen相当于宿主操作系统,负责虚拟机管理和资源的调度。
Kvm: 即内核虚拟机,它基于Linux 内核和支持虚拟化扩展的X86硬件,是一种全虚拟化方法。在KVM中,一个虚拟机实例表现为一个Linux 进程,所以,可以很好的利用Linux 成熟的进程调度方法,同时KVM还利用了QEMU的虚拟化来实现IO.
等等。。。
有如此众多的解决方法,而各个方案的管理方式,命令,工具又各不相同,学习和掌握这些不能的工具又费时又低效,所以一种能够用一个统一的方法来管理这些虚拟机的工具就应运而生,那就是我们要学习的Libvirt。
Libvirt的位置:提供一种Hpyervisor不可知的 API 来安全管理运行于主机上的客户操作系统。它为受支持的虚拟机监控程序实现的常用功能提供通用的 API。libvirt 起初是专门为 Xen 设计的一种管理 API,后来被扩展为可支持多个虚拟机监控程序,它基于驱动程序的架构,该架构允许一种通用的 API 以通用方式为大量潜在的虚拟机监控程序提供服务。
个人总结的虚拟化系统图如图1所示:
在KVM和XEN中,KVM+Linux Kernel 的功能与Xen Hpyervisor +Domian 0 的功能相当,KVM利用了Linux 内核的一些成熟的特性,并且可以受益于Linux 内核的发展。而Domain 0 运行的是修改过的linux 系统,其它虚拟机的IO部分,主要和Domain 0 进行通信。Xen的半虚拟化方式,需要修改操作系统的代码,所以它也和KVM一样,只能运行受限的操作系统。
纠正的一些错误理解:
1. 虚拟机包括虚拟的硬件和虚拟的操作系统,而不仅仅是虚拟操作系统而已,以前一直错误的认为虚拟机只是一个虚拟操作系统(VMware workstation)。
2. Libvirt 作为一个函数库API存在,它没有专门的物理硬件来运行它,而是宿主在Domain 0 或者Linux 系统中。