openstack---虚拟化学习
一、概述
云计算的一个核心思想就是在服务器端提供集中的物理计算资源,这些物理计算资源可以分解为更小的单位去独立的服务不同的用户,每个用户可以在共享的物理资源中拥有隔离、安全的虚拟环境。
现代操作系统被自下而上的划分为多个层次。每个层次都向上一层次呈现一个抽象,每一层只需要知道下层抽象的接口。虚拟化本质上就是由位于下层的软件模块,根据上层的软件模块的期望,抽象出一个虚拟的软件或硬件接口,使上一层软件可以直接运行在与自己所期望的运行环境完全一致的虚拟环境上。
虚拟化的原理:在OS中加入一个虚拟化层(VMM),虚拟化层可以对下层(HostOS)硬件资源(物理CPU、内存、磁盘、网卡、显卡等)进行封装、隔离,抽象为另一种形式的逻辑资源,再提供给上层(GuestOS)使用。所以你可以理解VMM其实就是联系HostOS和GuestOS的一个中间件,当然虚拟化可以将一份资源抽象为多份,也可以将多份资源抽象为一份。
IaaS(基础架构即服务):
二、虚拟化的实现方式:
VMM直接运行在硬件平台上,控制所有硬件并管理HostOS。Xen就是这种实现。
VMM运行在一个传统的操作系统里(第一软件层),HostOS则运行在第三软件层。KVM和VirtualBox就是这种实现。
三、虚拟化的分类:即按照VMM所提供的虚拟平台类型
首先来理解X86 CPU的结构:
注意:CPU为了保证程序代码执行的安全性、多用户的独立性、保护OS的正常运行,提出了CPU执行状态的概念。这样能够限制不同程序之间的访问能力,避免一个程序获取另一个程序的内存数据造成数据混乱,同时也避免了程序错误的操作物理硬件。一般CPU都会划分为用户态和内核态,x86的CPU架构更是细分为了Ring3~0四种状态。
Ring3 用户态(User Mode):运行在用户态的程序代码需要受到CPU的检查,用户态程序代码只能访问内存页表中规定能被用户态程序代码访问的页面虚拟地址(受限的内存访问)。甚至不能直接访问外围硬件设备、不能抢占CPU。所有的应用程序(Application)都运行在用户态上。——当运行在用户态的Application需要调用只能被核心态代码直接访问的硬件设备时,CPU会通过特别的接口去调用核心态的代码,以此来实现Application对硬件设备的调用。
Ring0 核心态(Kernel Mode):是Host OS Kernel运行的模式,运行在核心态的代码可以无限制的对系统内存、设备驱动程序、网卡接口、显卡接口等外围硬件设备进行访问。只有Host OS能够无限制的访问磁盘、键盘等外围硬件设备的数据,但是首先需要在Host OS上安装驱动程序。
虚拟化的实现层次图:
GuestOS和VMM都属于运行在Ring3上的应用程序,GuestOS操作硬件设备时并执行操作指令时,VMM会将该操作指令监控、捕获、检测后将指令传递给HostOS,HostOS会将GuestOS发出的运行于用户态的操作指令模拟为核心态指令。
完全虚拟化:现有的操作系统无须进行任何修改就可以运行在这样的虚拟平台上。即VMM需要能够正确处理Guest OS的所有行为。
完全虚拟化经历了两个阶段:软件辅助的完全虚拟化和硬件辅助的完全虚拟化。
软件辅助的完全虚拟化引入了两种机制——一是优先级压缩,一是二进制代码翻译。
硬件辅助的完全虚拟化是一种完备的虚拟化方法。这种虚拟化技术引入新的CPU运行模式和新的指令集,使得VMM和GuestOS运行于不同的模式下(VMM=Root Mode;GuestOS=Non-Root Mode),GuestOS运行于受控模式,原来的一些敏感指令在受控模式下会全部陷入VMM,由VMM来实现模拟,这样就解决了部分非内核态敏感指令的陷入——模拟难题,而且模式切换时上下文的保存恢复由硬件来完成,这样就大大提高了陷入——模拟时上下文切换的效率 。该技术的引入使x86 CPU可以很容易地实现完全虚拟化。
内存虚拟化:原来的GuestOS使用的是虚拟内存,不可以缺少虚拟内存到物理内存的翻译,影响了虚拟机的效率。
内存虚拟化的映射关系:
3种地址: 客户机虚拟地址(GVA),指GuestOS提供给其应用程序使用的线性地址空间。
客户机物理地址(GPA),经VMM抽象的,虚拟机看到的伪物理地址。
宿主机物理地址(HPA),真是的机器物理地址,即地址总线上出现的地址信号。
内存地址的映射关系:
GuestOS:GPA = f(GVA) #GuestOS维护着一套页表,负责VA到PA的映射 ;
VMM:HPA = g(GPA) #VMM维护着一套页表,负责PA到MA的映射 ;
由于x86架构只支持一次地址转换,即VMM根据GVA到GPA再到HPA的映射关系,计算GVA到HPA的映射关系,就会引入“影子页表”的问题,内存开销很大,性能受到影响。
为了解决“影子页表”的局限,Intel的VTx提供了EPT(Extended Page Table)直接在硬件上支持两次地址转换。VTx还提出了VPID(Virtual Processor ID)技术,进一步优化内存虚拟化的性能。
I/O虚拟化:最好的方法是让客户机直接使用真实的硬件设备。 VTx的EPT解决了客户机直接访问到设备真实的I/O地址空间,此外VTx通过在北桥引入DMA重映射硬件,让设备的DMA操作直接访问到客户机的内存空间。
网络虚拟化:SRIOV(Single Root I/O Virtualization)将一块网卡分给若干个GuestOS使用,每个虚拟机1/N,性能高,接近真机。 SRIOV定义了两种function的类别:PF和VF。在虚拟化的环境中,一个VF被当作一个虚拟网卡分配给一个Guest OS,所有的VF和PF被连接在SRIOV网卡内部的一个桥(bridge),这样各个VF的通信互不干扰。