Xen是一个开源的VMM,是由剑桥大学实验室开发的一个项目,是一个直接运行在计算机硬件之上的用以替代操作系统的软件层,它能够在计算机硬件上并发的运行多个GuestOS。
在xen的使用方式中,分为完全虚拟化与半虚拟化(超虚拟化)两种。全虚拟化是由Hypervisor提供所有的虚拟硬件,操作系统不经过任何修改,Hypervisor可以部署在裸机,也可以部署在操作系统,各个GuestOS完全隔离,虚机并不知道自己运行在虚拟环境,虚拟机的指令需要翻译为CPU可以识别的指令,性能低于裸机;半虚拟化GuestOS集成了虚拟化相关代码,是修改过的操作系统,使其发送出的指令最优,可以直接被CPU理解,减小了消耗,便于在虚拟化环境运行,这种模式,虚拟机知道自己运行在虚拟环境,可以感知Hypervisor以及其他半虚拟化的虚拟机,由于这种模式虚拟机和Hypervisor可以更好的配合,Hypervisor的压力更小,所以性能也最高,接近裸机的性能了,但是不是所有操作系统都可以半虚拟化。
xen是一个直接运行在计算机硬件之上的用以替代操作系统的软件层,它主要包含三个部分:
Xen Hypervisor:
直接运行在硬件与所有操作系统之间的基本软件层,是GuestOS与硬件资源之间的访问接口,负责为运行在硬件设备上的虚拟机进行CPU调度和内存分配。通过将客户操作系统与硬件进行分离,Xen Server可以允许GuestOS安全,独立的运行在相同硬件环境之上。
Domain 0:
是运行在Xen Server之上,修改过linux内核的独一无二的虚拟机,有直接访问硬件和管理其他GuestOS的特权的GuestOS,所有的Xen虚拟环境都需要先运行Domain 0,它是所有虚机的管理员,管理员启动后,才能运行其他的虚拟客户机。在Domain 0中包含两个真实设备的驱动程序,用于支持其他客户虚拟机对于网络和硬盘的访问请求,这两个驱动分别是Network Backend Driver和Block Backend Driver。Network Backend Driver直接与本地的网络硬件进行通信,用于处理来自Domain U客户机的所有关于网络的虚拟机请求,而Block Backend Driver直接与本地的存储设备进行通信然后,用于处理来自Domain U客户机的所有关于存储的虚拟机请求,将数据读写到存储设备上。
Domain U:
运行在Xen Server之上的普通GuestOS或业务OS,不能直接访问硬件资源,但可以独立并行的存在多个,可以是全虚拟化的虚拟,也可以是修改过操作系统的半虚拟化虚机,他们之间相互独立,每个Domain U都拥有自己所能操作的虚拟资源。Domain U上集成了前端设备,GuestOS向前端设备发送请求,而前端设备通过IO请求描述符和设备通道将这些请求以及用户域(位于Domain U)的身份信息发送到处于特权域中(位于Domain 0)的后端设备,所有的真实硬件访问都由特权域的后端设备调用本地设备驱动发起,前端设备只需要完成数据的转发,这样完全是利用Linux的现有设备驱动来完成硬件访问,效率较高。半虚拟化的虚机包含两个用于操作网络和磁盘的驱动程序,PV Network Driver和PV Block Driver,PV Network Driver负责为Domain U提供网络访问功能,PV Block Driver负责为Domain U提供磁盘操作功能。完全虚拟化的虚机操作系统未被更改,所以不存在上面的Driver,但是每个完全虚拟化虚机都会在Domain 0中存在一个特殊的适配程序Qemu-DM,由这个适配程序帮助完全虚拟化虚机完成网络和磁盘的访问操作。
Xen是通过Domain 0中镶嵌的一些精灵程序完成管理与控制的,Xend精灵线程是一个Python应用程序,是Xen环境的系统管理员,它利用Libxenctrl类库向Xen Hypervisor发出请求;Xenstored精灵程序用于维护注册信息,这些信息包括内存和在连接Domain 0和所有其他Domain U之间的事件通道。Domain 0虚拟机利用这些注册信息来与系统中其他虚拟机建立设备通道,即帮助Domain U虚拟机访问硬件资源;Libxenctrl是C程序类库,用于让Xend具有通过Domain 0与Xen Hypervisor进行交互的能力。在Domain 0中存在一个特殊的驱动程序称作privcmd,它将请求发送给Hypervisor;Qemu-DM处理在Xen环境下完全虚拟化客户机所能允许执行的所有关于网络和磁盘请求和操作。Qemu程序必须存在于Hypervisor之外同时又需要访问网络和I/O,所以Qemu-DM必须存在于Domain 0中;Xen Virtual Firmware是被嵌入到所有完全虚拟化客户机中的虚拟的BIOS系统,来确保所有客户操作系统在正常启动操作中接收到标准的启动指令集并提供标准的软件兼容环境。
半虚拟化虚机必须通过和 Xen Hypervisor、Domain 0通信来实现网络和磁盘请求,Domain 0中有两个驱动Network Backend Driver和Block Backend Driver,它们分别用来处理来自 Domain U的网络和本地磁盘请求。
当半虚拟化虚机网络设备驱动程序接收到个发送数据请求的时候,通过 Xen Hypervisor发送数据到本地网络设备(网卡之类的设备)中,这个网络设备是和 Domain 0共享的,在 Domain 0 和 Domain U 之间存在个事件通道(event channel),通过该通道二者进行异步的域间中断通信。Domain 0 会接收到个来自 Xen Hypervisor 的中断,触发 PV Network Backend Driver 访问上述网络设备,读取来自 PV 客户系统的数据,然后将这些数据发送出去,事件通道运行在 Xen Hypervisor中,并在Xenstored中注册特定的系统中断。
半虚拟化虚机接收到要向本地磁盘写入数据的请求,然后通过Xen Hypervisor将与Domain 0共享的本地内存中的数据写入到本地磁盘中。在Domain 0 和半虚拟化Domain U之间存在事件通道,这个通道允许它们之间通过存在于Xen Hypervisor内的异步中断来进行通信。Domain 0将会接收到一个来自于Xen Hypervisor的系统中断,并触发Domain 0中的Block Backend驱动程序去访问本地系统内容,并从与半虚拟化客户机的共享内存中读取适合的数据块,从共享内存中读取的数据随后被写入到本地磁盘的指定位置中。
而全虚拟化虚机有相应的网络和I/O请求的时候,它就会直接与Domain0中和它相对应的Qemu-dm来进行交互,通过Domain 0终达到访问网络设备或者磁盘的目的。
其他的虚拟化技术还有VMWARA,微软等,但现在KVM无疑是虚拟化技术的主流,下面我们就针对KVM做进一步介绍。