虚拟化技术

前言

近年来,计算机硬件与软件的性能比以往有了椰大的发展与进步,计算机硬件的入反为人们提供了极其强大的计算能力和极其主富的计算咨酒 加不加以有利用将会造成资源浪费。同时,随着计算机软件的发展,用户使用计算机的场合越来越多这又导致用户对计算机的要求越来越多,网络安全、数据灾备、系统移植、系统升级、软硬件成本等用计算机过程中要考虑和解决的问题。而虚拟化技术的出现与应用,为用户提供了解决这类问题的完美方案。本章就将介绍云计算与大数据技术紧密相关的虚拟化技术。

一、虚拟化技术简介

虚拟化技术其实很早以前就已经出现了,虚拟化的概念也不是最近几年才提出来的。虚拟化技术最早出现于20世纪60年代,那时候的大型计算机已经支持多操作系统同时运行,并且相互独立。如今的虚拟化技术不再是仅仅只支持多个操作系统同时运行这样单一的功能了,它能够帮助用户节省成本,同时提高软硬件开发效率,为用户的使用提供更多的便利。尤其近年来,虚拟化技术在云计算与大数据方向上的应用更加广泛。虚拟化技术有很多分类,针对用户不同的需求涌现出了不同的虚拟化技术与方案,如网络虚拟化、服务器虚拟化、操作系统虚拟化等,这些不同的虚拟化技术为用户很好地解决了实际需求。

1、虚拟化技术的概念

虚拟化技术是一个广义的术语,对不同的行业或不同的人有着不字领域中,虚拟化技术章味着对计算机资源的抽象。虚拟化是通过虚拟化技术将一台计算机应拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显者提高计算机的工作效率。也就是说,虚拟化技术是模拟真正的(或者称物理的)计算机资源,例如CPU、内存、存储、网络等用户可见的物理的硬件资源。用户通过虚拟化技术在使用这兰资源时,除了不能物理接触以外,其他都与使用物理计算机没有任何区别。虚拟化技术可以实现大容量、高负载或者高流量设备的多用户共享,每个用户可以分配到一部分独立的、相互不受影响的资源。每个用户使用的资源是虚拟的,相互之间都是独立时,虽然这些数据有可能存放在同在一台物理设备中。

以虚拟硬盘来说,用户使用的是由虚拟化技术提供的虚拟硬盘,而这些虚拟硬盘对于用户来说就是真实可用的硬盘,这些虚拟硬盘在物理存储上可能就是两个不同的文件,但用户只能访问自己的硬盘,不能访问别人的硬盘,所以他的各自的数据是安全的,是相互不受影响的。甚至各个用户使用的网络接口都是不一样的,所使用的网络资源也是不一样的,使用的操作系统也不一样。

云计算的核心技术之一就是虚拟化技术。所谓虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。

虚拟化的核心软件VMM,是一种运行在物理服务器和操作系统之间的中间层软件。VMM是一种在虚拟环境中的“元”操作系统。他们可以访问服务器上包括CPU、内存、磁盘、网卡在内的所有物理设备。VMM不但协调着这些硬件资源的访问,也同时在各个虚拟机之间施加防护。当服务器启动并执行VMM时,它会加载所有虚拟机客户端的操作系统同时会分配给每一台虚拟机适量的内存,CPU,网络和磁盘。

虚拟化方式

虚拟化技术有很多实现方式,比如根据虚拟化的程度和级别,有软件虚拟化和硬件虚拟化,全虚拟化和半虚拟化。

软件虚拟化:顾名思义,就是采用纯软件的方法在在现有的物理平台上实现物理平台访问的截获和模拟,该物理平台往往不支持硬件虚拟化。

硬件虚拟化:简单来说,就是物理平台本身提供了对特殊指令的截获和重定向的硬件支持,新的硬件会提供额外的资源来帮助软件实现对关键硬件资源的虚拟化,从而提升性能。

全虚拟化:完全虚拟化技术又叫硬件辅助虚拟化技术,最初所使用的虚拟化技术就是全虚拟化(Full Virtualization)技术,它在虚拟机(VM)和硬件之间加了一个软件层Hypervisor,或者叫做虚拟机管理程序或虚拟机监视器(VMM)。

半虚拟化:半虚拟化技术是后来才出现的技术,也叫做准虚拟化技术,现在比较热门,它就是在全虚拟化的基础上,把客户操作系统进行了修改,增加了一个专门的API,这个API可以将客户操作系统发出的指令进行最优化,即不需要VMM耗费一定的资源进行翻译操作。

使用虚拟化技术可以动态维护资源的分配,动态扩展或减少某个用户所使用的资源。用户如果产生了一个需求,如需要添加更多的硬盘空间或添加更多的网络带宽,虚拟化技术通过更改相应的配置就可以很快地满足用户的需求,甚至用户的业务也不需要中断。

随着虚拟化技术在不同的系统与环境中的应用,它在商业与科学方面的优势也体现得越来越明显。虚拟化技术为企业降低了运营成本,同时提高了系统的安全性和可靠性。虚拟化技术使企业可以更加灵活、快捷与方便地为最终的用户进行服务,并且用户也更加愿意接受虚拟化技术所带来的各种各样的便利。为更加直观地感受与认识虚拟化,下面对一个计算机系统有用腾机化技术进行一个简单的对比.

2.虚拟化技术的分类

现代计算机系统是一个庞大的整体,整个系统的复杂性是不言而喻的。因而,整个计算机系统被分成了多个自下而上的层次,每一个层次都向上一层次呈现一个抽象,并且每一层只需知道下层抽象的接口,而不需要了解其内部运作机制。这样以层的方式抽象资源的好处是每一层只需要考虑本层设计以及与相邻层间的相互交互,从而大大降低了系统设计的复杂性,提高了软件的移植性。

