虚拟化介绍

1、什么是虚拟化(Virtualization)

  虚拟化说白了就是原本是一个完整的资源,切分或者说虚拟成多份,让这多份资源都使用起来,物尽其用,减小了浪费,提升了利用率,省了钱。vue

  虚拟化技术最先出如今 20 世纪 60 年代的 IBM 大型机系统,在70年代的 System 370 系列中逐渐流行起来.java

  在物理硬件之上安装软件:虚拟机监控器(Virtual Machine Monitor,VMM),而且用VMM来控制产生多个的虚拟机(Virtual Machine)实例,每一个vm均可以运行独立操做系统及应用软件。   python

  虚拟化是一个广义的术语,对于不一样的人来讲可能意味着不一样的东西,这要取决他们所处的环境。在计算机科学领域中,虚拟化表明着对计算资源的抽象,而不只仅局限于虚拟机的概念。程序员

  好比对物理内存的抽象:产生了虚拟内存技术,使得应用程序认为其自身拥有连续可用的地址空间(Address Space),而实际上,应用程序的代码和数据多是被分隔成多个碎片页或段),甚至被交换到磁盘、闪存等外部存储器上,即便物理内存不足,应用程序也能顺利执行。数据库

2、为什么要学习虚拟化

  随着近年多核系统、集群、网格甚至云计算的普遍部署,虚拟化技术在商业应用上的优点日益体现,不只下降了 IT 成本,并且还加强了系统安全性和可靠性,虚拟化的概念也逐渐深刻到人们平常的工做与生活中。安全

  网格(Grid),在信息学中,网格是一种用于集成或共享地理上分布的各类资源(包括计算机系统、存储系统、通讯系统、文件、数据库、程序等),使之成为有机的总体,共同完成各类所需任务的机制服务器

  虚拟化是云计算的基础,而咱们学习虚拟化的目的之一是为云平台提供云主机,具体的:在一台物理机上产生多台虚拟机(每台vm按照有不一样的操做系统),它们共享物理机的cpu,内存,IO硬件资源,可是逻辑上彼此隔离。网络

3、虚拟化技术的分类

  在这里讨论的虚拟化技术只针对 x86 平台(含 AMD 64),并假定虚拟机中运行的 Guest OS 也是为 x86 平台设计的。   jvm

一、虚拟化技术主要分如下几个大类

  • 平台虚拟化(Platform Virtualization),针对计算机和操做系统的虚拟化,即产生vm。
  • 资源虚拟化(Resource Virtualization),针对特定的系统资源的虚拟化,好比内存虚拟化、存储虚拟化、网络资源虚拟化等。
  • 应用程序虚拟化(Application Virtualization),包括仿真、模拟、解释技术(java虚拟机jvm)等。

  一般所说的虚拟化主要是指平台虚拟化技术,经过使用控制程序(Virtual Machine Monitor 或Hypervisor),来建立虚拟机vm。性能

  • Guest OS(客户机操做系统):虚拟机中运行的操做系统
  • Host OS(主机操做系统):运行虚拟机监控器VMM的操做系统,须要注意的是:某些虚拟机监控器VMM能够脱离操做系统直接运行在硬件之上(如 VMWARE 的 ESX 产品)

  

3、平台虚拟化技术分类

  这些分类的关键在于必定要记住:vm(虚拟机)是由vmm(虚拟机监视器)产生并运行的。

一、全虚拟化(Full Virtualization)

  全虚拟化的核心就在,‘全’指的是VMM为虚拟机模拟了完整的底层硬件,包括处理器、物理内存、时钟、外设等。

  优势:本来是为物理硬件设计的操做系统或其它系统软件,彻底不作任何修改就能够在虚拟机中运行。

  缺点:(1)然而飞的再高最后也得落地,vm最后仍是要与vmm打交道,对于全虚拟化来讲, VMM 必须彻底而且完整地把本身模拟成硬件,为vm提供所有硬件调用接口

     (2)必须模拟特权指令的执行过程,以下例所示

