一 什么是虚拟化

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

虚拟化(Virtualization)技术最早出现在 20 世纪 60 年代的 IBM 大型机系统,在70年代的 System 370 系列中逐渐流行起来.

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

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

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

二 为何要学习虚拟化

随着近年多核系统、集群、网格甚至云计算的广泛部署,虚拟化技术在商业应用上的优势日益体现,不仅降低了 IT 成本,而且还增强了系统安全性和可靠性,虚拟化的概念也逐渐深入到人们日常的工作与生活中。

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

网格

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

三 虚拟化技术的分类(了解)

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

  一:虚拟化技术主要分为以下几个大类 :

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

  我们通常所说的虚拟化主要是指平台虚拟化技术,通过使用控制程序(Virtual Machine Monitor 或Hypervisor),来创建虚拟机vm。

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

二:平台虚拟化技术又可以细分为如下几个子类:

 了解这些分类的关键在于一定要记住:vm是由vmm产生并运行的,然后看下列分类

如果把vmm当做小姐,那么vm就相当于嫖客,这个懂了以后下面的概念就很好理解了:

当小姐vmm为嫖客vm提供的是全套服务时,这就是全虚拟化,在嫖客vm的角度看,全套是相当爽的,啥都不用管了,just enjoy it,同样站在嫖客vm的角度去看,嫖的过程中你忘了准备套,怎么办?既然是全套那这个过程必然也包含了,于是小姐vmm去帮你买,这就意味着需要花的时间变长了,严重影响了嫖的效率,要知道时间就是金钱,嘤嘤嘤,说的竟然如此有道理。

为了解决上面的问题,足疗店为嫖客准备好了很多硬件设施,比如桌子上放上套,印—度—神—油啥的,对于你这个嫖客vm来说,有了这个特权,没有套这种影响效率的事情,自己直接从桌子上拿一盒最小号码的就行了,不再需要小姐vmm代劳了,这就是硬件辅助虚拟化。

嫖了一次你念念不忘,你毅然决然把自己两个肾卖掉,拿着卖肾的钱入股了足疗店,足疗店(硬件)因此为你颁发了终生成就奖和终身vip卡,有了这个vip卡(Hypercall),足疗店(硬件)是你家,你家有啥你就能用啥,这就相当于我们改变不了世界我们改变我们自己,这就是半虚拟化。

1. 全虚拟化(Full Virtualization)

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

这种'全'的特性的牛逼之处在于:原本是为物理硬件设计的操作系统或其它系统软件,完全不做任何修改就可以在虚拟机中运行。

然而飞的再高最后也得落地,vm最后还是要与vmm打交道,对于全虚拟化来说, VMM 必须完全并且完整地把自己模拟成硬件,为vm提供全部硬件调用接口,

同时必须模拟特权指令的执行过程,如下例

    

    让我们以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。

2. 硬件辅助虚拟化(Hardware-Assisted Virtualization)

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

3. 半虚拟化(Paravirtualization)

半虚拟化

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

4. 部分虚拟化(Partial Virtualization)

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

5. 操作系统级虚拟化(Operating System Level Virtualization)

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

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

内存虚拟化

概念:
MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。 历史:
许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还有用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为覆盖块(overlay)的片段。覆盖块0首先运行,结束时他将调用另一个覆盖块。虽然覆盖块的交换是由OS完成的,但是必须先由程序员把程序先进行分割,这是一个费时费力的工作,而且相当枯燥。人们必须找到更好的办法从根本上解决这个问题。不久人们找到了一个办法,这就是虚拟存储器(virtual memory).虚拟存储器的基本思想是程序,数据,堆栈的总的大小可以超过物理存储器的大小,操作系统把当前使用的部分保留在内存中,而把其他未被使用的部分保存在磁盘上。比如对一个16MB的程序和一个内存只有4MB的机器,操作系统通过选择,可以决定各个时刻将哪4M的内容保留在内存中,并在需要时在内存和磁盘间交换程序片段,这样就可以把这个16M的程序运行在一个只具有4M内存机器上了。而这个16M的程序在运行前不必由程序员进行分割。 MMU的功能是:将线性地址映射为物理地址
现代的多用户多进程操作系统,需要MMU,才能达到每个用户进程都拥有自己独立的地址空间的目标。使用MMU,操作系统划分出一段地址区域,在这块地址区域中,每个进程看到的内容都不一定一样。例如MICROSOFT WINDOWS操作系统将地址范围4M-2G划分为用户地址空间,进程A在地址0X400000(4M)映射了可执行文件,进程B同样在地址0X400000(4M)映射了可执行文件,如果A进程读地址0X400000,读到的是A的可执行文件映射到RAM的内容,而进程B读取地址0X400000时,则读到的是B的可执行文件映射到RAM的内容。

MMU

上图中的左半部分是正常情况下内存的使用情况,线性地址到物理地址的一个转换,通常应用程序使用的内存地址是线性地址,需要通过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中的物理地址的两次转换。

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,其他方案中没有找到相关专门名词。