本质上,虚拟化就是由位于下层的软件模块,通过向上一层软件模块提供一个与它原先所期待的运行环境完全一致的接口的方法,抽象出一个虚拟的软件或硬件接口,使得上层软件可以直接运行在虚拟的环境上。虚拟化可以发生在现代计算机系统的各个层次上,不同层次的虚拟化会带来不同的虚拟化概念。

如前文所述,虚拟化技术起源于上世纪70年代的IBM370体系,经过四十余年的发展,当前存在诸多实现在不同层次的虚拟化技术,原理不尽相同,且每一种技术都相当复杂。在本文中,将通过不同的角度对目前存在的较流行的虚拟化技术进行分类,并对其原理进行初步介绍,旨在对纷繁复杂的虚拟化技术有个整体认识及厘清不同虚拟化技术之间的相互关系。

2.1 不同抽象层次的虚拟化技术

在介绍各种虚拟化概念之前,先介绍虚拟化中的两个重要名词。在虚拟化中,物理资源通常有一个定语称为宿主(Host),而虚拟出来的资源通常有一个定语称为客户(Guest)。

在计算机系统中,从底层至高层依次可分为:硬件层、操作系统层、函数库层、应用程序层,在对某层实施虚拟化时,该层和上一层之间的接口不发生变化,而只变化该层的实现方式。从使用虚拟资源的Guest的角度来看,虚拟化可发生在上述四层中的任一层。应当注意,在对Guest的某一层进行虚拟化时,并未对Host在哪一层实现它作出要求,这一点是时常引起混淆的地方。

2.1.1 硬件抽象层上的虚拟化

硬件抽象层上的虚拟化是指通过虚拟硬件抽象层来实现虚拟机,为客户机操作系统呈现和物理硬件相同或相近的硬件抽象层,又称为指令集级虚拟化,实现在此层的虚拟化粒度是最小的。

实现在此层的虚拟化技术可以对整个计算机系统进行虚拟,即可将一台物理计算机系统虚拟化为一台或多台虚拟计算机系统,故又可称作系统级虚拟化。每个虚拟计算机系统(简称为虚拟机)都拥有自己的虚拟硬件(如CPU、内存和设备等),来提供一个独立的虚拟机执行环境。每个虚拟机中的操作系统可以完全不同,并且它们的执行环境是完全独立的。由于客户机操作系统所能看到的是硬件抽象层,因此,客户机操作系统的行为和在物理平台上没有什么区别。

2.1.2 操作系统层上的虚拟化

操作系统层上的虚拟化是指操作系统的内核可以提供多个互相隔离的用户态实例。这些用户态实例(经常被称为容器)对于它的用户来说就像是一台真实的计算机,有自己独立的文件系统、网络、系统设置和库函数等。

由于这是操作系统内核主动提供的虚拟化,因此操作系统层上的虚拟化通常非常高效,它的虚拟化资源和性能开销非常小,也不需要有硬件的特殊支持。但它的灵活性相对较小,每个容器中的操作系统通常必须是同一种操作系统。另外,操作系统层上的虚拟化虽然为用户态实例间提供了比较强的隔离性,但其粒度是比较粗的。

2.1.3 库函数层上的虚拟化

操作系统通常会通过应用级的库函数提供给应用程序一组服务,例如文件操作服务、时间操作服务等。这些库函数可以隐藏操作系统内部的一些细节,使得应用程序编程更为简单。不同的操作系统库函数有着不同的服务接口,例如Linux的服务接口是不同于Windows的。库函数层上的虚拟化就是通过虚拟化操作系统的应用级库函数的服务接口,使得应用程序不需要修改,就可以在不同的操作系统中无缝运行,从而提高系统间的互操作性。

例如,Wine就是在Linux上模拟了Windows的库函数接口,使得一个Windows应用程序能够在Linux上正常运行。

2.1.4 编程语言层上的虚拟化

另一大类编程语言层上的虚拟机称为语言级虚拟机,例如JVM(Java Virtual Machine)和微软的CLR(Common Language Runtime)。这一类虚拟机运行的是进程级的作业,所不同的是这些程序所针对的不是一个硬件上存在的体系结构,而是一个虚拟体系结构。这些程序的代码首先被编译为针对其虚拟体系结构的中间代码,再由虚拟机的运行时支持系统翻译为硬件的机器语言进行执行。

2.2 系统级虚拟化

系统级虚拟化即硬件抽象层上的虚拟化、指令集级虚拟化,是最早被提出和研究的一种虚拟化技术,当前存在多种此种技术的具体实现方案,在介绍它们之前,有必要先了解实现系统级虚拟化可采取的途径。

在每台虚拟机中都有属于它的虚拟硬件,通过虚拟化层的模拟,虚拟机中的操作系统认为自己仍然是独占一个系统在运行,这个虚拟化层被称为虚拟机监控器(Virtual Machine Monitor,VMM)。VMM对物理资源的虚拟可以归结为三个主要任务:处理器虚拟化、内存虚拟化和I/O虚拟化。其中,处理器虚拟化是VMM中最核心的部分,因为访问内存或进行I/O本身就是通过一些指令来实现的。

2.2.1 可虚拟化架构和不可虚拟化架构

在系统级虚拟化中,虚拟计算机系统和物理计算机系统可以是两个完全不同ISA(Instruction Set Architecture,指令集架构)的系统,例如,可以在一个x86的物理计算机上运行一个安腾的虚拟计算机。但是,不同的ISA使得虚拟机的每一条指令都需要在物理机上模拟执行,从而造成性能上的极大下降。