让咱们以x86 体系结构下对操做系统进程页表切换的操做(mov pgtable)为例,来介绍VMM把本身彻底模拟成硬件是怎么样一种过程:
1.真实的硬件提供了一个特权 CR3 寄存器来实现该接口,操做系统只需执行 "mov pgtable,%%cr3"的 汇编指令便可。
2.VMM 必须按照1中所述,彻底地模拟该接口执行的所有过程,可是若是硬件不提供虚拟化的特殊支持,那么这个模拟过程将会十分复杂:
    a:通常而言VMM 必须运行在最高优先级来彻底控制物理主机的系统,而 Guest OS 须要降级运行,于是不能执行特权操做(如进程页表切换mov pgtable这种特权操做)。
    b:当 Guest OS 执行前面的特权汇编指令(mov pgtable...)时,物理主机系统产生异常(General Protection Exception),执行控制权从新从 Guest OS 转到 VMM 手中。--->飞的再高也得回到地面
    c:VMM 先分配一个变量做为影子 CR3 寄存器交给 Guest OS。将 pgtable (进程表)表明的客户机物理地址(Guest Physical Address)填入影子 CR3 寄存器--->让Guest OS觉得本身在操做真实的内存。
    e:而后 VMM 将Guest Os须要操做的pgtable 翻译成物理主机的物理地址(Host Physical Address)并填入物理主机的 CR3 寄存器,最后返回到 Guest OS中。随后 VMM 还将处理复杂的 Guest OS 缺页异常(Page Fault)。

  该示例以下图所示:

  

  比较著名的全虚拟化 VMM 有 Microsoft Virtual PC、VMware Workstation、Sun Virtual Box、Parallels Desktop for Mac ,QEMU,KVM。

二、硬件辅助虚拟化(Hardware-Assisted Virtualization)

  硬件辅助虚拟化主要是为了解决全虚拟化在提供接口的同时必须模拟特权指令的执行过程,是指借助硬件(主要是主机处理器)的支持来实现高效的全虚拟化。例若有了 Intel-VT 技术的支持,Guest OS 和 VMM 的执行环境自动地彻底隔离开来,Guest OS 有本身的“全套寄存器”,能够直接运行在最高级别。所以在上面的例子中,Guest OS 可以执行修改页表的汇编指令。Intel-VT 和 AMD-V 是目前 x86 体系结构上可用的两种硬件辅助虚拟化技术。 

  

三、半虚拟化(Paravirtualization)

  这是一种修改 Guest OS 部分访问特权状态的代码以便直接与 VMM 交互的技术。在半虚拟化虚拟机中,部分硬件接口以软件的形式提供给客户机操做系统,这能够经过 Hypercall(VMM 提供给 Guest OS 的直接调用,与系统调用相似)的方式来提供。例如,Guest OS 把切换页表的代码修改成调用 Hypercall 来直接完成修改影子 CR3 寄存器和翻译地址的工做。因为不须要产生额外的异常和模拟部分硬件执行流程,半虚拟化能够大幅度提升性能,比较著名的 VMM 有 Denali、Xen。

  

四、部分虚拟化(Partial Virtualization)

  VMM 只模拟部分底层硬件,所以客户机操做系统不作修改是没法在虚拟机中运行的,其它程序可能也须要进行修改。在历史上,部分虚拟化是通往全虚拟化道路上的重要里程碑,最先出如今第一代的分时系统 CTSS 和 IBM M44/44X 实验性的分页系统中。

五、操做系统级虚拟化(Operating System Level Virtualization)

  在传统操做系统中,全部用户的进程本质上是在同一个操做系统的实例中运行,所以内核或应用程序的缺陷可能影响到其它进程。操做系统级虚拟化是一种在服务器操做系统中使用的轻量级的虚拟化技术,内核经过建立多个虚拟的操做系统实例(内核和库)来隔离不一样的进程,不一样实例中的进程彻底不了解对方的存在。比较著名的有 Solaris Container,FreeBSD Jail 和 OpenVZ 等。 

六、平台虚拟化总结

  这种分类并非绝对的,一个优秀的虚拟化软件每每融合了多项技术。例如 VMware Workstation 是一个著名的全虚拟化的 VMM,可是它使用了一种被称为动态二进制翻译的技术把对特权状态的访问转换成对影子状态的操做,从而避免了低效的 Trap-And-Emulate 的处理方式,这与半虚拟化类似,只不过半虚拟化是静态地修改程序代码。对于这种超虚拟化而言,若是能利用硬件特性,那么虚拟机的管理将会大大简化,同时还能保持较高的性能。

4、内存虚拟化

一、MMU(内存管理单元)

(1)概念:

  MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问受权,多用户多进程操做系统。

