计算虚拟化概念

虚拟化是什么?

云计算是一种模式,虚拟化是一种技术,使用虚拟化,可以在一台物理服务器上模拟出多个独立的服务器

虚拟化的本质就是将原先的物理设备进行逻辑化,转化成一个文件夹或文件,实现软硬件的解耦。

计算虚拟化发展史

1961 年,IBM 的 709 机就已经实现了分时系统;

1964 年,“蓝色巨人”IBM 开始尝试在大型机上实现虚拟化;

1972 年,IBM 正式将 system370 机的分时系统命名为虚拟机;

1990 年,IBM 推出的 system390 机支持逻辑分区,将一个 CPU 分为若干份 (最多 10份) , 而且每份 CPU 都是独立的,也就是一个物理 CPU 可以逻辑的分为 10 个 CPU;

1999 年,VMware 推出了最早的能在 x86 架构上运行的虚拟化产品;

2002 年,Xen 正式被开源;

2004 年,Intel的工程师开始为 Xen 添加硬件虚拟化的支持;

2005 年,发布的 Xen 3.0,开始正式支持 Intel 的 VT 技术和 IA64 架构;

2006 年 10 月,在先后完成了基本功能、动态迁移以及主要的功能和性能的优化之后, Qumranet 正式对外宣布了 KVM 的诞生;

2006 年 10 月,KVM 模块的源代码被正式接纳进入 Linux Kernel,成为内核源代码的一部分;

2007 年,HP 推出了 Integrity 虚拟机;

2008 年,微软在 Windows Server 2008 R2 中加入了 Hyper-v;

2008 年,RedHat 收购 Qumranet,成为 KVM 开源项目新东家;

2008 年,经过了多年的发展,Linux 推出了 LXC,也就是 Linux Containers,它是第一套完整的 Linux 容器管理实现方案;

2010 年 11 月,Redhat 公司推出了新的企业版 Linux——RHEL 6,集成了最新的 KVM 虚拟机,去掉了在RHEL 5.x 系列中集成的 Xen;

2013 年, Docker 容器项目推出;

2014 年,Rocket 推出,它最初由 CoreOS 开发而成,专门用于解决部分 Docker 当中存在的缺陷。

名词解释

  • 宿主机(Host Machine):运行虚拟机的物理主机
  • 宿主机操作系统(Host OS):宿主机安装的操作系统
  • 客户机(Guest Machine):宿主机之上的虚拟机
  • 客户机操作系统(Guest OS):虚拟机安装的操作系统
  • 虚拟化软件层(Hypervisor):宿主机和虚拟机之间的虚拟机化技术的核心
  • 虚拟机监控机(VMM(Virtual Machine Manager))

Hypervisor 主要实现两个基本功能:首先是识别、捕获和响应虚拟机所发出的 CPU 特权指令或保护指令(特权指令和保护指令在 CPU 虚拟化中介绍) ;其次,它负责处理虚拟机队列和调度,并将物理硬件的处理结果返回给相应的虚拟机。也就是说, Hypervisor 将负责管理所有的资源和虚拟环境。 VMM 可以看作一个为虚拟化而生的完整操作系统,掌控有所有资源(CPU、内存和 I/O 设备)。 VMM 承担管理资源的重任,其还需向上提供虚拟机 VM 用于运行 Guest OS,因此 VMM 还负责虚拟环境的创建和管理。

虚拟化分类

根据 Hypervisor 类型

I 型虚拟化

定义:裸金属虚拟化,Hypervisor 直接调用硬件资源,不需要底层的 Host OS ,可以将 Hypervisor 看做一个定制的 Host OS ,除了作为VMM以外,不能在其上安装其他应用

产品:Vmware ESX Server/Citrix XenServer/FusionCompute

特点:虚拟机不依赖于操作系统、支持多种操作系统,多种应用,但虚拟化层内核开发难度大

II 型虚拟化

定义:宿主型虚拟化,物理资源由 Host OS 管理,实际的虚拟化功能由VMM提供,而VMM作为底层操作系统上的一个普通应用程序,然后通过其再创建相应的虚拟机,共享底层服务器资源

产品:Vmwate Workstation/Virtual PC

特点:简单、易于实现,安装和运行应用程序依赖于主机操作系统对设备的支持。管理开销较大,性能损耗大

虚拟化本质特性

分区