显然,相同体系结构的系统虚拟化通常会有比较好的性能,并且VMM实现起来也会比较简单。这种情况下虚拟机的大部分指令可以在处理器上直接运行,只有那些与硬件资源关系密切的敏感指令才会由VMM进行处理。此时面前的一个问题是,要能将这些敏感指令很好地筛选出来。但事实上,某些处理器在设计之初并没有充分考虑虚拟化的需求,导致没有办法识别出所有的敏感指令,因而不具备一个完备的可虚拟化结构。

大多数的现代计算机体系结构都有两个或两个以上的特权级,用来分隔系统软件和应用软件。系统中有一些操作和管理关键系统资源的指令会被定为特权指令,这些指令只有在最高特权级上才能够正确执行。如果在非最高特权级上运行,特权指令会引发一个异常,处理器会陷入到最高特权级,交由系统软件来处理。

在x86架构中,所有的特权指令都是敏感指令,然而并不是所有的敏感指令都是特权指令。

为了VMM可以完全控制系统资源,它不允许虚拟机上操作系统直接执行敏感指令。如果一个系统上所有敏感指令都是特权指令,则能够用一个很简单的方法来实现一个虚拟环境:将VMM运行在系统的最高特权级上,而将客户机操作系统运行在非最高特权级上,当客户机操作系统因执行敏感指令而陷入到VMM时,VMM模拟执行引起异常的敏感指令,这种方法被称为“陷入再模拟”。

总而言之,判断一个架构是否可虚拟化,其核心就在于该结构对敏感指令的支持上。如果一个架构中所有敏感指令都是特权指令,则称其为可虚拟化架构,否则称为不可虚拟化架构。

2.2.2 按照实现方法分类

系统级虚拟化有许多不同的具体实现方案,按照实现方法的不同,可划分为如下几个类别。

(1)仿真(Emulation)

我们已经知道,通过陷入再模拟敏感指令的执行来实现虚拟机的方法是有前提条件的:所有的敏感指令必须都是特权指令。如果一个体系结构上存在敏感指令不属于特权指令,那么其就存在虚拟化漏洞,可以采用一些方法来填补或避免这些漏洞。最简单直接的方法是,所有指令都采用模拟来实现,就是取一条指令,就模拟出这条指令执行的效果。这种方法称作仿真。

仿真是最复杂的虚拟化实现技术,使用仿真方法,可以在一个x86处理器上运行为PowerPC设计的操作系统,这在其它的虚拟化方案中是无法实现的。甚至可以运行多个虚拟机,每个虚拟机仿真一个不同的处理器。此外,这种方法不需要对宿主操作系统的特殊支持,虚拟机可以完全作为应用层程序运行。

正如前面提到的,使用仿真方法的主要问题是速度会非常慢。由于每条指令都必须在底层硬件上进行仿真,因此速度减慢100倍的情况也并不稀奇。若要实现高度保真的仿真,包括周期精度、CPU的缓存行为等,实际速度差距甚至可能会达到1000倍之多。

使用这种方式的典型实现是Bochs。

(2)完全虚拟化(Full Virtualization)

在客户操作系统看来,完全虚拟化的虚拟平台和现实平台是一样的,客户机操作系统察觉不到是运行在一个虚拟平台上,这样的虚拟平台可以运行现有的操作系统,无须对操作系统进行任何修改,因此这种方式被称为完全虚拟化。

进一步说,客户机的行为是通过执行反映出来的,因此VMM需要能够正确处理所有可能的指令。在实现方式上,以x86架构为例,完全虚拟化经历了两个阶段:软件辅助的完全虚拟化和硬件辅助的完全虚拟化。

①软件实现的完全虚拟化

在x86虚拟化技术的早期,没有在硬件层次上对虚拟化提供支持,因此完全虚拟化只能通过软件实现。一个典型的做法是二进制代码翻译(Binary Translation)。

二进制代码翻译的思想是,通过扫描并修改客户机的二进制代码,将难以虚拟化的指令转化为支持虚拟化的指令。VMM通常会对操作系统的二进制代码进行扫描,一旦发现需要处理的指令,就将其翻译成为支持虚拟化的指令块(Cache Block)。这些指令块可以与VMM合作访问受限的虚拟资源,或者显式地触发异常让VMM进一步处理。

这种技术虽然能够实现完全虚拟化,但很难在架构上保证其完整性。因此,x86厂商在硬件上加入了对虚拟化的支持,从而在硬件架构上实现了虚拟化。

②硬件辅助完全虚拟化

可以预料,如果硬件本身加入足够的虚拟化功能,可以截获操作系统对敏感指令的执行或者对敏感资源的访问,从而通过异常的方式报告给VMM,这样就解决了虚拟化的问题。硬件虚拟化时一种完备的虚拟化方法,因而内存和外设的访问本身也是由指令来承载,对处理器指令级别的截获就意味着VMM可以模拟一个与真实主机完全一样的环境。

Intel的VT-x和AMD的AMD-V是这一方向的代表。以VT-x为例,其在处理器上引入了一个新的执行模式用于运行虚拟机,当虚拟机执行在这个特殊模式中时,它仍然面对的是一套完整的处理器寄存器集合和执行环境,只是任何敏感操作都会被处理器截获并报告给VMM。

在当前的系统级虚拟化解决方案中,全虚拟化应用得非常普遍,典型的有知名的产品有VirtualBox、KVM、VMware Workstation和VMware ESX(它在其4.0版,被改名为VMware vSphere)、Xen(也支持全虚拟化)。

(3)类虚拟化(Para-Virtualization)

这样的虚拟平台需要对所运行的客户机操作系统进行或多或少的修改使之适应虚拟环境,因此客户机操作系统知道其运行在虚拟平台上,并且会去主动适应。这种方式被称为类虚拟化,有时也称作半虚拟化。另外,值得指出的是,一个VMM可以既提供完全虚拟化的虚拟平台,又提供类虚拟化的虚拟平台。

