什么是虚拟化?
虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
为什么要用虚拟化?
1、基础架构的利用率,通过将基础架构资源池化并打破一个应用一台物理机的限制,虚拟化大幅提升了资源利用率。通过减少额外硬件的采购,企业可以节约大幅成本。;
2、虚拟机比真实的机器可以被更容易从外部被控制和检查,并且可以配置更灵活,比如动态分配CPU资源、内存、磁盘等;
3、创建一个新的虚拟机不需要预先购买硬件,只需要在有资源空闲的设备上用简单的命令创建一台即可,大大简化了服务器的供应问题;
4、同时,一个新的虚拟机可以容易地从一台计算机转移到另一台上,这点还可以被用于远距离灾难恢复方案。
5、节约能耗、制冷和机房空间。通过减少数据中心里服务器和相关硬件的数量,企业可以从减少机房空间、能耗与制冷需求中获益,从而降低IT成本。
CPU指令的特权级
要彻底弄明白什么是虚拟化,我们得先讲讲CPU的特权级。
CPU的特权级(Ring)也叫hierarchical protection domains(等级保护域)。它是CPU设计的一种机制,用来保护数据和阻止恶意行为,确保计算机安全。特权级共分为4级:0、1、2、3。特权级是针对CPU指令的,并非操作系统,操作系统仅提供不同权限访问级别的资源。
操作系统一般只使用特权级0和3。特权最高的是0,可以直接操作硬件,如CPU和内存。一般操作系统和驱动运行在此级别下。特权级3是给一般的程序使用的,可以调用基本的CPU指令。特权级3是无法调用特权级0的指令的,如果非要调用则会显示为非法指令。
引用特权级的概念是为了保护计算机,一些危险指令只有操作系统可以执行,防止普通程序滥用其他程序的资源。如间谍软件要想开启摄像头就必须向特权级0的驱动程序请求开启,否则就不允许。
虚拟化基本类型
全虚拟化(FullVirtulization)
在Guest机器和Host机器中间加一层Hypervisor,Hypervisor是一种运行在物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享一套基础物理硬件。Host机器看它像跑在自己上面的程序,Guest机器看它像自己所运行的硬件。
主要是在Guest OS和硬件之间捕捉和处理那些对虚拟化敏感的特权指令,使Guest OS无需修改就能运行,速度会根据不同的实现而不同,但大致能满足用户的需求。这种方式是业界现今最成熟和最常见的,知名的产品有VirtualBox,KVM,VMware Workstation和VMware vSphere。
优点:Guest OS无需修改,速度和功能都非常不错,更重要的是使用非常简单。
缺点:基于Hosted模式(和Hypervisor一样,是一种模拟硬件的程序)的全虚拟产品性能方面不是特别优异,特别是I/O方面。
前景:由于这种模式不仅使Guest OS免于修改,而且将通过引入硬件辅助虚拟化技术来提高其性能,在未来几年内全虚拟化应该还会是主流。
半虚拟化(Parairtulization):
Hypervisor运行在Kernel Mode, Ring 0。Guest OS不能直接运行在Ring 0,而是需要对Kernel进行修改,将运行在Ring 0上的指令转为调用Hypervisor,Guest OS上的APP运行在Ring3。
它与完全虚拟化有一些类似,它也利用Hypervisor来实现对底层硬件的共享访问,但是由于在Hypervisor 上面运行的Guest OS已经集成与半虚拟化有关的代码,使得Guest OS能够非常好地配合Hyperivosr来实现虚拟化。通过这种方法将无需重新编译或捕获特权指令,使其性能非常接近物理机,其最经典的产品就是Xen,而且因为微软的Hyper-V所采用技术和Xen类似,所以也可以把Hyper-V归属于半虚拟化。
优点:这种模式和全虚拟化相比,架构更精简,而且在整体速度上有一定的优势。
缺点:需要对Guest OS进行修改,所以在用户体验方面比较麻烦。
前景:我觉得其将来应该和现在的情况比较类似,在公有云(比如Amazon EC2)平台上应该继续占有一席之地,但是很难在其他方面和类似VMware vSphere这样的全虚拟化产品竞争,同时它也将会利用硬件辅助虚拟化技术来提高速度,并简化架构。
硬件辅助全虚拟化(HardwareAssisted Virtualization)
Intel VT和AMD-V创建一个新的Ring -1单独给Hypervisor使用,Guest OS可以直接使用Ring 0而无需修改。
Intel/AMD等硬件厂商通过对部分全虚拟化和半虚拟化使用到的软件技术进行硬件化来提高性能。硬件辅助虚拟化技术常用于优化全虚拟化和半虚拟化产品,而不是独创一派,最出名的例子莫过于VMware Workstation,它虽然属于全虚拟化,但是在它的6.0版本中引入了硬件辅助虚拟化技术,比如Intel的VT-x和AMD的AMD-V。现在市面上的主流全虚拟化和半虚拟化产品都支持硬件辅助虚拟化,包括VirtualBox,KVM,VMware ESX和Xen。
优点:通过引入硬件技术,将使虚拟化技术更接近物理机的速度。
缺点:现有的硬件实现不够优化,还有进一步提高的空间。
前景:因为通过使用硬件技术不仅能提高速度,而且能简化虚拟化技术的架构,所以预见硬件技术将会被大多数虚拟化产品所采用。
操作系统级虚拟化(OperatingSystem Level Virtualization)
介绍:这种技术通过对服务器操作系统进行简单地隔离来实现虚拟化,主要用于VPS。主要的技术有Parallels Virtuozzo Containers,Unix-like系统上的chroot和Solaris上的Zone等,当今炒的最火热的当属docker。
优点:因为它是对操作系统进行直接的修改,所以实现成本低而且性能不错。
缺点:在资源隔离方面表现不佳,而且对Guest OS的型号和版本有限定。
前景:docker的出现算是在操作系统级虚拟化的一个革命性技术,未来发展前景相当可观。
什么是hypervisor
hypervisor为操作系统提供独立的虚拟硬件平台,而虚拟硬件平台反过来又提供对底层机器的虚拟的完整访问。hypervisor之于操作系统类似于操作系统之于进程。
虚拟化和hypervisor
关于什么是虚拟化,请参考我的另一篇博客《虚拟化技术介绍》,有更详细的讲解。
虚拟化就是隐藏底层物理硬件,让多个操作系统可以透明地使用和共享硬件资源的一种技术手段。这种架构的另一个更常见的名称是平台虚拟化。
在典型的虚拟化分层架构中,提供平台虚拟化的层称为 hypervisor (有时称为虚拟机管理程序或 VMM)。虚拟操作系统称为虚拟机(VM)。下图展示了常用硬件虚拟化的简单分层架构,当然并不是所有虚拟化解决方案都是一样的。
可以看到,hypervisor是提供底层机器虚拟化的中间软件层。操作系统将对机器的底层资源的访问虚拟化为进程。hypervisor 也做一样的事情,但其对象不是进程,而是整个虚拟机操作系统。
Hypervisor的两种类型
hypervisor 可以划分为两大类。一种是直接运行在物理硬件之上的,例如基于内核的虚拟机KVM,它本身是一个基于操作系统的hypervisor。另一种是运行在另一个操作系统中,例如QEMU 和 WINE。
hypervisor的构成
hypervisor仅是一个从其虚拟操作系统抽象机器硬件的分层应用程序。通过这种方式,每个虚拟操作系统看到的仅是一个VM而不是真实的硬件机器。
在较高级别上,hypervisor需要少量设施启动虚拟操作系统:一个需要驱动的内核映像、一个配置(比如 IP 地址和所需的内存量)、一个磁盘和一个网络设备。磁盘和网络设备通常映射到机器的物理磁盘和网络设备(如图所示)。最后,需要使用一组虚拟操作系统工具启动和管理虚拟操作系统。
然后,一个简化的hypervisor架构实现最后的关键功能,从而使虚拟操作系统可以和宿主操作系统同时运行。实现这个功能需要一些特定的要素,如图所示。
首先,类似于将用户空间应用程序和内核函数连接起来的系统调用,一个通常可用的虚拟化调用(hapercall,hypervisor对操作系统进行的系统调用)层允许虚拟系统向宿主操作系统发出请求。可以在内核中虚拟化I/O,或通过虚拟操作系统的代码支持它。故障必须由 hypervisor 亲自处理,从而解决实际的故障,或将虚拟设备故障发送给虚拟操作系统。hypervisor 还必须处理在虚拟操作系统内部发生的异常。(毕竟,虚拟操作系统发生的错误仅会停止该系统,而不会影响 hypervisor 或其他虚拟操作系统)。hypervisor的核心要素之一是页映射器,它将硬件指向特定操作系统(虚拟OS或 hypervisor)的页。最后,需要使用一个高级别的调度器在hypervisor和虚拟操作系统之间传输控制。