(2)历史:

  许多年之前,当人们还在使用DOS或是更古老的操做系统的时候,计算机的内存还很是小,通常都是以K为单位进行计算,相应的,当时的程序规模也不大,因此内存容量虽然小,但仍是能够容纳当时的程序。但随着图形界面的兴起还有用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出如今程序员的面前,那就是应用程序太大以致于内存容纳不下该程序,一般解决的办法是把程序分割成许多称为覆盖块(overlay)的片断。覆盖块0首先运行,结束时他将调用另外一个覆盖块。虽然覆盖块的交换是由OS完成的,可是必须先由程序员把程序先进行分割,这是一个费时费力的工做,并且至关枯燥。人们必须找到更好的办法从根本上解决这个问题。不久人们找到了一个办法,这就是虚拟存储器(virtual memory).虚拟存储器的基本思想是程序,数据,堆栈的总的大小能够超过物理存储器的大小,操做系统把当前使用的部分保留在内存中,而把其余未被使用的部分保存在磁盘上。好比对一个16MB的程序和一个内存只有4MB的机器,操做系统经过选择,能够决定各个时刻将哪4M的内容保留在内存中,并在须要时在内存和磁盘间交换程序片断,这样就能够把这个16M的程序运行在一个只具备4M内存机器上了。而这个16M的程序在运行前没必要由程序员进行分割。

(3)MMU的功能是:

  将线性地址映射为物理地址 现代的多用户多进程操做系统,须要MMU,才能达到每一个用户进程都拥有本身独立的地址空间的目标。使用MMU,操做系统划分出一段地址区域,在这块地址区域中,每一个进程看到的内容都不必定同样。例如MICROSOFT WINDOWS操做系统将地址范围4M-2G划分为用户地址空间,进程A在地址0X400000(4M)映射了可执行文件,进程B一样在地址0X400000(4M)映射了可执行文件,若是A进程读地址0X400000,读到的是A的可执行文件映射到RAM的内容,而进程B读取地址0X400000时,则读到的是B的可执行文件映射到RAM的内容。

二、 内存虚拟化图解

  

  上图中的左半部分是正常状况下内存的使用状况,线性地址到物理地址的一个转换,一般应用程序使用的内存地址是线性地址,须要经过MMU地址转换的一个硬件来实现线性地址到物理地址的一个转换。

  上图的右半部分是虚拟化状况下内存是如何实现线性地址到物理地址的转换,虚拟机中的OS得到是有Host OS分配的线性地址,Guest OS中的应用程序获取的是相对于Guest os来讲的线性地址,那么对于这个线性地址来讲最终只能转换成线性地址,没法转换成正在的物理地址,虚拟化中就提供了一个虚拟的MMU直接将Guest OS中的线性地址直接转换成真正的物理地址,可是这个虚拟的MMU毕竟是虚拟出来的没有真实的硬件MMU性能好并且虚拟MMU的开发也很复杂每个Guest都要有一个MMU,这对内存消耗太大。对于这种技术咱们称做是影子页表技术

    此后Intel开创了EPT(Extended Page Tables)技术,相对于影子页表技术来讲EPT技术下降了内存虚拟化的难度,EPT技术是直接在硬件上实现了Guest OS中的线性地址到Guest OS中的物理地址再到Host OS中的物理地址的两次转换。

5、IO虚拟化

  

一、最左边IO虚拟化的使用的是仿真技术

    咱们将要着重研究的kvm虚拟化就引用了这种技术    

    仿真(emulation)是一个彻底经过软件程序来模拟硬件的技术。早期虚拟化都才采用这种方案来虚拟网络设备。常见仿真软件有QEMU、VMware WorkStation、VirtualBox。Emulation网

二、中间的IO虚拟化是Para-virtualization

    Para-virtualization又称半虚拟化,最先由Citrix的Xen提出使用。在半虚拟化模型中,物理硬件资源统一由 Hypervisor管理,由Hypervisor提供资源调用接口。虚拟子机经过特定的调用接口与Hypervisor通讯,而后完整的对I/O资源进行控制操做.

三、最右边的是直接IO

    Hypervisor将一个PCI设备(能够是网卡、USB、光驱)直接分配给指定虚拟子机单独访问。为了安全和稳定性考虑,pass-through使用一般结合intel VT-D(AMD也有相似技术)来使用,经过iommu保证虚拟子机之间内存访问不冲突。这种技术在VMware上叫VMDirectPath I/O,其余方案中没有找到相关专门名词。

6、网络虚拟化 

  网络虚拟化见neutron模块。 

相关文章
相关标签/搜索