类虚拟化是通过在源代码级别修改指令以回避虚拟化漏洞的方式来使VMM 能够对物理资源实现虚拟化。上面谈到x86 存在一些难以虚拟化的指令,完全虚拟化通过Binary Translation在二进制代码级别上来避免虚拟化漏洞。类虚拟化采取的是另一种思路,即修改操作系统内核的代码,使得操作系统内核完全避免这些难以虚拟化的指令。

既然内核代码已经需要修改,类虚拟化进一步可以被用于优化I/O。也就是说,类虚拟化不是去模拟真实世界中的设备,因为太多的寄存器模拟会降低性能.相反,类虚拟化可以自定义出高度优化的协议I/O。这种I/O协议完全基于事务,可以达到近似物理机的速度。这种虚拟技术以Xen为代表,微软的Hyper-V所采用技术和Xen类似,也可Hyper-V归属于半虚拟化。

2.2.3 按照实现结构分类

在系统级虚拟化的实现中,VMM是一个关键角色,前面已介绍过VMM的组成部分。从Host实现VMM的角度出发,还可以将当前主流的虚拟化技术按照实现结构分为如下三类。

Hypervisor模型

Hypervisor这个术语是在 20 世纪 70 年代出现的,在早期计算机界,操作系统被称为Supervisor,因而能够在其他操作系统上运行的操作系统被称为 Hypervisor。

在Hypervisor模型中,VMM首先可以被看做是一个完备的操作系统,不过和传统操作系统不同的是,VMM是为虚拟化而设计的,因此还具备虚拟化功能。从架构上来看,首先,所有的物理资源如处理器、内存和I/O设备等都归VMM所有,因此,VMM承担着管理物理资源的责任;其次,VMM需要向上提供虚拟机用于运行客户机操作系统,因此,VMM还负责虚拟环境的创建和管理。

由于VMM同时具备物理资源的管理功能和虚拟化功能,因此,物理资源虚拟化的效率会更高一些。在安全方面,虚拟机的安全只依赖于VMM的安全。Hypervisor模型在拥有虚拟化高效率的同时也有其缺点。由于VMM完全拥有物理资源,因此,VMM需要进行物理资源的管理,包括设备的驱动。我们知道,设备驱动开发的工作量是很大的。因此,对于Hypervisor模型来说这是个很大的挑战。事实上,在实际的产品中,基于Hypervisor模型的VMM通常会根据产品定位,有选择地挑选一些I/O设备来支持,而不是支持所有的I/O设备。

采用这种模型的典型是面向企业级应用的VMware vSphere。

宿主模型

与Hypervisor模型不同。在宿主模型中,物理资源由宿主机操作系统管理。宿主机操作系统是传统操作系统,如Windows 、Linux等,这些传统操作系统并不是为虚拟化而设计的,因此本身并不具备虚拟化功能,实际的虚拟化功能由VMM来提供。VMM通常是宿主机操作系统独立的内核模块,有些实现中还包括用户态进程,如负责I/O虚拟化的用户态设备模型。 VMM通过调用宿主机操作系统的服务来获得资源, 实现处理器、内存和I/O设备的虚拟化。VMM创建出虚拟机之后,通常将虚拟机作为宿主机操作系统的一个进程参与调度。

宿主模型的优缺点和Hypervisor模型恰好相反。宿主模型最大的优点是可以充分利用现有操作系统的设备驱动程序,VMM无须为各类I/O设备重新实现驱动程序,可以专注于物理资源的虚拟化。考虑到I/O设备种类繁多,千变万化, 设备驱动程序开发的工作量非常大,因此,这个优点意义重大。此外,宿主模型也可以利用宿主机操作系统的其他功能,例如调度和电源管理等,这些都不需要VMM重新实现就可以直接使用。

宿主模型当然也有缺点,由于物理资源由宿主机操作系统控制,VMM得要调用宿主机操作系统的服务来获取资源进行虚拟化,而那些系统服务在设计开发之初并没有考虑虚拟化的支持,因此,VMM虚拟化的效率和功能会受到一定影响。此外,在安全方面,由于VMM是宿主机操作系统内核的一部分,因此,如果宿主机操作系统内核是不安全的,那么,VMM也是不安全的,相应地运行在虚拟机之上的客户机操作系统也是不安全的。换言之,虚拟机的安全不仅依赖于VMM的安全,也依赖于宿主机操作系统的安全。

采用这种模型的典型是KVM、VirtualBox和VMware Workstation。

混合模型

混合模型是上述两种模式的汇合体。VMM依然位于最低层,拥有所有的物理资源。与Hypervisor模式不同的是,VMM 会主动让出大部分I/O设备的控制权,将它们交由一个运行在特权虚拟机中的特权操作系统控制。相应地,VMM 虚拟化的职责也被分担.处理器和内存的虚拟化依然由VMM来完成,而I/O的虚拟化则由VMM和特权操作系统共同合作来完成。

I/O设备虚拟化由VMM和特权操作系统共同完成,因此,设备模型模块位于特权操作系统中,并且通过相应的通信机制与VMM合作。

混合模型集中了上述两种模型的优点。 VMM可以利用现有操作系统的I/O设备驱动程序,不需要另外开发。VMM直接控制处理器、内存等物理资源,虚拟化的效率也比较高。

在安全方面,如果对特权操作系统的权限控制得当,虚拟机的安全性只依赖于VMM。当然,混合模型也存在缺点。由于特权操作系统运行在虚拟机上,当需要特权操作系统提供服务时,VMM需要切换到特权操作系统,这里面就产生上下文切换的开销。当切换比较频繁时,上下文切换的开销会造成性能的明显下降。出于性能方面的考虑,很多功能还是必须在VMM 中实现,如调度程序和电源管理等。

