精华内容
下载资源
问答
  • 虚拟化技术原理和实现(带书签),介绍了虚拟化技术原理以及业界主流虚拟化软件产品,并以Xen、KVM开源软件为例分析了虚拟化软件的架构及其实现方法.
  • 虚拟化技术原理

    2020-12-21 15:33:26
    3. 2 虚拟化技术原理 到目前为止,虚拟化技术的各方面都有了进步,虚拟化也从纯软件的虚拟化逐深入到处理器级虚拟化,再到平台级虚拟化乃至输入/输出级虚拟化。对数据中心来说,虚拟化可以节约成本,最大化利用数据...

    3. 2 虚拟化技术原理

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

    3. 2. 1 虚拟机技术原理

    虚拟机(Virtual Machine, VM) 是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。简单地说,虚拟机就是通过软件在宿主机上虚拟出一台计算机。虚拟机技术是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以
    比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部分是不受现有资源的架设方式、地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和数据存储。在实际的生产环境中,虚拟机技术主要用来解决云数据中心和高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化地利用物理硬件。即将多个操作系统整合到一台高性能服务器上,最大化利用硬件平台的所有资源,用更少的投入实现更多的应用,还可以简化IT 架构,降低管理资源的难度,避免IT 架构的非必要扩张。而且虚拟机的真正硬件无关性还可以实现虚拟机运行时迁移,实现真正的不间断运行,从而最大化保持业务的持续性,不用为购买超高可用性平台而付出高昂的代价。
    虚拟机技术实现了一台计算机同时运行多个操作系统,而且每个操作系统中都有多个程序运行,每个操作系统都运行在一个虚拟的CPU或虚拟主机上。虚拟机技术需要 CPU、主板芯片组、BIOS和软件的支持,如VMM软件或者某些操作系统本身。虚拟机技术的核心是虚拟机监视器VMM (Virtual Machine Monitor) , VMM也称为Hypervisor. VMM的作用是向底层分配访问宿主机的硬件资源,向上管理虚拟机的操作系统和应用程序。它是一个宿主程序,该程序是一层位于操作系统和计算机硬件之间的代码,用来将硬件平台分割成多个虚拟机,实现一台计算机支持多个完全相同的执行环境。每个用户都会感觉到自己在一台独立的、与其他用户相隔离的计算机上进行操作,尽管事实上为每个用户提供服务的都是同一台机器。在此种情况下,一台虚拟机就是由一个潜在的控制程序管理的操作系统。VMM为每个客户操作系统虚拟一套独立于实际硬件的虚拟硬件环境(包括处理器、内存、I/O 设备等)。VMM采用某种调度算法在各个虚拟机之间共享CPU, 如采用时间片轮转调度算法。
    虚拟机系统与实际的计算机操作系统没有区别,也会感染病毒,但是由于虚拟机是封闭的虚拟环境,如果虚拟机不与宿主机连接,则不会受宿主机病毒的影响。

    3. 2. 2 CPU 虚拟化原理

    首先,CPU虚拟化的目的是为了允许让多个虚拟机可以同时运行在VMM中。CPU虚拟化技术是将单CPU模拟为多CPU, 让所有运行在VMM之上的虚拟机可以同时运行,并且它们相互之间都是独立的,互不影响的,以提高计算机的使用效率。在计算机体系中,CPU是计算机的核心,没有 CPU 就无法正常使用计算机,所以,CPU 能否正常被模拟成为虚拟机能否正常运行的关键。
    从CPU设计原理上来说,CPU主要包含三大部分:运算器、控制器以及处理器寄存器。每种CPU都有自己的指令集架构(Instruction Set .Architecture, ISA) , CPU 所执行的每条指令都是根据ISA提供的相应的指令标准进行的。ISA主要包含两种指令集:用户指令集(User ISA) 和系统指令集(System ISA) .用户指令集一般指普通的运算指令,系统指令集一般指系统资源的处理指令。不同的指令需要有不同的权限,指令需要在与其相对应的权限才能体现指令执行效果。在X86的体系框架中,CPU指令权限一般分为4种,ring0、1、2、3, 如图3-6所示。
    最常用的 CPU 指令权限为0与3: 权限为0的区域的指令一般只能内核可以运行,而权限为3的指令则是普通用户运行。而权限为1、2的区域一般被驱动程序所使用。想要从普通模式(权限为3) 进入权限模式(权限为0) 需要有以下三种情况之一发生:
    异步的硬件中断,如磁盘读写等。
    系统调用,如int、call等。
    异常,如 page fault等。
    从上面内容可以看出,要实现CPU 虚拟化,主要是要解决系统ISA的权限问题。普通的ISA 不需要模拟,只需保护CPU运行状态,使得每个虚拟机之间的状态分隔即可。而需要权限的ISA 则需要进行捕获与模拟。因此要实现CPU的虚拟化,就需要解决以下几个问题:
    所有对虚拟机系统 ISA 的访问都要被 VMM以软件的方式所模拟。即所有在虚拟机上所产生的指令都需要被 VMM所模拟。
    所有虚拟机的系统状态都必须通过VMM保存到内存中。
    所有的系统指令在VMM处都有相对应的函数或者模块来对其进行模拟。
    CPU 指令的捕获与模拟,是解决 CPU 权限问题的关键。如图3-7所示。
    在这里插入图片描述
    当然真实的情况没有那么简单,并不是所有的CPU 框架都支持类似的捕获,而且捕获这类权限操作所带来的性能负担可能是巨大的。并且,在指令虚拟化的同时,也需要实现CPU 在物理环境中所存在的权限等级,即虚拟化出 CPU 的执行权限等级因为没有了权限的支撑,指令所执行出
    来的效果可能就不是想要得到的效果了。
    为了提高虚拟化的效率与执行速度,VMM实现了二进制转换器BT (Binary Translator) 与翻译缓存 TC (Translation Cache) .BT负责指令的转换,TC用来储存翻译过后的指令。BT 在进行指令转换一般有以下几种转换形式。

    1. 对于普通指令,直接将普通指令拷贝到TC中。这种方式称为“识别(Ident) ”转换。
    2. 对某些需要权限的指令,通过一些指令替换的方式进行转换,这种方式称为"内联(Inline) ”转换。
    3. 对其他需要权限的指令,需要通过模拟器进行模拟,并将模拟后的结果转交给VM才能达到虚拟化的效果。这种方式称为“呼出” (Call-out) 转换。
      因为指令需要进行模拟,所以有些操作所消耗的时间比较长,在全虚拟化的情况下,它的执行效果会比较低下,因此,才出现了半虚拟化与硬件辅助虚拟化两种另外的虚拟化技术,用于提高虚拟机运行的效率。在这里插入图片描述

    3. 2. 4 网络虚拟化原理

    网络虚拟化提供了以软件的方式实现的虚拟网络设备,虚拟化平台通过这些虚拟网络设备可以实现与其他网络设备进行通信。而通信的对象可以是真实的物理网络设备,也可以是虚拟的网络设备。所以,网络虚拟化是要实现设备与设备之间的与物理连接没有关系的虚拟化连接。因此,网络虚拟化最主要解决的问题有两个,网络设备与虚拟连接。虚拟化的网络设备可以是单个网络接口,也可以是虚拟的交换机以及虚拟的路由器等。在同一个局域网内,任何两个不同的虚拟设备都可以实现网络的连接;如果不是在同一个网内,则需要借助到网络协议才能实现网络的正常连接与通信,如VLAN (Virtual Local Area Network) 、VPN (Virtual Private Network) 等协议。
    以 VLAN 为例简单说明网络虚拟化的连接与通信。VLAN 将网络结点按需划分成若干个逻辑工作组,每一个逻辑工作组就对应一个虚拟网络。每一个虚拟网络就像是一个局域网,不同的虚拟网络之间相互独立,无法连接与通信。如果需要通信,则需要路由设备的协助,转发报文才能正常通信。由于这些分组都是逻辑的,所以这些设备不受物理位置的限制,只要网络交换设备支持即可。

    3. 3 常见的虚拟化技术解决方案

    随着虚拟化技术的发展与应用,市场上出现了多种虚拟化技术解决方案。下面将对这些常见的虚拟化技术解决方案进行概述。

    3. 3. 1 OpenStack

    OpenStack (https: //www.openstack.org/) 是由NASA (美国国
    家航空航天局)和 Rackspace 合作研发并发起的、以Apache 许可证授权的自由软件和开放源代码项目,其Logo如图 所示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 asa Service, 存储即服务)服务;Swift 同样负责存储,但它主要负责数据对象、镜像、数据备份等平台所用的数据存储,同样也可以对Cinder的数据进行备份存储。
    在这里插入图片描述

    3. 3. 2 KVM

    基于内核的虚拟机(Kemel-based Virtual Machine, KVM) 是开源软件,其
    所示,其官网地址为: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"vmxlsvm"/proc/cpuinfo 来确定当前硬件平台的支持情况.在这里插入图片描述

    3.3.3Huper-V

    Huper-V 设计的目的是为了广大的用户提供更为熟悉以及成本效益更高的虚拟化基础设施软件,这样可以降低运作成本、提高硬件利用率、优化基础设施并提高服务器的可用性。Huper-V 采用微内核的架构,兼顾了安全性和性能的要求。由于 Hyper-V 底层的 Hypervisor 代码量很小,不包含任何第三方的驱动,非常精简,安全可靠、执行效率高,能充分利用硬件
    盗源,使虚拟机系统性能更接近真实系统性能。Hyper-V 采用基于 VMBUS (Virtual MachineBus) 的高速内存总线架构,所有来自虚拟机的硬件请求,不论是显卡、鼠标、键盘或者其他设备,都可以直接经虚拟化服务客户机(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.
    在这里插入图片描述

    3. 3. 4 VMware

    VMware (https: //www.vmware.com/) 旗下有很多虚拟化产品,对不同的需求有不同的产
    品系列,如 VMware ESX/ESXi、VMware Workstation、VMware Player等。

    1. VMware ESXi
      VMware ESXi前身为 VMware ESX (Elastic Sky X) , 是一款企业级虚拟化产品,其Logo
      VMware (https: //www.vmware.com/) 旗下有很多虚拟化产品,对不同的需求有不同的产品系列,如 VMware ESX/ESXi、VMware Workstation、VMware Player等。
    2. VMware ESXi
      VMware ESXi前身为 VMware ESX (Elastic Sky X) , 是一款企业级虚拟化产品,其Logo 在这里插入图片描述

    3. 3. 5 Xen

    Xen (https: //www.xenproject.org/) 是剑桥大学的开源项目,是最早的开源虚拟化引擎,在由被 Intel 支持的 Linux基金组织开发,其Logo如图所示。Xen 采用的架构是裸金属架构,它是直接运行在硬件之上,使用微内核实现。它支持在同一台设备上同时并行执行多个不同的操作系统实例。Xen支持IA-32、X86-64以及ARM平台。目前来说,Xen是市面上唯一一款裸金属架构的开源虚拟化引擎。它最常被用到的地方是服务器虚拟化、基础设施即服务(IaaS) .Xen 的特点与优势是非常显著的。在这里插入图片描述
    1)内核非常小,接口也少。因为是微内核设计,使用了非常少的内存,接口数据也少,所以它比其他的虚拟化架构更加安全,更加稳定。
    2)Xen 支持各种各样的操作系统,包括 Windows、NetBSD及OpenSolaris 等操作系统。在Xen 上面安装最多的操作系统是Linux.
    3) 取动隔离。Xen 框架允许系统中主要的设备驱动都保持在虚拟机本身内部运行。如果其中一个驱动运行异常,只需要将运行驱的虚拟机重启或虚拟机内部相应的驱动模块重启便可,这个重启不会影响到系统上正在运行的其他系统。它们都是相互独立,互不影响的。
    4) 半虚拟化。因为是Xen半虚拟化的,所以相应的 Guest OS 需要做一些修改与调整,这可以使得它的运行效率比全虚拟运行的效率高了很多。另外,它也可以运行在一些不支持虚拟化的硬件设备中。最后,Xen 也支持全虚拟化,但只支持硬件辅助的全虚拟化,即硬件需要支持Intel-VT或AMD-V等。Xen目前运行在X86架构的机器上,需要P6或更新的 CPU (如 Pentium Pro、Celeron、Pentium II, Pentium III、Pentium IV. Xeon AMD Athlon、AMD Duron) 才可以运行。Xen 支持多处理器,并且支持超线程(Simultaneous Multithreading, SMT) .Xen以高性能、占用资源少著称,赢得了IBM、AMD、HP、Red Hat 和 Novell 等众多世界级软硬件厂商的高度认可和大力支持,已被国内外众多企事业用户用来搭建高性能的虚拟化平台。

    3. 3. 6 Docker

    Docker (https: //www.docker.com/) 最初是dotCloud公司创始人Solomon Hykes 发起的一个公司内部项目。Docker是基于dotCloud公司多年云服务技术的一次革新,并于2013年3月以Apache 2. 0授权协议开源,其主要项目代码在 GitHub上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立了推动开放容器联盟。Docker的Logo 如图所示。在这里插入图片描述
    Docker是一个开源的应用容器引擎,在容器里面运行的实例都是相互独立的,属于操作系统虚拟化的一种。Docker 让开发者可以将应用以及依赖包打包到一个可移植的容器中,然后发布到任何流行的操作系统上。最重要的是,这些容器不依赖于任何语言、框架、包括系统。镜像(打包文件)是一个轻量级的、独立的可执行包,而这个包已经包含了它运行时需要的所有依赖,包括软件、库、环境与配置文件等。而容器则是一个运行时的镜像实例,即镜像加载到了内存中运行。这个镜像的运行完全是与主机环境相隔离开的,它除了访问主机的文件与端口外,与主机没有其他任何关系。简单来说,容器类似于沙箱,所有沙箱的运行相互不影响,系统的其他进程运行也不会影响到沙箱,它们相互之间不会有任何接口,相互独立。但沙箱与系统相关,而 Docker 实现的容器则与系统无关,它所打包的镜像已经包含了镜像所需要的所有依赖,所以只需要一次打包,所有Docker的环境都可使用。同样的,Docker 的使用与部署都很容易,几乎没有性能开销,Docker 可以很容易地部署到本地或数据中心。因为容器是直接运行在本地主机内核之上的,相对来说,在容器里面的运行效率比在虚拟机里面的效率更加高效,每一个容器的运行就是一个单独的进程,它们所消耗的内存也比虚拟机所消耗的内存更少。

    展开全文
  • 虚拟化技术原理与实现
  • 虚拟化技术原理(CPU、内存、IO)

    万次阅读 2019-08-27 10:10:52
    云计算现在已经非常成熟了,而虚拟化是构建云计算基础架构不可或缺的关键技术之一。 云计算的云端系统, 其实质上就是一个大型的分布式系统。 虚拟化通过在一个物理平台上虚拟出更多的虚拟平台, 而其中的每一个虚拟...

    本文来自:http://www.ywnds.com/?p=5856

    虚拟化
    云计算现在已经非常成熟了,而虚拟化是构建云计算基础架构不可或缺的关键技术之一。 云计算的云端系统, 其实质上就是一个大型的分布式系统。 虚拟化通过在一个物理平台上虚拟出更多的虚拟平台, 而其中的每一个虚拟平台则可以作为独立的终端加入云端的分布式系统。 比起直接使用物理平台, 虚拟化在资源的有效利用、 动态调配和高可靠性方面有着巨大的优势。 利用虚拟化, 企业不必抛弃现有的基础架构即可构建全新的信息基础架构,从而更加充分地利用原有的IT投资。

    虚拟化技术
    虚拟化是一个广义的术语,是指计算元件在虚拟的基础上而不是真实的基础上运行,是一个为了简化管理、优化资源的解决方案。

    在X86平台虚拟化技术中,新引入的虚拟化层通常称为虚拟机监控器(Virtual MachineMonitor, VMM), 也叫做Hypervisor。 虚拟机监控器运行的环境,也就是真实的物理平台,称之为宿主机。而虚拟出来的平台通常称为客户机,里面运行的系统对应地也称为客户机操作系统,如下图:
    在这里插入图片描述
    虚拟化技术原理(CPU、内存、IO)

    1974年,Popek和Goldberg在一篇论文中定义了“经典虚拟化(Classical virtualization)”的基本需求,他们认为,一款真正意义上的VMM至少要符合三个方面的标准:

    等价执行(Equivalient execution):除了资源的可用性及时间上的不同之外,程序在虚拟化环境中及真实环境中的执行是完全相同的。
    性能(Performance):指令集中的大部分指令要能够直接运行于CPU上。
    安全(Safety):VMM要能够完全控制系统资源。
    虚拟化技术有很多种实现方式, 比如软件虚拟化和硬件虚拟化, 再比如半虚拟化和全虚拟化。 下面将针对每种实现方式做一个简单的介绍。

    CPU虚拟化技术实现
    一、软件虚拟化和硬件虚拟化

    1)虚拟化—软件方案

    纯软件虚拟化, 顾名思义, 就是用纯软件的方法在现有的物理平台上(往往并不支持硬件虚拟化) 实现对物理平台访问的截获和模拟。常见的软件虚拟机例如QEMU,它是通过纯软件来仿真X86平台处理器的取指、解码和执行,客户机的指令并不在物理平台上直接执行。由于所有的指令都是软件模拟的,因此性能往往比较差,但是可以在同一平台上模拟不同架构平台的虚拟机。

    VMWare的软件虚拟化则使用了动态二进制翻译(BT)的技术,与QEMU这种模拟的方式不同,BT是一种加速虚拟化的方案之一,另一种常见的虚拟化加速方案就是硬件辅助虚拟化技术。BT就是在虚拟机监控机可控制的范围内,允许客户机的指令在物理平台上直接运行。但是,客户机指令在运行前会被虚拟机监控机扫描,其中突破虚拟机监控机限制的指令会被动态替换为可以在物理平台上直接运行的安全指令,或者替换为对虚拟机监控器的软件调用。这样做的好处是比纯软件模拟性能有大幅的提升(模拟其根本就是通过一个软件做出一个假的,可以是不存在的;而虚拟是把这个设备通过某种切割或其他方式虚拟出去提供一定程度的服务), 但是也同时失去了跨平台虚拟化的能力。

    有了BT技术后,Guest的用户空间运行在CPU ring 3上,而Guest的内核空间运行在了CPU ring 1上,Host的内核空间运行在CPU ring 0上。BT就监控在CPU ring 1上,随时将Guest内核的调用给转换为特权指令调用。当然CPU ring 1并没有被使用,BT这种技术让虚拟化性能得到了大大的提升。但是BT有一个大大的缺点就是无法跨平台,使用QEMU这种模拟器不管底层硬件是什么,能模拟各种CPU架构平台,如PowerPC、ARM等;但是BT却无法做到这点,BT强烈依赖底层架构,比如底层是X86的那么只能创建X86 CPU的虚拟机。

    在纯软件虚拟化解决方案中,VMM在软件套件中的位置是传统意义上操作系统所处的位置,而操作系统的位置是传统意义上应用程序所处的位置, 这种转换必然会增加系统的复杂性。软件堆栈的复杂性增加意味着,这些环境难于管理,因而会加大确保系统可靠性和安全性的困难。

    2) 虚拟化—硬件方案

    硬件辅助虚拟化(HVM),简而言之,就是物理平台本身提供了对特殊指令的截获和重定向的硬件支持,甚至,新的硬件会提供额外的资源来帮助软件实现对关键硬件资源的虚拟化,从而提升性能。可以理解为CPU额外增加了一个ring -1环专门提供给虚拟机运行的。以X86平台的虚拟化为例,支持虚拟技术的X86 CPU带有特别优化过的指令集来控制虚拟过程,通过这些指令集,VMM会很容易将客户机置于一种受限制的模式下运行,一旦客户机试图访问物理资源,硬件会暂停客户机的运行,将控制权交回给VMM处理。VMM还可以利用硬件的虚拟化增强机制,将客户机在受限模式下对一些特定资源的访问,完全由硬件重定向到VMM指定的虚拟资源,整个过程不需要暂停客户机的运行和VMM软件的参与。

    由于虚拟化硬件可提供全新的架构,支持操作系统直接在上面运行,无需进行二进制转换,减少了相关的性能开销,极大简化了VMM 设计,进而使VMM能够按通用标准进行编写, 性能更加强大。

    需要说明的是, 硬件虚拟化技术是一套解决方案。完整的情况需要CPU、主板芯片组、BIOS和软件的支持,例如VMM软件或者某些操作系统本身。即使只是CPU支持虚拟化技术,在配合VMM软件的情况下,也会比完全不支持虚拟化技术的系统有更好的性能。鉴于虚拟化的巨大需求和硬件虚拟化产品的广阔前景,Intel一直都在努力完善和加强自己的硬件虚拟化产品线。自2005年末,Intel便开始在其处理器产品线中推广应用Intel Virtualization Technology(IntelVT)虚拟化技术,发布了具有IntelVT虚拟化技术的一系列处理器产品,包括桌面的Pentium和Core系列,还有服务器的Xeon至强和Itanium安腾。Intel一直保持在每一代新的处理器架构中优化硬件虚拟化的性能和增加新的虚拟化技术。现在市面上,从桌面的Core i3/5/7,到服务器端的E3/5/7/9,几乎全部都支持Intel VT技术。可以说, 在不远的将来, Intel VT很可能会成为所有Intel处理器的标准配置。当然AMD的CPU也都支持虚拟化技术。

    总结

    硬件辅助虚拟化貌似比BT技术更好,如果BT技术能够让虚拟机性能达到物理机80%的性能的话,那么硬件辅助虚拟化(HVM)就能够让虚拟机性能达到物理机85%左右。当然这中间的转换还是需要的,只不过是由硬件直接完成了,仅此而已。

    二、全虚拟化和半虚拟化

    Full-virtualization(全虚拟化)

    全虚拟化为客户机提供了完整的虚拟X86平台, 包括处理器、 内存和外设, 支持运行任何理论上可在真实物理平台上运行的操作系统, 为虚拟机的配置提供了最大程度的灵活性。不需要对客户机操作系统做任何修改即可正常运行任何非虚拟化环境中已存在基于X86平台的操作系统和软件,这也是全虚拟化无可比拟的优势。

    在全虚拟化情况下,虚拟机并不知道自己运行在虚拟化环境下,是无感知的,安装使用时跟在物理机上没有什么区别。但是这种完全虚拟化中间需要软件做支撑的,需要软件去模拟提供所有的硬件资源,至少是这个CPU的特权指令需要用软件去模拟的,因为你要让各Guest并不知道自己运行在虚拟环境中,那么你就必须要提供一个带有特权指令的CPU。

    在虚拟化环境中,通常虚拟跟模拟是两个概念,VMWare的动态二进制翻译技术(BT)是虚拟的而QEMU软件技术是模拟的。最大的区别在于,模拟通过软件实现时需要模拟CPU ring 0-3,也就是需要转换CPU ring 0-3所有的指令,而虚拟只需要转换CPU ring 0特权指令即可。

    当然不管上面说到的BT技术还是QEMU还是硬件辅助虚拟化技术都属于完全虚拟化技术,都是需要指令转换的,都是需要复杂的步骤才能完成的,如果我们能够精简这其中的步骤那么虚拟机的性能一定会有提升的。那么怎么精简呢?这就是下面说的半虚拟化技术。另外,在全虚拟化模式下:

    CPU如果不支持硬件虚拟化技术:那么所有指令都是通过VMM虚拟的,通过VMM内的BT动态翻译技术把虚拟机要运行的特权指令转换为物理指令集,然后到CPU上运行。

    CPU如果支持硬件虚拟化技术:VMM运行ring -1,而GuestOS运行在ring 0。

    Para-virtualization(半虚拟化)

    软件虚拟化可以在缺乏硬件虚拟化支持的平台上完全通过VMM软件来实现对各个虚拟机的监控,以保证它们之间彼此独立和隔离。 但是付出的代价是软件复杂度的增加,和性能上的损失。减轻这种负担的一种方法就是,改动客户操作系统,使它知道自己运行在虚拟环境下,能够与虚拟机监控机协同工作。这种方法就叫半虚拟化(para-virtualization)。虚拟机内核明确知道自己是运行在虚拟化之上的,对于硬件资源的使用不再需要BT而是自己向VMM申请使用,如对于内存或CPU的使用是直接向VMM申请使用,直接调用而非翻译。就算对于I/O设备的使用它也可以通过Hyper Call(Hypervisor提供的系统调用)直接可以跟硬件打交道,减少了中间的翻译步骤自然性能就好了,据说这种半虚拟化方式能够让虚拟化达到物理机90%的性能。本质上,半虚拟化弱化了对虚拟机特殊指令的被动截获要求,将其转化成客户机操作系统的主动通知。但是,半虚拟化需要修改客户机操作系统的源代码来实现主动通知。

    Xen是开源准虚拟化技术的一个例子,操作系统作为虚拟服务器在Xen Hypervisor上运行之前,它必须在内核层面进行某些改变。因此,Xen适用于BSD、Linux、Solaris及其他开源操作系统,但不适合对像Windows这些专有的操作系统进行虚拟化处理,因为它们不
    公开源代码,所以无法修改其内核。

    总结

    由于硬件辅助虚拟化的出现,使得完全虚拟化在性能上也得到了提升。并且相比半虚拟化而言,完全虚拟化使用上更加简化,虚拟过程对于Guest而言是透明的。所以完全虚拟化更加符合市场需求,比如后面说的KVM虚拟机。

    内存虚拟化技术实现
    说完虚拟化技术中最重要的CPU相关技术外,下面再来说说计算机五大部件中的第二大部件存储器,内存虚拟化技术。

    首先我们知道内存本身就类似于虚拟化技术,其通过虚拟地址对外提供服务,所有的进程都以为自己可以使用所有的物理内存。如下图提供了在非虚拟化中和虚拟化中寻址方式。
    在这里插入图片描述
    虚拟化技术原理(CPU、内存、IO)

    No Virtualation

    在非虚拟化中,系统把物理地址通过虚拟地址的方式(一个个页框)提供出去给进程使用,每个进程都以为自己可以使用所有的物理内存。本来在CPU上有个称为MMU(memory management unit)的东西,任何时候当某个进行想要访问数据自己的线性地址中的某段数据的时候,就是虚拟地址。这个进程就会传给CPU一个地址,并需要读取数据,但是CPU知道这个地址是无法真正访问到数据的,于是CPU要通过MMU将这段地址转换为对应物理地址的访问,从而这段数据就能访问到了。一般进程所得到的内存地址空间是一个连续的虚拟地址空间,而在真正的物理内存存储时一般都不会是连续的地址空间。

    In Virtualation

    为了实现内存虚拟化,让客户机使用一个隔离的、从零开始且具有连续的内存空间,像KVM虚拟机引入一层新的地址空间,即客户机物理地址空间 (Guest Physical Address, GPA),这个地址空间并不是真正的物理地址空间,它只是宿主机虚拟地址空间在客户机地址空间的一个映射。对客户机来说,客户机物理地址空间都是从零开始的连续地址空间,但对于宿主机来说,客户机的物理地址空间并不一定是连续的,客户机物理地址空间有可能映射在若干个不连续的宿主机地址区间。

    从上图我们看出,在虚拟化环境中,由于虚拟机物理地址不能直接用于宿主机物理MMU进行寻址,所以需要把虚拟机物理地址转换成宿主机虚拟地址 (Host Virtual Address, HVA)。运行在硬件之上的Hypervisor首先会对物理内存进行虚拟地址 (Host Virtual Address, HVA)转换,然后还需要对转换后的虚拟地址内存空间进行再次虚拟,然后输出给上层虚拟机使用,而在虚拟机中同样又要进行GVA转换到GPA操作。显然通过这种映射方式,虚拟机的每次内存访问都需要Hypervisor介入,并由软件进行多次地址转换,其效率是非常低的。

    因此,为了提高GVA到HPA转换的效率,目前有两种实现方式来进行客户机虚拟地址到宿主机物理地址之间的直接转换。其一是基于纯软件的实现方式,也即通过影子页表(Shadow Page Table)来实现客户虚拟地址到宿主机物理地址之间的直接转换(KVM虚拟机是支持的)。其二是基于硬件辅助MMU对虚拟化的支持,来实现两者之间的转换。

    其中Shadow Page Table(影子页表),其实现非常复杂,因为每一个虚拟机都需要有一个Shadow Page Table。并且这种情况会出现一种非常恶劣的结果,那就是TLB(Translation Lookaside Buffer,传输后备缓冲器)很难命中,尤其是由多个虚拟主机时,因为TLB中缓存的是GVA到GPA的转换关系,所以每一次虚拟主机切换都需要清空TLB,不然主机之间就会发生数据读取错误(因为各主机间都是GVA到GPA)。传输后备缓冲器是一个内存管理单元用于改进虚拟地址到物理地址转换后结果的缓存,而这种问题也会导致虚拟机性能低下。

    此外,Intel的EPT(Extent Page Table) 技术和AMD的NPT(Nest Page Table) 技术都对内存虚拟化提供了硬件支持。这两种技术原理类似,都是在硬件层面上实现客户机虚拟地址到宿主机物理地址之间的转换。称为Virtualation MMU。当有了这种MMU虚拟化技术后,对于虚拟机进程来说还是同样把GVA通过内部MMU转换为GPA,并不需要改变什么,保留了完全虚拟化的好处。但是同时会自动把GVA通过Virtualation MMU技术转换为真正的物理地址(HPA)。很明显减少了由GPA到HPA的过程,提升虚拟机性能。

    并且CPU厂商还提供了TLB硬件虚拟化技术,以前的TLB只是标记GVA到GPA的对应关系,就这两个字段,现在被扩充为了三个字段,增加了一个主机字段,并且由GVA到GPA以及对应变成了GVA到HPA的对应关系。明确说明这是哪个虚拟机它的GVA到HPA的映射结果。

    总结

    由此看出内存虚拟化,如果没有硬件做支撑,那么只能使用Shadow Page Table(影子页表),也就意味着TLB需要不断地进行清空。而有了内存虚拟机技术后,虚拟机的性能在某种程度上也得到了大大地提升。

    I/O虚拟化技术实现
    从处理器的角度看,外设是通过一组I/O资源(端口I/O或者是MMIO)来进行访问的,所以设备的相关虚拟化被称为I/O虚拟化,如:

    1)外存设备:硬盘、光盘、U盘。

    2)网络设备:网卡。

    3)显示设备:VGA(显卡)。

    4)键盘鼠标:PS/2、USB。

    还有一些如串口设备、COM口等等设备统称IO设备,所谓IO虚拟化就是提供这些设备的支持,其思想就是VMM截获客户操作系统对设备的访问请求,然后通过软件的方式来模拟真实设备的效果。基于设备类型的多样化,I/O虚拟化的方式和特点纷繁复杂,我们挑一些常用IO设备说一说。

    但一般IO虚拟化的方式有以下三种,如下图:
    在这里插入图片描述
    虚拟化技术原理(CPU、内存、IO)

    第一种:模拟I/O设备

    完全使用软件来模拟,这是最简单但性能最低的方式,对于IO设备来说模拟和完全虚拟化没有太大意义上的区别。VMM给Guest OS模拟出一个IO设备以及设备驱动,Guest OS要想使用IO设备需要调内核然后通过驱动访问到VMM模拟的IO设备,然后到达VMM模拟设备区域。VMM模拟了这么多设备以及VMM之上运行了那么多主机,所以VMM也提供了一个I/O Stack(多个队列)用来调度这些IO设备请求到真正的物理IO设备之上。经过多个步骤才完成一次请求。

    举例:Qemu、VMware Workstation

    第二种:半虚拟化

    半虚拟化比模拟性能要高,其通过系统调用直接使用I/O设备,跟CPU半虚拟化差不多,虚拟化明确知道自己使用的IO设备是虚拟出来的而非模拟。VMM给Guest OS提供了特定的驱动程序,在半虚拟化IO中我们也称为“前端IO驱动”;跟模拟I/O设备工作模式不同的是,Guest OS自己本身的IO设备不需要处理IO请求了,当Guest OS有IO请求时通过自身驱动直接发给VMM进行处理,而在VMM这部分的设备处理我们称之为“后端IO驱动”。

    举例:Xen、virtio

    第三种:I/O透传技术

    I/O透传技术(I/O through)比模拟和半虚拟化性能都好,几乎进阶于硬件设备,Guest OS直接使用物理I/O设备,操作起来比较麻烦。其思想就是提供多个物理I/O设备,如硬盘提供多块,网卡提供多个,然后规划好宿主机运行Guest OS的数量,通过协调VMM来达到每个Guest OS对应一个物理设备。另外,要想使用I/O透传技术,不光提供多个I/O设备还需要主板上的I/O桥提供支持透传功能才可以,一般Intel提供的这种技术叫VT-d,是一种基于北桥芯片的硬件辅助虚拟化技术,主要功能是由来提高I/O灵活性、可靠性和性能的。

    为什么I/O透传还需要主板支持呢?每个虚拟机直接使用一个网卡不就可以了吗?主要是因为在我们传统的X86服务器架构上,所有的IO设备通常有一个共享或集中式的DMA(直接内存访问),DMA是一种加速IO设备访问的方式。由于是集中式的,所以在VMM上管理多块网卡时其实使用的还是同一个DMA,如果让第一个Guest OS直接使用了第一块网卡,第二个Guest OS直接使用第二块网卡,但使用的DMA还是同一个,而DMA是无法区分哪个Guest OS使用的是哪块网卡,这就变的麻烦了。而像Intel的VT-d就是用来处理这些问题的,以及处理各主机中断。

    举例:Intel VT-d

    对应具体设备是如何实现?

    1)硬盘如何虚拟化?

    虚拟化技术中,CPU可以按时间切割,内存可以按空间切割,那么磁盘设备呢?也可以按照空间来切割,把硬盘划分成一个一个的区域。但是好像没有这么用的,一般磁盘虚拟化的方式就是通过模拟的技术来实现。

    2)网卡如何虚拟化?

    网卡的虚拟化方式一般使用模拟、半虚拟化、IO透传技术都行,其实现方式根据VMM的不同有所不同,一般的VMM都会提供所有的方式。

    3)显卡如何虚拟化?

    显卡虚拟化通常使用的方式叫frame buffer(帧缓存机制),通过frame buffer给每个虚拟机一个独立的窗口来实现。当然其实对于显示设备的虚拟化是比较麻烦的,所以通常在虚拟化环境中我们的显示设备性能都不会很好的,当然安装个Windows显示还是没有问题的,但不适用图形处理类的服务。

    4)键盘鼠标如何虚拟化?

    我们在虚拟机中使用键盘鼠标通常都是通过模拟的方式实现的,通过焦点捕获将模拟的设备跟当前设备建立关联关系,比如你使用Vmware workstation时把鼠标点进哪个虚拟机后,相当于被此虚拟机捕获了,所有的操作都是针对此虚拟机了。

    总结

    简单描述了CPU虚拟化、内存虚拟化、IO虚拟化的实现方式。其一,我们大概知道了如何选择虚拟化主机性能会最大化,CPU支持硬件辅助虚拟化技术,如Intel的VT;内存支持硬件辅助虚拟化技术,如Virtualization mmu和TLB;IO支持硬件辅助虚拟化技术,如Intel的VT-d。当然光有硬件的支持还不是太够,在使用虚拟化时要能够充分利用到这些硬件才行。

    虚拟化的运行模式
    Type-I:直接运行在操作系统之上的虚拟化,模式如下图:
    在这里插入图片描述
    虚拟化技术原理(CPU、内存、IO)

    如:Vmware workstations、Kvm等。

    Type-II:直接运行在硬件之上的(提供各种硬件驱动),模式如下图:
    在这里插入图片描述
    虚拟化技术原理(CPU、内存、IO)

    如:Vmware EXSI、Xen等。

    但是Xen有点特别,虽然也是直接安装在硬件之上,提供Hypervisor,但是只负责CPU、内存、中断,不提供I/O驱动,需要额外安装一个虚拟机再安装一个Linux系统用来管理I/O设备,如下图:
    在这里插入图片描述
    虚拟化技术原理(CPU、内存、IO)

    Type-III:其他类型

    当然,除了上面提到的基于操作系统或直接基于硬件的虚拟化外,还有如下常见的类型。

    容器虚拟化

    基于内核的虚拟化,所有的虚拟机都是一个独立的容器,但共同运行硬件之上,使用着同一个内核。优点就是速度快,部署容易,缺点就是相互间的资源相互隔离比较麻烦,但现在市场也都有了相对成熟的解决方案。如,如今大火的Docker,网上都有人说Docker具有取代虚拟化的势头。

    模拟器虚拟化

    通过模拟器模拟所有的硬件,如QEMU,KVM就是使用QEMU。

    库虚拟化

    通过在操作系统之上模拟出不同系统的库,如Linux上运行Wine就可以支持Windows上的软件运行,Windows上运行Cywin就可以支持Linux上的软件运行。因为现在操作系统都是遵循POSIX标准,所以各自提供的库接口都是同一个标准,只需要在对应的平台上运行一个可以提供对方库的软件,然后在此软件之上运行针对对方系统编译好的软件即可。为什么要运行针对对方平台编译好的软件,因为虽然库统一了,但是各自的ABI(应用二进制接口)接口还是不同的。

    X86平台实现虚拟化技术的挑战?
    首先我们知道X86处理器有4个特权级别,Ring 0~Ring 3,只有运行在Ring 0 ~ 2级时,处理器才可以访问特权资源或执行特权指令,运行在Ring 0级时,处理器可以运行所有的特权指令。X86平台上的操作系统一般只使用Ring 0和Ring 3这两个级别,其中,操作系统内核运行在Ring 0级,也被称为内核空间指令,用户进程运行在Ring 3级,也被称为用户空间指令。

    特权级压缩(ring compression)

    为了满足上面所述的需求,VMM自身必须运行在Ring 0级,同时为了避免Guest OS控制系统资源,Guest OS不得不降低自身的运行级别而运行于Ring 3(Ring 1、2 不使用)。

    此外,VMM使用分页或段限制的方式保护物理内存的访问,但是64位模式下段限制不起作用,而分页又不区分Ring 0,1,2。为了统一和简化VMM的设计,Guest OS只能和用户进程一样运行在Ring 3。VMM必须监视Guest OS对GDT、IDT等特权资源的设置,防止Guest OS运行在Ring 0级,同时又要保护降级后的Guest OS不受Guest进程的主动攻击或无意破坏。

    特权级别名(Ring Alias)

    设计上的原因,操作系统假设自己运行于ring 0,然而虚拟化环境中的Guest OS实际上运行于Ring 1或Ring 3,由此,VMM必须保证各Guest OS不能得知其正运行于虚拟机中这一事实,以免其打破前面的“等价执行”标准。例如,x86处理器的特权级别存放在CS代码段寄存器内,Guest OS却可以使用非特权PUSH指令将CS寄存器压栈,然后POP出来检查该值;又如,Guest OS在低特权级别时读取特权寄存器GDT、LDT、IDT和TR时并不发生异常。这些行为都不同于Guest OS的正常期望。

    地址空间压缩(Address Space Compression)

    地址空间压缩是指VMM必须在Guest OS的地址空间中保留一段供自己使用,这是x86虚拟化技术面临的另一个挑战。VMM可以完全运行于自有的地址空间,也可以部分地运行于Guest OS的地址空间。前一种方式,需在VMM模式与Guest OS模式之间切换,这会带来较大的开销;此外,尽管运行于自己的地址空间,VMM仍需要在Guest OS的地址空间保留出一部分来保存控制结构,如IDT和GDT。无论是哪一种方式,VMM必须保证自己用到地址空间不会受到Guest OS的访问或修改。

    非特权敏感指令

    x86使用的敏感指令并不完全隶属于特权指令集,VMM将无法正确捕获此类指令并作出处理。例如,非特权指令SMSW在寄存器中存储的机器状态就能够被Guest OS所读取,这违反了经典虚拟化理论的要求。

    静默特权失败(Silent Privilege Failures)

    x86的某些特权指令在失败时并不返回错误,因此,其错误将无法被VMM捕获,这将导致其违反经典虚拟化信条中的“等价执行”法则。

    中断虚拟化(Interrupt Virtualization)

    虚拟化环境中,屏蔽中断及非屏蔽中断的管理都应该由VMM进行;然而,GuestOS对特权资源的每次访问都会触发处理器异常,这必然会频繁屏蔽或启用中断,如果这些请求均由VMM处理,势必会极大影响整体系统性能。

    展开全文
  • 虚拟化技术原理精要

    2014-11-25 09:32:37
    学习虚拟化需要知道了解的一些基础概念,虚拟化技术原理精要
  • 服务器虚拟化技术 原理与应用 内容提要 虛拟化技术简介 虚拟化实现技术 硬件辅助虚拟化原理 KVM/QEMU实现分析 容器虚拟化 ibvirt简介 虚拟化简介 虚拟化( Virtualization)的本质 虚拟化是资源的逻辑表示,不受物理...
  • 云计算核心服务器虚拟化技术原理和应用共55页.ppt
  • 虚拟化技术原理与实现
  • 虚拟化是云计算的基础。简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 CPU、内存、IO硬件资源,但逻辑上虚拟机之间是相互隔离的。 物理机我们一般称为宿主机(Host),宿主机上面...
  • KVM虚拟化技术 实战与原理解析.pdf;KVM虚拟化技术 实战与原理解析.pdf
  • KVM虚拟化技术实战与原理解析 全书一共9章:第1章介绍了云计算和虚拟化的概念,并对KVM等几种流行的虚拟化技术做了比较;第2章介绍了KVM的基本架构、QEMU的作用以及Intel的硬件虚拟化技术;第3章详细讲解了KVM依赖的...
  • 资源共享----《KVM虚拟化技术:实战与原理解析》 资源共享----《KVM虚拟化技术:实战与原理解析》 资源共享----《KVM虚拟化技术:实战与原理解析》 资源共享----《KVM虚拟化技术:实战与原理解析》 资源共享----...
  • 介绍了以软件完全虚拟化、硬件辅助虚拟化及类虚拟化为核心的各种系统虚拟化技术
  • 虚拟化技术基础原理详解

    千次阅读 2018-01-18 11:59:58
    对于主机虚拟化技术来讲,其主要负责虚拟硬件平台及BIOS,而操作系统、运行时库及各种应用程序可以使用以往在物理平台上各种现有技术及产品。 内存虚拟化 Intel 和 AMD 分别通过 EPT(ExtendedPage Tables) 和 NPT...
    Disk:
    
        IO Scheduler(IO调度器):
            CFQ
            deadline
            anticipatory
            NOOP

            /sys/block/<device>/queue/scheduler

    linux调度器:https://www.cnblogs.com/cobbliu/p/5389556.html

    Memory:

      MMU

      TLB

    MMU和TLB:https://www.cnblogs.com/findumars/p/4068418.html

    vm.swappiness={0..100}:使用交换分区的倾向性, 60
        overcommit_memory=2: 过量使用
        overcommit_ratio=50:
            swap+RAM*ratio
                swap: 2G
                RAM: 8G
                    memory=2G+4G=6G
    http://blog.csdn.net/u010616985/article/details/44943361
        充分使用物理内存:
            1、swap跟RAM一样大;swappiness=0;
            2、    overcommit_memory=2, overcommit_ratio=100:swappiness=0;
                memory: swap+ram


    IPC(进程间通信):
        message(消息)
            msgmni
            msgmax
            msgmnb
        shm(共享内存)
            shmall
            shmmax
            shmmni

    内存监控命令:sar, dstat, vmstat, mpstat, iostat, top, free, iotop, uptime, cat /proc/meminfo, ss, netstat, lsof, time, perf, strace
    评估io工作情况:blktrace, blkparse, btt
    文件系统压力测试:dd, iozone, io-stress, fio

    cpu:全量CPU时间片

    内存:连续、全部内存空间(0x0000,最大)

    I/O:全部可用IO

    虚拟化:将一个物理硬件虚拟化为多个虚拟硬件平台


    1974年,Popek和Goldberg在一篇论文中定义了“经典虚拟化(Classical virtualization)”的基本需求,他们认为,一款真正意义上的VMM至少要符合三个方面的标准:
    ◇ 等价执行(Equivalient execution):除了资源的可用性及时间上的不同之外,程序在虚拟化环境中及真实环境中的执行是完全相同的;
    ◇ 性能(Performance):指令集中的大部分指令要能够直接运行于CPU上;
    ◇ 安全(Safety):VMM要能够完全控制系统资源;

    1.1 x86平台实现虚拟化技术的挑战
    x86处理器有4个特权级别,Ring 0 ~ Ring 3,只有运行在Ring 0 ~ 2 级时,处理器才可以访问特权资源或执行特权指令;运行在 Ring 0级时,处理器可以运行所有的特权指令。x86平台上的操作系统一般只使用Ring 0和Ring 3这两个级别,其中,操作系统运行在Ring 0级,用户进程运行在 Ring 3 级。
    1.1.1 特权级压缩(ring compression)
    为了满足上面所述的需求,VMM自身必须运行在Ring 0级,同时为了避免GuestOS控制系统资源,GuestOS不得不降低自身的运行级别而运行于Ring 3(Ring 1、2 不使用)。

    此外,VMM使用分页或段限制的方式保护物理内存的访问,但是64位模式下段限制不起作用,而分页又不区分Ring 0,1,2。为了统一和简化VMM的设计,GuestOS只能和用户进程一样运行在 Ring 3。VMM必须监视GuestOS对GDT、IDT等特权资源的设置,防止GuestOS运行在Ring 0级,同时又要保护降级后的GuestOS不受Guest进程的主动攻击或无意破坏。

    1.1.2 特权级别名(Ring Alias)
    设计上的原因,操作系统假设自己运行于ring 0,然而虚拟化环境中的GuestOS实际上运行于Ring 1或Ring 3,由此,VMM必须保证各GuestOS不能得知其正运行于虚拟机中这一事实,以免其打破前面的“等价执行”标准。例如,x86处理器的特权级别存放在CS代码段寄存器内,GuestOS却可以使用非特权PUSH指令将CS寄存器压栈,然后POP出来检查该值;又如,GuestOS在低特权级别时读取特权寄存器GDT、LDT、IDT和TR时并不发生异常。这些行为都不同于GuestOS的正常期望。

    1.1.3 地址空间压缩(Address Space Compression)
    地址空间压缩是指VMM必须在GuestOS的地址空间中保留一段供自己使用,这是x86虚拟化技术面临的另一个挑战。VMM可以完全运行于自有的地址空间,也可以部分地运行于GuestOS的地址空间。前一种方式,需在VMM模式与GuestOS模式之间切换,这会带来较大的开销;此外,尽管运行于自己的地址空间,VMM仍需要在GuestOS的地址空间保留出一部分来保存控制结构,如IDT和GDT。无论是哪一种方式,VMM必须保证自己用到地址空间不会受到GuestOS的访问或修改。

    1.1.4 非特权敏感指令
    x86使用的敏感指令并不完全隶属于特权指令集,VMM将无法正确捕获此类指令并作出处理。例如,非特权指令SMSW在寄存器中存储的机器状态就能够被GuestOS所读取,这违反了经典虚拟化理论的要求。

    1.1.5 静默特权失败(Silent Privilege Failures)
    x86的某些特权指令在失败时并不返回错误,因此,其错误将无法被VMM捕获,这将导致其违反经典虚拟化信条中的“等价执行”法则。

    1.1.6 中断虚拟化(Interrupt Virtualization)
    虚拟化环境中,屏蔽中断及非屏蔽中断的管理都应该由VMM进行;然而,GuestOS对特权资源的每次访问都会触发处理器异常,这必然会频繁屏蔽或启用中断,如果这些请求均由VMM处理,势必会极大影响整体系统性能。

    1.2  X86平台虚拟化
    完整意义上的计算机由硬件平台和软件平台共同组成。根据计算机体系结构理论,其硬件平台包括CPU、内存和各种I/O设备;而软件平台则包括BIOS、操作系统、运行时库及各种应用程序等。对于主机虚拟化技术来讲,其主要负责虚拟硬件平台及BIOS,而操作系统、运行时库及各种应用程序可以使用以往在物理平台上各种现有技术及产品。

    内存虚拟化


    Intel AMD 分别通过 EPT(ExtendedPage Tables) NPT(NestedPage Tables) 为虚拟化应用提升影子 MMU 的性能,并通过标记 (tagged)TLB 来避免虚拟机切换时频繁清写 (flush)TLB 以提高 TLB 缓存的命中率。
    Full-Virtualization: 完全虚拟化
        CPU不支持硬件虚拟化技术:模拟特权指令: 模拟
        CPU支持硬件虚拟化技术:VMM运行ring -1,而GuestOS运行在ring 0; HVM (Hardware-asistant VM)

    para-virtualization: 半虚拟化, pv
        cpu, io, memory

    io虚拟化


    cpu虚拟化:

    基于“二进制翻译 (BinaryTranslation)” 技术的完全虚拟化
    操作系统辅助的虚拟化,也即半虚拟化 ( paravirtualization ) 或准虚拟化
    硬件辅助的虚拟化
    Binary Translation (BT)


    虚拟化模型:




    KVM: Virtulization
        KVM:virtio(pv IO)









    展开全文
  • 云计算之服务器虚拟化技术

    千次阅读 2019-06-17 21:32:28
    服务器虚拟化技术 1.历史发展 萌芽期–上世纪60年代 1959年6月,Christopher Strachey在国际信息处理大会上发表了一篇名为《大型高速计算机的 时间共享》的学术报告,第一次提 出了“虚拟化”的概念 1965年8月...

    服务器虚拟化技术

    1.历史发展

    萌芽期–上世纪60年代

    1959年6月,Christopher Strachey在国际信息处理大会上发表了一篇名为《大型高速计算机的 时间共享》的学术报告,第一次提出了“虚拟化”的概念
    1965年8月,IBM推出System/360 Model 67和TSS分时共享系统,允 许多个远程用户共享同一高性能计算设备的使用时间,这是最原始的虚拟机技术

    发展期–上世纪70~90年代

    1972年,IBM发布了用于创建灵活大型主机的虚拟机技术,IBM 360/40、IBM 360/67等大型机通过 VMM(Virtual Machine Monitor, 虚拟机监控器)的技术,在物理硬件之上生成很多可以运行操作系统的独立虚拟机

    造价昂贵的大型机服务在虚拟化技术的帮助下,用户可以对硬件进行逻辑分区,实现“多任务处理”,以充分利用大型机的昂贵资源

    爆发期–现在

    在大型机和UNIX平台的虚拟化技术不断发展的同时,x86平台却由于 架构和性能上的缺陷,而与虚拟化绝缘
    随着x86架构的普及,人们开始考虑把虚拟化技术引入应用更广泛的 x86平台Intel、AMD修改了x86处理器的指令集,再加上多核处理器 的出现,使得虚拟化技术在x86平台快速发展起来
    1999年,VMware针对x86平X台推出了 第 一 款商业虚拟化软件 VMware Workstation,从此,虚拟化技术终于走下了大型机的神坛, 开启了虚拟化技术的x86时代

    X86 架构最初不适合与虚拟化

    x86架构存在17条敏感的非特权指令,这些指令在虚拟化环境中执行时可能会导致系统异常

    1.什么叫敏感指令?

    以x86架构为例,x86架构最开始一共有4个特级层次。从0~3,越小特权越大。操作系统运行在Ring0上,Ring1和Ring2支持驱动设备,应用程序运行在Ring3上。其中一些关键操作指令只能由Ring0完成。称为特权指令。在VMM模型中,客户机操作系统运行在非特权模式下,即非Ring0模式下。所以一部分原来需要由Ring0处理的指令需要由VMM捕获然后处理。这些指令称为敏感指令。即所有敏感指令都是特权指令。
    在这里插入图片描述

    2.为什么x86架构最开始不能支持系统虚拟化?

    经过上面的铺垫,我们来说下关键问题。
    x86架构有个缺陷。x86架构有一部分敏感指令并不是特权指令,变成了非特权指令。这就出现问题了。非特权指令在Ring1~Ring3上是可以执行。VMM不会处理这些指令。这就导致了问题。系统本想让VMM执行的指令却被非特权级别执行了。一个不受虚拟软件控制的指令执行在虚拟层。就好象一个学医学的和你坐在一起敲代码,你是什么感受呢?这就是问题所在了。

    但是后来inter和AMD都加强了自己的很多技术,比如inter的VT(Virtualization Technology)和AMD的SVM(Secure Virtual Machine)技术,弥补了x86架构的不足。

    3.解决办法

    办法一

    解决方法1:BT(Binary Translation,二进制翻译)
    在这里插入图片描述

    BT和直接执行技术的结合实现了全虚拟化,此时客户操作系统可以通过虚拟化层从物理硬件上完全抽取出来,客户操作系统感知不到是否发生了虚拟化,完全不需要进行修改。

    全虚拟化是迄今为止唯一不需要硬件或操作系统协助来进行敏感和特权指令虚拟化的技术,
    Hypervisor(管理程序)可以翻译所有的操作系统特权指令,并保存在缓存里备用,而用户级的指令完全可以全速直接执行。
    全虚拟化提供了最好的虚拟机隔离和安全性,简化了客户操作系统迁移和移植能力。
    VMware ESX Server就是通过全虚拟化技术来实现的最好案例。

    工作原理

    1.Guest OS指令段在执行前进行整段翻译,将其中的敏感非特权指令替换为Ring0中
    2.执行对应特权指令
    3.非特权指令直接执行
    4.特权指令首先被陷入到VMM,VMM通过一系列的模拟操作来实现此特权指令,然后返回给Guest OS,Guest OS从上次被中断的地方继续执行

    优缺点

    优点:
    Guest OS无需修改,Guest OS感知不到是否发生了虚拟化优点
    缺点:
    当负载较大、敏感指令频繁被执行时性能低下 
    
    办法二

    解决方法2:半虚拟化(Para—Virtualization)

    在这里插入图片描述
    如图所示,半虚拟化需要修改操作系统内核,替换掉不
    能虚拟化的指令,通过超级调用(hypercall)直接和底层的虚拟化层hypervisor来通讯,hypervisor同时也提供了超级调用接口来满足其他关键内核操作,比如内存管理、中断和时间保持。

    工作原理

    1.在Hypervisor上运行的Guest OS已经集成了与半虚拟化有关的代码,使得Guest OS能够非常好地配合Hypervisor来实现虚拟化
    2.Hypervisor提供Hypercall接口来满足Guest OS的关键内核操作,如内存管理、中断和时间同步等

    优缺点

    优点:
    性能非常接近物理机
    缺点:
    不支持未修改的操作系统,兼容性和可移植性差

    详细介绍

    半虚拟化和全虚拟化不同,全虚拟化不需要修改上面的操作系统,敏感的操作系统指令直接通过BT进行处理。半虚拟化的价值在于降低了虚拟化的损耗,但是半虚拟化的性能优势很大程度上依赖于运行的负载。
    由于半虚拟化不支持未修改的操作系统(例如: Windows
    2000/XP),它的兼容性和可移植性差。在实际的生产环境中,半虚拟化也会导致操作系统支持和维护的艰难,因为半虚拟化往往要深入修改操作系统内核。
    开源的Xen项目是半虚拟化的代表,它可以通过修改Linux的内核来实现CPU和内存的虚拟化,通过定制的操作系统驱动来实现I/O的虚拟化。
    为了实现全虚拟化,需要构建复杂的BT技术,这往往比直接修改客户操作系统来启用半虚拟化更艰难。VMware实际上已经在产品中使用了半虚拟化的一些技术,来构建VMware Tools和优化虚拟设备驱动。
    VMware tools服务为VMM Hypervisor提供了 一个后门服务,用来同步时间、记录日志和客户操作系统关机等。Vmxnet是半虚拟化的I/O设备驱动程序,它可以和hypervisor共享数据结构。这些半虚拟化技术的应用改善了设备的兼容能力,提高了数据吞吐速率,降低了CPU利用率。
    需要重点澄清的是:VMware tools 服务和vmxnet设备驱动并不是CPU半虚拟化解决方案,它们紧紧对客户操作系统进行了微小的、非关键的修改,并不需要修改客户操作系统内核。

    办法三

    硬件辅助虚拟化解决非特权敏感指令无法陷入问题的解决思路:引入VMX模式(Virtual Machine eXtension)

    VMX模式
    在这里插入图片描述

    在这里插入图片描述

    如图所示,特权和敏感指令自动在hypervisor上执行,从而无需BT或半虚拟化技术。客户操作系统的状态保存在VT-xVirtual Machine Control Structure,虚拟机控制结构)中或AMD-v(Virtual Machine Control Block,虚拟机控制块)。支持Intel VT和AMD-V的CPU从2006年开始推向市场,因此只有新的系统包含了这些硬件辅助的虚拟化功能。

    在这里插入图片描述
    图为硬件辅助的x86架构虚拟化

    由于hypervisor到客户操作系统转换的损耗和严格的编程模式要求,第一代的硬件辅助虚拟化性能并不理想,VMware的BT技术很多时候性能更好。
    第一代硬件辅助虚拟化为编程留了很小的空间,降低了软件的灵活性,增加了hypervisor到客户操作系统转换的损耗,正式基于此,VMware仅仅在很少的情况下利用了第一代的硬件辅助虚拟化,比如,在Intel平台上支持64位操作系统的时候,VMware使用了Intel的VT-x。

    在这里插入图片描述

    主流的Hypervisor产品

    在这里插入图片描述

    展开全文
  • 虚拟化技术原理

    2016-03-10 17:09:06
    详细介绍了虚拟化和I/O虚拟化
  • Vmware虚拟化概念原理

    万次阅读 多人点赞 2018-05-18 23:08:26
    虚拟化是一种资源管理技术, 是将计算机的各种物理资源, 如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破物理设备结构间的不可切割的障碍,使用户可以比原本的架构更好的方式来应用这些资源。...
  • 计算系统虚拟化——原理技术计算系统虚拟化——原理技术
  • Vmware虚拟化概念原理介绍

    千次阅读 2017-03-27 21:12:15
    01 服务器虚拟化介绍 02 VMware组件介绍 03 ESXi介绍 04 vCenter Server介绍 05 VMware虚拟机及虚拟机管理介绍 06 Vmware vMotion及Storage vMotion 07 Vmware 可用性及可扩展性...
  • 《KVM虚拟化技术+实战与原理解析》.(任永杰,单海涛)《KVM虚拟化技术+实战与原理解析》.(任永杰,单海涛)《KVM虚拟化技术+实战与原理解析》.(任永杰,单海涛)《KVM虚拟化技术+实战与原理解析》.(任永杰,单海涛)
  • 有完整详尽的一二级书签;讲述KVM虚拟化技术就优秀的书; 之前的版本传错了,这个才有详尽的一二级目录,降1分以示歉意。
  • 《KVM虚拟化技术:实战与原理解析》不仅系统介绍了KVM虚拟机的功能、特性和使用方法,而且还深入地剖析了KVM虚拟机的核心技术和工作原理,对KVM做了全面而透彻的讲解。
  • KVM虚拟化架构和实现原理

    千次阅读 2018-12-16 09:35:52
    版权声明:转载请注明出处 JmilkFan_范桂飓:http://blog.csdn.net/jmilk https://blog.csdn.net/Jmilk/article/details/51853511 ...KVM虚拟化架构 devkvm QEM...
  • QNX虚拟化技术文档

    2019-04-19 14:16:00
    QNX虚拟化技术文档:详细描述了QNX平台上虚拟化基本概念及描述,可以帮助深入理解车机系统底层研发。
  • KVM 全称是 基于内核的虚拟机(Kernel-based Virtual Machine),它是一个 Linux 的一个内核模块,该内核模块使得 Linux 变成了一个 Hypervisor
  • 主要介绍citrix思杰虚拟化访问控制系统的技术原理、部署架构以及相关细节,同时介绍了日常citrix系统的运维保障工作。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 129,588
精华内容 51,835
关键字:

虚拟化技术原理