一般来说在Hyper-V之前Windows平台常见的操作系统虚拟化技术一般分为两种架构。第一种就是下面的Type 2架构,它的特点是:Host物理机的硬件上是操作系统,操作系统上跑着VMM, VMM也就是Virtual Machine Monitor,作为这个架构当中的Virtualization Layer,其主要工作是创建和管理虚机,分配总体资源给各个虚机,并且保持各个虚机的独立性,大家也可以把它看作一个管理层。在VMM上面跑的就是各个Guest虚拟机。就是这样一个架构,这个架构有一个很大的问题,就是Guest虚机要穿越VMM和Host OS这两层来访问硬件资源,这样就损失了很多的性能,效率不高。采用这种架构的典型产品就是Java Virtual Machine以及.NET CLR Virtual Machine。

clip_image002

      第二种架构就是Hybrid架构,下面是它的架构图,和Type 2架构不同的是,VMM和Host OS是处于同一个层面上,也就是说VMM和OS同时跑在内核模式交替轮流地使用CPU。这种模式比Type2架构快很多,因为在Type2模式下VMM通常跑在用户模式当中,而Hybrid是跑在内核模式中。这样架构的典型产品就是面向桌面操作系统的VPC 2007和微软上一代面向服务器操作系统的Virtual Server 2005。

clip_image004

     Hyper-V采用了一种全新的架构(下图): Type 1的架构,也就是Hypervisor架构。和以前的架构相比,它直接用VMM代替了Host OS. Host OS从这个架构当中彻底消失,将VMM这层直接做在硬件里面,所以Hyper-V要求CPU必须支持虚拟化了吧。这种做法带来了虚拟机OS访问硬件的性能的直线提升。VMM这层在这个架构中就是我们说的Hypervisor, 它处于硬件和很多虚拟机之间,其主要目的是提供很多孤立的执行环境,这些执行环境被称之为分区(partition),每一个分区都被分配了自己独有的一套硬件资源:内存,CPU, IO设备,并且包含了Guest OS. 以Hyper-V为基础的虚拟化技术拥有最强劲的潜在性能

clip_image006

     大家可以来看一下Hyper-V内部比较详细的结构图:

clip_image008

     在底层支持虚拟化的硬件之上,Hypervisor运行着,而在它之上,运行着很多独立的分区,大致可以把分区分成四种类型

     首先来看最左边的,也就是父分区,也就是控制和创建其他分区的root分区。我们来看看它的构成,在这个分区的内核模式下有longhorn server的内核,还有一个叫做VSP的东西,它的全称是Virtualization Service Provider,它负责和device driver直接对话,为每一个需求提供硬件服务,VSP可以将request直接通过驱动程序传入物理设备,也可以把它传给自己本地的服务去处理,比如一些文件系统,VSP在硬件设备如何工作中充当了关键的角色。以前的虚拟化产品都是通过模拟方式来让guest OS访问硬件的,但就像刚才所说的那样这样做在兼容性上是不错的,但是性能不强,而VSP不存在这个问题。而每个分区都有的VM BUS类似于电脑里的总线,用来在虚机之间传输发送的request和data。

    在父分区的用户模式下有很多VM Work Processes,每一个process都代表了系统当中一个特定的虚机,它是跑在前面所说的虚拟栈里面的。另外还有VM Service,它提供了一套工具和后台服务,用来管理虚机以及work processes,在它上面就是我们所说的WMI接口,其实它是VM Service暴露的一组接口。我们可以利用它去编写编写自己的管理工具,使虚拟机相关的操作自动化。

      然后看左边第二个分区,这个是一种子分区,应用程序跑在用户模式下,而这个分区虚机的内核模式下跑的是Windows 2008。它就是一个被启蒙的Guest OS,也就是说这个系统完全知道自己是跑在hyper-v上面的虚机,它访问硬件不需要用任何的模拟。我们看其内核模式下还有一个VSC,它的全称是virtualization service client。它是一个跑在子分区里面的client组件,它能够通过消费VSP提供的服务来完成实际的工作。对每一个设备类型来说,都有一对VSP/VSC来完成对这种类型硬件的使用。举个例子来说,过程是这样的。首先虚机上面操作系统中的应用程序需要访问某设备中的文件系统,然后相关驱动程序通知VSC要访问硬件,然后VSC把相关的request通过VM BUS传给父分区里面的VSP,然后VSP提供相应硬件供应操作。是这样一个过程。

       然后第三个分区,这是一种另外的子分区,在这个子分区里面跑的是没有被启蒙过的操作系统,比如一些早期windows操作系统和DOS, 它必须使用模拟来提供操作系统所能够明白的硬件环境,所以没有VSC组件跑在内核模式下。

       最后第四个分区,这也是第三种子分区,它里面跑的根本不是windows的操作系统,而是一些Linux的操作系统。微软同样认识到有些顾客需要在hyper-v上跑其他的OS, 比如Linux,微软没有仅仅让Linux跑在模拟出来的硬件上,而是让一些合作伙伴来 build 面向Linux的VSC,争取有越来越多的Linux虚拟机也能够使用VSP/VSC的方式来更有效的访问硬件。