采用这种模型的典型是Xen。

2.3 操作系统级虚拟化

在操作系统虚拟化技术中,每个节点上只有唯一的系统内核,不虚拟任何硬件设备。通过使用操作系统提供的功能,多个虚拟环境之间可以相互隔离。通常所说的容器(Container)技术,如目前为止最流行的容器系统Docker,即属于操作系统级虚拟化。此外,在不同的场景中,隔离出的虚拟环境也被称作虚拟环境(即VE,Virtual Environment)或虚拟专用服务器(即VPS,Virtual Private Server)。

以容器技术为例,它有自己独特的优点,它的出现,一方面解决了传统操作系统所忽视和缺乏的应用程序间的独立性问题,另一方面,它避免了相对笨重的系统级虚拟化,是一种轻量级的虚拟化解决方案。

操作系统领域一直以来面临的一个主要挑战来自于应用程序间存在的相互独立性和资源互操作性之间的矛盾,即每个应用程序都希望能运行在一个相对独立的系统环境下,不受到其他程序的干扰,同时又能以方便快捷的方式与其他程序交换和共享系统资源。当前通用操作系统更强调程序间的互操作性,而缺乏对程序间相对独立性的有效支持,然而对于许多分布式系统如Web服务、数据库、游戏平台等应用领域,提供高效的资源互操作同保持程序间的相对独立性具有同等重要的意义。

主流虚拟化产品VMware和Xen等均采用Hypervisor模型(Xen采用的混合模型与Hypervisor模型差别不大,可统称为Hypervisor模型)。该模型通过将应用程序运行在多个不同虚拟机内,实现对上层应用程序的隔离。但由于Hypervisor 模型倾向于每个虚拟机都拥有一份相对独立的系统资源,以提供更为完全的独立性,这种策略造成处于不同虚拟机内的应用程序间实现互操作非常困难。例如, 即使是运行在同一台物理机器上,如果处于不同虚拟机内,那么应用程序间仍然只能通过网络进行数据交换,而非共享内存或者文件。而如果使用容器技术,由于各容器共享同一个宿主操作系统,能够在满足基本的独立性需求的同时提供高效的系统资源共享支持。

容器技术还可以更高效地使用系统资源,由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。此外,容器还具有更快速的启动时间,传统的虚拟机技术启动应用服务往往需要数分钟,而对于容器由于,直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间,大大的节约了应用开发、测试、部署的时间。

3.虚拟化技术的优势和劣势

(1)虚拟化技术的优势:
①更高的资源利用率——虚拟可支持实现物理资源和资源池的动态共享,提高资源利用率,特别是针对那些平均需求远低于需要为其提供专用资源的不同负载。

②降低管理成本——虚拟可通过以下途径提高工作人员的效率:减少必须进行管理的物理资源的数量;隐藏物理资源的部分复杂性;通过实现自动化、获得更好的信息和实现中央管理来简化公共管理任务;实现负载管理自动化。另外,虚拟还可以支持在多个平台上使用公共的工具。

③提高使用灵活性——通过虚拟可实现动态的资源部署和重配置,满足不断变化的业务需求。

④提高安全性——虚拟可实现较简单的共享机制无法实现的隔离和划分,这些特性可实现对数据和服务进行可控和安全的访问。

⑤更高的可用性——虚拟可在不影响用户的情况下对物理资源进行删除、升级或改变。

⑥更高的可扩展性——根据不同的产品,资源分区和汇聚可支持实现比个体物理资源小得多或大得多的虚拟资源,这意味着您可以在不改变物理资源配置的情况下进行规模调整。

⑦互操作性和投资保护——虚拟资源可提供底层物理资源无法提供的与各种接口和协议的兼容性。

⑧改进资源供应——与个体物理资源单位相比,虚拟能够以更小的单位进行资源分配。

(2)虚拟化技术的缺点:

  1. 降低性能

虚拟化毕竟是在硬件层之上进行了封装,相比直接基于物理机,必然会损失一部分性能。从之前的经验来看,当一台物理机上并行运行多个虚拟机时,物理机资源的使用率越高,虚拟机性能下降的越剧烈。主要有两个原因:a. CPU-若VM配置了多核CPU,当VM内应用要求多核同时处理某一任务时,此时物理机若只有少于所需的核数空闲,那么VM会锁住可用的核再去等待其他的核释放。若虚机较多并且物理机CPU很繁忙,此操作会造成类似于死锁的现象,导致表象性能急剧下降。近几年各大厂商在此方面做了很多的优化,该bug有很好的改进。b. IO-通常的IO是直接写在物理硬盘上,而VM的IO则是先写在host系统的虚拟机镜像文件上,再由host以某种策略写入物理硬盘。一来这种二段式的写入会造成读写的延迟,二来当计算部署的虚机数量时,硬盘的IOPS和多机造成的随机写方式,往往是非常容易忽略的一个指标。例如,7200转的SATA盘理论IOPS是76,一般windows工作时的IOPS是1030(装杀毒软件的话可能double一下),因此理论上一块SATA盘只能支持23个VM。当虚拟机数量超配后,多个VM繁忙时会造成所有VM处于io_wait的状态。

  1. 降低硬件利用率

这点似乎和上面所说的优点矛盾了,其实只是角度不同而已。

虚拟化必然需要占用一部分资源(CPU/内存/硬盘),一个可以发挥出100%性能的物理机,加上虚拟化以后,可能只能发挥出80%的性能,所以又说它会降低资源的利用率。因此某些极度吃资源的应用可能并不适用于虚拟化的环境。

  1. 可能扩大错误影响面