虚拟化层具有为多个虚拟机划分资源的能力;每个虚拟机可以同时运行一个单独的操作系统

解决问题:可以为每个分区划分资源配额,防止虚拟化资源超额使用资源,每个虚拟机单独安装操作系统,彼此互不影响

隔离

通过分区所建立的多个虚拟机之间采用逻辑隔离措施,防止相互影响

解决问题:一台虚拟机的故障和崩溃不会影响到同一服务器上的其他虚拟机,一个虚拟机中的病毒等与其他虚拟机相互隔离,每个虚拟机就像运行于单独的物理机器之上

封装

意味着整个虚拟机(硬件配置、BIOS配置、内存状态、磁盘状体、CPU状态)存储在独立于硬件的文件中,只需要复制虚拟机的文件就可以达到虚拟机的复制,这也是虚拟化本质特性中最重要的特性

相对硬件独立

虚拟机封装为独立的文件后,虚拟机迁移只需要把设备文件和配置文件或磁盘文件复制到另一台主机上运行即可,而不用关心底层的硬件类型是否兼容,底层的硬件的差异性被VMM层所屏蔽,运行在VMM之上的虚拟机只需要关心目的主机是否也存在相同的VMM。

计算虚拟化

分类

CPU虚拟化、内存虚拟化、I/O 虚拟化

CPU虚拟化

分级保护域

Ring 0:权限最高,具有直接操作硬件的权限,一般只有操作系统和驱动会允许拥有此权限
Ring 3:权限最低,所有程序都可以拥有此权限
为了保护计算机,一些危险的指令只能由操作系统执行,防止恶意软件随意地调用硬件资源

普通主机上的操作系统所发出来的指令分为特权指令普通指令

  • 特权指令:是指用于操作和管理关键系统资源的指令,这些指令只有在最高特权级上才能够运行,即必须在Ring 0 级别上才能运行的指令
  • 普通指令:与特权指令相对的就是普通指令,这些指令在CPU普通权限级别上就能够运行,即在Ring 3级别上就可以运行的指令
  • 敏感指令:虚拟化环境下,修改虚拟机的运行模式或宿主机状态的指令
大型机时代CPU共享问题?

大型机的CPU虚拟化方式:特权解除和陷入模拟(经典虚拟化方式),基本原理:将 Guest OS 运行在非特权级别(特权解除),而将VMM运行于最高特权级(完全控制系统资源)
导致的问题——Guest OS 需要执行特权指令怎么执行?

  • 特权解除:解除 Guest OS 的特权
  • 陷入模拟:Guest OS 的大部分指令仍然直接在硬件上运行,当需要执行特权指令的时候,陷入到VMM模拟执行,由VMM代替虚拟机向真正的硬件CPU发出特权操作指令。

定时器中断机制:VM发出特权指令到VMM,此时触发中断,VMM对VM发出的特权指令陷入到VMM中进行模拟,再转换成CPU的特权指令,VMM根据调度机制调度到硬件CPU上执行,并返回结果给VM。

为什么要中断机制?

CPU 在程序运行中系统外部、系统内部或者现行程序本身若出现紧急事件, CPU 立即中止现行程序的运行, 自动转入相应的处理程序(中断服务程序), 待处理完后,再返回原来的程序运行,这整个过程称为程序中断。中断机制是现代计算机系统中的基本机制之一,它在系统中起着通信网络的作用,以协调系统对各种外部事件的响应和处理,中断是实现多道程序设计的必要条件,中断是CPU 对系统发生的某个事件作出的一种反应。
随着 x86 主机性能的提升,虚拟化技术在 x86 架构上怎么实现呢?

x86 架构CPU和大型机CPU的不同

大型机:PowerPC 架构,即精简指令集 RISC 计算机架构。虚拟机特有的敏感指令完全包含在特权指令中,特权指令和敏感指令都可以被正常陷入-模拟并执行

x86架构:复杂指令集 CISC 计算机架构,CISC架构的CPU指令集的特权指令和敏感指令并不完全重合,x86 架构的CISC指令集有19条敏感指令不属于特权指令的范畴,这些指令在Ring 1 用户态上,因此这些敏感指令不能陷入-模拟被VMM捕获,所以也就不适用“特权解除”“陷入-模拟”经典的虚拟化技术方法实现x86 架构的虚拟化。

X86 架构虚拟化需要解决的问题?