网络虚拟化 

我们将在介绍neutron时详细介绍网络虚拟化

参考资料:http://www.ibm.com/developerworks/cn/linux/l-cn-vt/index.html

nova系列一:虚拟化介绍的更多相关文章

  1. [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之灯光介绍Lights

    [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之灯光介绍Lights 既上一篇分享了中文字幕的摄像机介绍Cameras后,本篇分享一下第2个已完工的 ...

  2. [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之摄像机介绍Cameras

    [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之摄像机介绍Cameras 最近得到一些Unity官方视频教程,一看全是纯英文的讲解,没有任何字幕或者 ...

  3. WPF入门教程系列三——Application介绍(续)

    接上文WPF入门教程系列二——Application介绍,我们继续来学习Application 三.WPF应用程序的关闭 WPF应用程序的关闭只有在应用程序的 Shutdown 方法被调用时,应用程序 ...

  4. .NET 4 并行(多核)编程系列之一入门介绍

    .NET 4 并行(多核)编程系列之一入门介绍 本系列文章将会对.NET 4中的并行编程技术(也称之为多核编程技术)以及应用作全面的介绍. 本篇文章的议题如下:  1. 并行编程和多线程编程的区别.  ...

  5. Linux从用户层到内核层系列 - GNU系列之glibc介绍

    题记:本系列文章的目的是抛开书本从源代码和使用的角度分析Linux内核和相关源代码,byhankswang和你一起玩转linux开发 轻松搞定TCP/IP协议栈,原创文章欢迎交流, byhankswa ...

  6. SQL Server编程系列(1):SMO介绍

    原文:SQL Server编程系列(1):SMO介绍 续篇:SQL Server编程系列(2):SMO常用对象的有关操作 最近在项目中用到了有关SQL Server管理任务方面的编程实现,有了一些自己 ...

  7. Solidity教程系列1 - 类型介绍

    现在的Solidity中文文档,要么翻译的太烂,要么太旧,决定重新翻译下,再加上代码事例讲解. 写在前面 Solidity是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果 ...

  8. 智能合约语言 Solidity 教程系列5 - 数组介绍

    写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 本文前半部分是参考Solidity官方文档(当前最新版本: ...

  9. 【01】emmet系列之基础介绍

    [01]emmet系列之基础介绍 [02]emmet系列之HTML语法 [03]emmet系列之CSS语法 [04]emmet系列之编辑器 [05]emmet系列之各种缩写 相关网址 官网:http: ...

  10. asp.net core系列 39 Razor 介绍与详细示例

    原文:asp.net core系列 39 Razor 介绍与详细示例 一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor ...

随机推荐

  1. PyTorch使用总览

    PyTorch使用总览 https://blog.csdn.net/u014380165/article/details/79222243 深度学习框架训练模型时的代码主要包含数据读取.网络构建和其他 ...

  2. 【机器学习】Google机器学习工程的43条最佳实践

    https://blog.csdn.net/ChenVast/article/details/81449509 本文档旨在帮助那些掌握机器学习基础知识的人从Google机器学习的最佳实践中获益.它提供 ...

  3. docker swarm 集群进入某节点容器失败的原因及解决方法

    今日在自己的docker swarm 测试环境中,想进入某个节点的容器去查看下,结果进入容器失败,并且报了如下错误信息: [root@worker1 ~]# docker exec -it 9a6f6 ...

  4. windows 获取用户的Sid的方法

    正常获取: whoami /user 如果要获取其他用户的SID就显得力不从心了,我们可以使用微软提供的系统工具 Sysinternals Suite 下载地址:https://docs.micros ...

  5. 自动化测试基础篇--Selenium等待时间

    摘自https://www.cnblogs.com/sanzangTst/p/8376221.html 当你觉得你的定位没有问题,但是却直接报了元素不可见,那你就可以考虑是不是因为程序运行太快或者页面 ...

  6. SQL Server 锁实验(UPDATE加锁探究)

    update语句: 本例中由于看到的是update执行完的锁情况,因此无法看到IU锁,但其实针对要修改的数据页和索引页会先加IU锁,记录和键先加U锁,然后再转化为IX和X锁. 如果想要看到IU锁和U锁 ...

  7. HTTP Health Checks

    This article describes how to configure and use HTTP health checks in NGINX Plus and open source NGI ...

  8. dp 洛谷P1977 出租车拼车 线性dp

    题目背景 话说小 x 有一次去参加比赛,虽然学校离比赛地点不太远,但小 x 还是想坐 出租车去.大学城的出租车总是比较另类,有“拼车”一说,也就是说,你一个人 坐车去,还是一堆人一起,总共需要支付的钱 ...

  9. Spark大数据平台安装教程

    一.Spark介绍 Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎.Spark是开源的类Hadoop MapReduce的通用并行框架,Spark拥有Hadoop MapRe ...

  10. focus()无效问题

    我想点击弹出一个控件的时候控件里的input自动获取焦点,INPUT的class为"group-input",可用下面的写法不行: document.queryselect(&qu ...