在常规配置下,虚拟机存储于本地物理机硬盘上。真实物理机down机,上面的虚拟机将全部不可用。另外还有一个真实发生的故事,物理机硬盘损坏,一般可以恢复出绝大部分文件,但碰巧坏的是虚拟机镜像文件,结果虚拟机里面的文件全军覆没。

  1. 实施配置复杂,管理复杂

通常的IT管理员并不能很好的排查并解决虚拟化使用过程中的问题,例如经常碰到的VM不能启动或者卡死,没有真实物理机那么好解决。

  1. 建设成本并不低。

虽然后期的电力和管理费用比传统纯物理机要省,但前期建设成本甚至有可能超过单买PC机的价格。

成功实施的关键

大多数虚拟化方案不能落地,或者在使用过程中效果差强人意的表面原因大多来自于上面所说的几个缺点。然而,所谓的缺点其实需要辩证的来看,认清楚虚拟化的使用场景,深入了解客户的需求和使用习惯,做出对应的部署方案和运维策略,就可以避免绝大多数的问题,甚至将问题转化为优势。

一问应用类型。大型的应用在极限情况下会要求尽可能多的硬件资源,此时若再加上虚拟化,要么性能不足,要么价格飞上天。若真要考虑闲时机器的共享问题,多用户分享一下也许就够了。

二问规模和用途。小规模的虚拟化使用一般不配HA和外接存储等,因此在稳定性上面是存在比较大的风险的。但是像学校多媒体教室、话务中心这种不需要有状态VM的情况下,影响会降低,然而并不能解决一台宿主机出现故障整个教室都不能上课的情况。这种情况下,IDV甚至简单的RDS+一些管理功能就能胜任了。

三问使用需求和习惯。详细的询问应用列表,观察客户的使用时间和使用习惯,是能够大致计算出上云之后对硬件的整体压力的,如CPU核数、VM的内存、所需的IOPS等等,根据指标和未来的规划算出真正实用的部署方式。但是现在大多不会去做这些前期工作,只是简单的询问就推出已定的标准化配置;要么厂家为了压低价格,把虚机跑的满满的,导致真的使用的时候开个机要10分钟。

四问稳定性和价格需求。负载均衡、高可用性、外接存储系统、动态迁移、冷/热备份等等的功能往往是需要额外购买和配置的,并且通常价格不菲。不要以为用了虚拟化就自带了这些优势。还是那句话,单纯的虚拟化是降低可靠性的,要提高可靠性和可用性,需要考虑并且付出额外的东西。

五问客户方的维护能力。虚拟化要想长期稳定的运行,监控和运维所需的能力要比传统运维硬件要求高很多,否则就会出现用着用着虚拟机就越来越慢,效果越来越差的问题。等到资源爆表再想挽回的那一天就悔不该当初了。之前有项目是在教育领域,实施完毕之后客户方连键盘鼠标插服务器哪里都不知道,这就有点尴尬了。

二、 虚拟化技术的原理

到目前为止,虚拟化技术的各方面都有了进步,虚拟化也从纯软件的虚拟化逐深入到处理器级虚拟化,再到平台级虚拟化乃至输入/输出级虚拟化。对数据中心来说,虚拟化可以节约成本,最大化利用数据中心的容量和更好的保护数据。虚拟化技术已经成为私有云和混合云设计方案的基础。

本节将简单地介绍虚拟化技术原理,包括虚拟机的原理、CPU 虚拟化原理、内存虚拟化原理以及网络虚拟化原理。

1.虚拟化技术原理

虚拟机(Virtual Machine, VM) 是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。简单地说,虚拟机就是通过软件在宿主机上虚拟出一台计算机。虚拟机技术是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部分是不受现有资源的架设方式、地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和数据存储。在实际的生产
环境中,虚拟机技术主要用来解决云数据中心和高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化地利用物理硬件。即将多个操作系统熟合到一台高性能服务器上,最大化利用硬件平台的所有资源,用更少的投入实现更多的应用,还可以简化IT 架构,降低管理资源的难度,避免IT架构的非必要扩张。而且虚拟机的真正硬件无关性还可以实现虚拟机运行时迁移,实现真正的不间断运行,从而最大化保持业务的持续性,不用为购买超高可用性平台而付出高昂的代价。

虚拟机技术实现了一台计算机同时运行多个操作系统,而且每个操作系统中都有多个程序运行,每个操作系统都运行在一个虚拟的CPU或虚拟主机上。虚拟机技术需要 CPU、主板芯片组、BIOS和软件的支持,如VMM软件或者某些操作系统本身。

虚拟机技术的核心是虚拟机监视器VMM (Virtual Machine Monitor) , VMM也称为
Hypervisor. VMM的作用是向底层分配访问宿主机的硬件资源,向上管理虚拟机的操作系统和应用程序。它是一个宿主程序,该程序是一层位于操作系统和计算机硬件之间的代码,用来将硬件平台分割成多个虚拟机,实现一台计算机支持多个完全相同的执行环境。每个用户都会感觉到自己在一台独立的、与其他用户相隔离的计算机上进行操作,尽管事实上为每个用户提供服务的都是同一台机器。在此种情况下,一台虚拟机就是由一个潜在的控制程序管理的操作系统。VMM 为每个客户操作系统虚拟一套独立于实际硬件的虚拟硬件环境(包括处理器、内
存、I/O 设备等)。VMM采用某种调度算法在各个虚拟机之间共享 CPU, 如采用时间片轮转调度算法。

虚拟机系统与实际的计算机操作系统没有区别,也会感染病毒,但是由于虚拟机是封闭的虚拟环境,如果虚拟机不与宿主机连接,则不会受宿主机病毒的影响。

2.CPU虚拟化原理