19条超出特权指令的敏感指令,如何被识别出,并被 VMM 陷入-模拟。

全虚拟化

定义:将VM发出的所有指令转发到VMM,由VMM进行二进制翻译,如果发现是特权指令或者是敏感指令,则陷入到VMM模拟,然后调度到CPU特权级别上执行,如果是应用程序发出的普通指令就直接在CPU的非特权级别上执行。这种方法需要过滤VM发出的所有请求指令,所以被称之为全虚拟化。

提出:Vmware

运行时虚拟机监视器 VMM 对虚拟机操作系统 Guest OS 二进制代码进行翻译,不修改虚拟机操作系统,虚拟机的可移植性和兼容性较强,但二进制翻译会带来虚拟机监视器(VMM)性能的开销。

优点:不修改VM操作系统,VM兼容性和可移植性较强,支持广泛地操作系统
缺点:需要VMM进行二进制翻译,性能损耗较大,VMM的开发难度也较大

由于导致虚拟化漏洞的原因是19条敏感指令,所以可以修改Guest OS 来规避漏洞

半虚拟化

定义:修改Guest OS,让Guest OS能够知道自己是被虚拟化的,Guest OS通过“超级调用”(Hypercall)用 Hypervisor 层来替换虚拟化中的敏感指令,从而实现虚拟化,而其他应用程序等非敏感或特权请求直接在CPU非特权级别上执行。

优点:半虚拟化中的 Guest OS 可以同时能支持多个不同的操作系统虚拟化,提供了与原始系统相近的性能。
缺点:半虚拟化中的 Guest OS 只能针对开源的系统才能支持被修改,如Linux,而对于未开源的Windows系统,则无法是实现半虚拟化。而且被修改后的Guest OS 可移植性较差。

虚拟化漏洞问题的解决,无论全虚拟还是半虚拟,都默认一个前提,即物理硬件是不具备虚拟化识别功能的,因此必须识别出这 19 条敏感指令,并通过虚拟化监视器 VMM 进行陷入-模拟。

硬件辅助虚拟化

物理硬件支持CPU虚拟化功能,并且可以识别敏感指令,Intel 的VT-x 技术,AMD的AMD-V技术。

为CPU增加新的执行模式 root 模式,可以让VMM运行在 root 模式下,root 模式位于CPU指令几倍 Ring 0 下面,特权指令和敏感指令自动在Hypervisor 上执行,从而无需全虚拟化或半虚拟化。

通过硬件辅助虚拟化解决虚拟化漏洞,简化VMM软件,消除了半虚拟化和二进制翻译的问题

内存虚拟化

如何为物理机上的多台虚拟机分配内存资源(内存地址空间的分配)?

物理主机使用内存空间

内存地址都是从物理地址0开始

内存地址空间都是连续分配

内存虚拟化

把物理机的真实物理内存统一管理,包装成多份虚拟的内存给若干虚拟机使用,通过引入一层新的地址空间——客户机物理地址空间,让客户机认为自己运行在真实的物理地址空间中,实际上它是通过VMM访问真实的物理地址。

三种内存地址

  • 虚拟机内存地址(Virtual Memory Address,VA)
  • 物理内存地址(Physical Memory Address,PA)
  • 机器内存地址(Machine Memory Address,MA)

由 Guest OS 控制 VA → PA 的映射,Hypervisor 负责 PA → MA 的映射

I/O 虚拟化

I/O(Input/Output),即输入/输入,通常指数据在存储器(内部和外部)或其他周边设备之间的输入和输出,是信息处理系统(计算机)与外部世界之间(人或另一个信息系统)的通信,输入是系统接收信号或数据,输出则是从其发送的信号或数据。

为了满足多台虚拟机共同使用 I/O 设备的需求,就需要VMM参与,VMM用于截获虚拟机对 I/O 设备的访问请求,再通过软件去模拟真实的 I/O 设备,进而响应 I/O 请求。

全虚拟化

原理:通过VMM为VM模拟出一个与真实设备相似的虚拟I/O设备,当VM对I/O设备发起请求时,VMM截获VM下发的I/O访问请求,再由VMM将真实的访问请求发送到物理设备进行处理。

优点:虚拟机无论使用任何类型的操作系统,操作系统都不需要为I/O虚拟化做任何修改,就可以让多个虚拟机直接使用物理服务器的I/O设备。
缺点:VMM需要实时截获每个虚拟机下发的I/O请求,截获请求后模拟到真实的I/O设备中。实时监控和模拟的操作都是通过CPU运行软件程序来实现的,因此会对服务器带来较为严重的性能消耗。