cpu虚拟化:
    1、模拟:纯软件方式实现,性能很差。虚拟机运行在模拟出来的cpu上。(模拟出环1,2,3,4)
    2、虚拟:完全虚拟化:full-virtulization,不知道自己运行在虚拟环境中,需要调用特权命令时直接调用。虚拟出来的架构与地参架构要保持一致
    BT技术:二进制翻译(软件),边翻译边执行。上层架构和底层架构要保持一致(即虚拟机系统架构和物理机的系统架构保持一致)。虚拟机用户空之间可直接运行在物理cpu的环3,只需要虚拟出ring0

HVM技术:硬件辅助虚拟化,此cpu为特制cpu,比普通cpu多了一个环(环-1,0,1,2,3),物理机的内核运行在环-1上,虚拟机的内核运行在环0上,用户空间都运行在环3上(性能优秀)

半虚拟化:para-virtulization,知道自己运行在虚拟环境中,需要调用特权指令时,向物理机的内核发起请求,由物理内核进行调用(性能优秀,切需要对虚拟机的内核进行修改)。虚拟出来的架构与底层架构要保持一致。
内存虚拟:shadow page table技术(影子页表):需要经过两次的内存地址转换。cpu在不同虚拟机之间切换时,需要清空MMU中的缓存,所以TLB中的缓存很难命中,效率低下。
      虚拟机是进程,进程运行时需要申请内存,虚拟机把自己看作是运行在申请来的内存上(虚拟内存),实际上是运行在物理内存上。当虚拟机中的进程需要调用内存时,先将进程所需的线性地址空间地址发送给MMU,由MMU映射到虚拟机申请来的虚拟内存地址,在由shadow page table技术将虚拟内存地址转换到物理内存地址中。

硬件虚拟化:
    MMU Virtulization:MMU虚拟化(硬件虚拟化,需要特定cpu支持)
    Intel:EPT,ExtendedPage Table
    AMD:NTP,Nested Page Table

TLB virtulization
      tagged TLB

I/O:
外存:
硬盘、光盘、U盘
网络设备:
网卡
显示设备:
VGA:frame buffer机制
键盘鼠标:
ps/2,usb

I/O虚拟化的方式:
    模拟(性能较差):完全使用软件来模拟真实硬件

半虚拟化(性能优秀):只能运用在网卡和硬盘设备上。如果虚拟机向外发一个包,直接由虚拟机中的IO前端驱动(IO frontend)直接转发到物理机中的IO站(IO stack),然后又由物理机的内核直接将IO站中的包通过IO后端驱动(IO backend)来驱动网卡将包发送出去。此方法与模拟的方法比较,减少了在虚拟机中通过软件模拟网卡,然后由虚拟机中的驱动来驱动网卡,再由模拟的网卡将包转发进物理机中的步骤,性能大大提升。

IO-through:IO透传
多个硬件设备,每台虚拟机通过物理机上内核中的IO管理器(IO Manager)调度到自己专属的硬件设备上。如:有五块硬盘,物理机使用了两块硬盘,剩下的三块硬盘分配到3台虚拟机上,每个虚拟机有自己的专属硬盘。

需要主板支持透传技术
      Intel:VT-d 在虚拟技术中,实现IO的可靠性,灵活性,和性能的提升。基于北桥的硬件辅助的虚拟化技术。

三、常见的虚拟化技术解决方案

1.OpenStack

OpenStack (https: //www.openstack.org/) 是由 NASA (美国国家航空航天局)和 Rackspace 合作研发并发起的、以Apache许可证授权的自由软件和开放源代码项目,OpenStack 是一款开源的云平台,通过相应的API与驱动对虚拟
机进行管理,它几乎支持市面所有类型的虚拟化环境。OpenStack 本身不提供虚拟化功能,虚拟化由VMM提供,Openstack则是根据相应的 API 对VMM 进行管理。Openstack 负责平台的搭建与周边功能的完善。OpenStack 设计的初衷就是适应分布式应用的架构,应用的组件在该平台中可以跨越多个物理设备或虚拟设备。这些类型的应用也被设计成随着规模的增加,可以通过添加应用实例或者重新平衡应用实例间的负载。它要实现的目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。

从逻辑上来看,OpenStack 由三个部分组成:控制模块,网络模块及计算模块。控制模块主要运行一些API接口服务、消息队列、数据库管理模块及Web的接口等;网络模块主要提供为各个虚拟机提供网络服务;计算模块则主要负责处理消息、控制虚拟机等操作。

从OpenStack的组成来看,它包含了众多的模块,并且这些模块都可以分布式部署。主要包含以下几个重要模块:Nova、Keystone、Ceilometer、Horizon、Glance、Neutron、 Cinder 及Swift 等。Nova 主要提供计算功能;Keystone 负责认证与授权:Ceilometer 用于资源与系统运行情况的监控;Horizon 为用户提供了方便管理的Web平台;Neutron 负责网络环境的搭建与虚拟化;Glance 用于镜像文件的管理;Cinder 负责块存储,可以为用户提供 SaaS (Storage as a Service, 存储即服务)服务:Swift 同样负责存储,但它主要负责数据对象、镜像、数据备份等平台所用的数据存储,同样也可以对Cinder的数据进行备份存储。

2.KVM

基于内核的虚拟机(Kernel-based Virtual Machine, KVM) 是开源软件,其Logo 其官网地址为:https: //www.linux-kvm.org/page/Main Page.KVM是一款基于X86架构,硬件支持虚拟化技术的Linux 全虚拟化解决方案。硬件支持虚拟化技术由 CPU 厂商提供,目前市面上有两种技术方案,Intel-VT与 AMD-V.KVM 首次被并入Linux 的内核版本为2. 6. 20, 在RHEL 5. 4中推出,并于2007年2月5日正式发布。只要硬件支持 Intel- VT或AMD-V就可以使用KVM.可以通过命令grep-E“vmx|svm”/proc/cpuinfo来确定当前硬件平台的支持情况.

如果系统已经支持了 VMX (Virtual Machine Extension, 由Intel 提供)或者SVM (Secur Virtual Machine, 由AMD提供), 则可以加载 Linux 底层相应的驱动以使用 KVM, 如果是Intel平台,则加载kvm-intel.ko; 如果是AMD平台,则加载kvm-amd.ko.

3.Hyper-V

Hyper-V 设计的目的是为广大的用户提供更为熟悉以及成本效益更高的虚拟化基础设施软件,这样可以降低运作成本、提高硬件利用率、优化基础设施并提高服务器的可用性。Hyper-V 采用微内核的架构,兼顾了安全性和性能的要求。由于 Hyper-V 底层的 Hypervisor 代码量很小,不包含任何第三方的驱动,非常精简,安全可靠、执行效率高,能充分利用硬件资源,使虚拟机系统性能更接近真实系统性能。Hyper-V 采用基于 VMBUS (Virtual Machine Bus) 的高速内存总线架构,所有来自虚拟机的硬件请求,不论是显卡、鼠标、键盘或者其他设备,都可以直接经虚拟化服务客户机(Virtualization Service Consumer, VSC) , 通过
VMBUS 总线发送到根分区的虚拟化服务提供者(Virtualization Service Provider, VSP) , VSP 则调用对应的设备驱动直接访问硬件,中间不再需要通过Hypervisor的管理。这种方式下,每个虚拟机的硬件请求,不再需要经过用户模式、内核模式的多次上下文切换转移,从而极大地提高了运行效率。

如果想要在 Hyper-V 中运行 Linux 操作系统也是没有问题的,只需要安装与 Linux 相关的组件即可。这些组件可以是支持Xen的 Linux 内核,也可以是专门为 Linux 设计的集成组件。当然,这些组件本身就已经集成了相关的驱动,所以用户不再需要关心在 Hyper-V中的驱动相关的问题。在安装完成这些组件后,Hyper-V可以很完美地支持Linux.

Hyper-V可以采用半虚拟化和全虚拟化两种模拟方式创建虚拟机。半虚拟化方式要求虚拟机与物理主机的操作系统(通常是版本相同的 Windows) 相同,以使虚拟机具备高性能;全虚拟化方式要求CPU支持全虚拟化功能,如Inter-VT或AMD-V, 以便能够创建使用不同的操作系统的虚拟机,如Linux或者Mac OS.

四、常见虚拟化应运实践的技术

1.虚拟化环境的搭建

为更加直观地说明虚拟化的用途与原理,本文以服务器虚拟化技术的寄居架构来说明。本文所使用的演示环境:VMM和VMware Workstation.客户虚拟机使用的操作系统为:Debian 9. 1. 0.注意,如果你用的不是这个版本,安装过程中出现的步骤可能会有些许不同,请根据相应的版本参考官方文档,在此就不再多做介绍。虚拟化环境的搭建步骤如下。

  1. 启动 VMware Workstation.启动 VMware Workstation后。
  2. 创建虚拟机并选择已经准备好的ISO 镜像(在Windows平台中,以。iso结尾的镜像一般称为ISO镜像。在其他平台中,需要看文件本身的内容才能确定,但通常也是以。iso扩展名结尾), 配置虚拟机名字为 debian, 并启动该虚拟机。
    3)启动后出现的安装界面,选中默认的图形化安装选项“Graphical install".

2.克隆虚拟机

克隆简单来说就是复制的意思。克隆虚拟机可以加快测试环境的搭建,同时加快版本的发布。开发人员常在虚拟机里将新版本提前部署完成,测试人员则可以直接将开发人员部署好的环境拿来使用,或者只修改其中一小部分其他配置,如IP 地址等,极大地减轻了测试人员的环境搭建工作量,节省了时间成本。下面将介绍如何进行虚拟机的克隆。注意,虚拟机的克隆只能在虚拟机断电的情况下,即关机的情况下才能进行。

  1. 启动虚拟机。在VMware Workstation 管理窗口中,选择:VM (虚拟机)-> Manage (管理)-》Clone (克隆)
    2) 选择Clone (克隆)之后,用于选择克隆类型。本文选择进行全克隆。说明:这里两种类型都可以选择(链接克隆和完整克隆), 链接克隆是对原始虚拟机的引用,所需的存储空间较少;完整克隆是克隆原始虚拟机当前状态的完整副本,所需存储空间较多。对于初学者来说,选择第二种克隆类型更方便,这样可以随便将克隆出来后的文件复制到其他地方。
    3) 选择Create a full clone (全克隆模式)后单击“下一步”按钮,显示正在克隆虚拟机的进度。
    4) 克隆完成后的虚拟机如图3-26所示。接下来就可以对克隆环境进行测试了。这时会发现克隆的虚拟机的所有配置与克隆之前的版本是一模一样的。如果在克隆之前的IP 地址是固定的,请对克隆后的IP 地址进行更新,否则可能会导致无法正常通信的情况。

3. 虚拟机做快照

假设虚拟磁盘是一张画纸,我们平时的操作就是在画纸上写写画画,建立快照就是在画纸上又蒙上了一层透明的纸,当你继续写写画画的时候,就是在新的透明纸上写写画画了,什么时候你想恢复到快照的状态,就把透明纸抽去就得了。

具体到实现,就是建立了快照后,这个磁盘文件就处于存档的状态,并创建一个新的增量磁盘文件,再进行新的读写,就在增量磁盘文件上进行,当然,读到增量磁盘上没有的文件还是会重定向到原来的磁盘文件。

建立多个快照,就要相应建立多个增量磁盘文件,当你删除快照的时候,其实就需要把这个快照对应的增量磁盘里的内容合并到原来的磁盘文件上,这个过程是挺慢的。

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值