半虚拟化

原理:建立一个特权级别的虚拟机,即特权虚拟机。半虚拟化要求各个虚拟机运行前端驱动程序,当需要访问I/O设备时,虚拟机通过前端程序把I/O请求发送给特权虚拟机,有特权虚拟机的后端驱动收集每个虚拟机所发出的I/O请求,再由后端驱动对多个I/O请求进行分时分通道处理,特权虚拟机运行真实的物理I/O设备驱动,将I/O请求发送给物理I/O设备,I/O设备处理完成后再讲结果返回给虚拟机。

优点:主动让虚拟机把I/O请求发送给特权虚拟机,再由特权虚拟机访问真实的I/O设备,这就减少了VMM的性能损耗。
缺点:需要修改虚拟机操作系统,改变操作系统对自身I/O请求的处理方式,将I/O请求全部发给特权虚拟机处理,这就要求虚拟机操作系统是属于可以被修改的类型(Linux系统等)。

硬件辅助虚拟化

直接将I/O设备驱动安装在虚拟机操作系统中,不需要对操作系统做任何改动即可使用,需要特殊的硬件才能支持。

主流的计算虚拟化

开源

KVM:全虚拟化,是Linux内核中的一个模块,用来实现CPU和内存的虚拟化,是Linux的一个进程,而其他的I/O设备需要QEMU来实现。

Xen:同时支持全虚拟化和半虚拟化,直接运行在硬件之上,然后在其之上运行虚拟机,在Xen

闭源

Hyper-v:微软

VMware vSphere:VMware公司

FusionCompute :华为

KVM简介

定义:KVM(Kernel-based Virtual Machine,基于内核的虚拟机),KVM是Linux的一个内核模块。

一台安装有Linux操作系统的物理机安装KVM模块后就变成了Hypervisor,且不影响其上的其他进程,其上运行的虚拟机也是进程,同时增加三种运行模式:

  • Guest Mode:此模式主要是指虚拟机,包括虚拟机的CPU、内存、磁盘等虚拟机设备,次模式被置于一种受限的CPU模式下运行
  • User Mode:用户空间,此模式运行的主要是QEMU,它用来为虚拟机模拟执行I/O类操作请求
  • Kernel Mode:内核空间,此模式下可以真正的操作硬件,当Guest OS执行I/O类操作或特权指令操作时需要向用户模式提交请求,然后由用户模式再次发起硬件操作请求给内核模式从而真正操作硬件

KVM体系

KVM内核模块、QEMU、管理工具

KVM内核模块

KVM虚拟机的核心部分,主要功能是初始化CPU硬件,打开虚拟化模式,然后将Guest Machine运行在虚拟机模式下,并对虚拟客户机的运行提供一定的技术支持

kvm.ko:在KVM模块中实现虚拟化功能,只提供CPU和内存的虚拟化

kvm-intel.ko 或 kvm-amd.ko:和处理器强相关,KVM只提供一个 /dev/kvm 接口,被宿主机用来负责vCPU创建、虚拟机内存地址空间分配、vCPU寄存器的读写以及vCPU的运行

QEMU

一个通用的开源的使用纯软件来实现的虚拟化模拟器,让Guest OS 认为自己在和硬件进行交互,实际真正交互的是QEMU,然后通过QEMU去和硬件交互。

QEMU-KVM:KVM运行于内核空间、QEMU运行于用户空间,Guest OS 下发指令时,CPU和内存相关的指令通过QEMU-KVM中间的/ioctl 调用/dev/kvm,将这部分指令交给内核模块来做,其他的IO操作则由QEMU-KVM中的QEMU部分实现,实现完整意义上的虚拟化。

管理工具

Libvirt:一个开源项目,是一个非常强大的管理工具,向下可以对接各种 Hypervisor ,可以管理KVM、Xen等虚拟化平台,向上提供API接口,做为管理工具和Hypervisor 的中间层存在,且对上层用户完全透明。

virtio:是用于网络和磁盘设备驱动程序的虚拟化标准,让Guest OS的设备程序知道它运行于虚拟化环境中,并与虚拟机管理程序配合使用,使Guest OS 能够获得高性能的网络和磁盘操作。


THE END