虚拟化历史
云计算底层用的都是开源虚拟化技术,源代码开源可用,方便二次开发;但Vmware虚拟化是闭源商用。所以云计算厂商更愿意选择开源虚拟化。
开源虚拟化两大阵营:XEN 和 KVM(目前主流是KVM)
AWS最早使用XEN,当年没有KVM,如今国内云计算厂商基本用的都KVM。
虚拟化发展史:
1964年 IBM开始尝试在大型机上实现虚拟化
1972年 IBM推出运行在大型机上的虚拟机
1999年 VMware推出了x86架构的虚拟化产品
2002年 Xen正式被开源
2006年 Qumranet宣布KVM诞生
2007年 惠普发布了针对HP-UX的Integrity虚拟机
2007年 红帽5.0版本中提供XEN虚拟化机制
2008年 微软放在Windows Server 2008 R2中加入了Hyper-V
2010年 红帽6.0版本中默认仅提供KVM虚拟化机制
2011年 IBM、红帽、惠普和英特尔成立开放虚拟化联盟,加速KVM推广
2013年 Docker推出
云计算与虚拟化的区别
云计算—控制面
虚拟化—业务面
云计算把资源池化和进行管理调度,并不产生资源;虚拟化技术只是实现云计算的重要技术之一。
云计算底层不仅支持虚拟机,也可以是裸金属服务器,同样也可以跑Docker。
知名云厂商:
1.AWS(绝对老大)
2.Microsoft
3.Aliyun
虚拟化涉及的基本概念
Guest OS:运行在物理机上的虚拟机操作系统
Guest Machine:运行在物理机上的虚拟机
Host OS:运行在物理机上的操作系统
Guest Machine:物理机,宿主机
Hypervisor(VMM)分类
类型一:裸金属(CNA/Esxi)
类型二:宿主型(Vmware Workstation/Oracle VirtualBox)
KVM和XEN的故事
2002年左右,英国剑桥大计算机实验室发布了针对x86虚拟化的开源虚拟化项目Xen,并成立XenSource公司;后面XenSource则被思杰收购。
RHEL 5.0发布的时候,红帽决定将Xen加入到自己的默认特性当中,但是作为一项Linux平台上的虚拟化技术,Xen在很长一段时间内一直没有被接受到Linux内核的代码当中,这对于Xen的维护者而言,不仅意味着要多做很多工作,还意味着用户在废了半天劲装好Xen之后可能遇到意想不到的问题。
于是2008年9月,红帽收购了一家名叫Qumranet的以色列小公司,由此入手了一个叫做KVM的虚拟化技术(KVM,全称Kernel-based Virtual Machine,意为基于内核的虚拟机),并在从RHEL6.0开始抛弃XEN,转用KVM。
Xen特点:必须升级内核才能使用。维护庞大的内核,所有内核模块,驱动程序都需要重新编译,重新安装,工作量及其大。
一旦升级内核,和内核相关的所有的内核模块,驱动都需要重新编译。意味着要经常维护一套庞大的内核,这就是XEN问题所在。
KVM特点:kernal-based virtual machine 基于内核的虚拟机。属于linux内核的一部分,无需单独维护一套虚拟化内核。
思杰citrix收购了xen,赞助一家开源社区CloudStack
红帽redhat收购了kvm,赞助一家开源社区OpenStack
虚拟化分类
全虚拟化,半虚拟化,硬件辅助虚拟化。
了解虚拟化技术的实现,就必须先了解CUP指令环概念。
CUP指令环分为0,1,2,3;4个等级。0环也被称为内核态,3环被称为用户态。1,2环主要跑驱动程序。当3环上的应用程序需要调用计算,网络或者存储资源的时候,指令必须交给0环内核态处理并分发资源。
全虚拟化
直到虚拟机出现,就比如我们在Vmware Workstation上创建的虚拟机,它有自己的操作系统,他的代码告诉它:它是一个真正的操作系统,肯定处在0环,有绝对的调度资源的权限。而事实上它只不过是应用程序虚拟出来的虚拟机,运行在3环,资源调度是有限的。所以最早为了防止虚拟机操作系统“脑裂”,工程师门就想到用虚拟化层(VMM)去替虚拟机把指令“翻译”后交给0环的内核态处理,再把结果反馈给虚拟机,用这样的方式“瞒过”虚拟机操作系统,让它从始至终认为自己运行在内核态。这样的虚拟化我们称为完全虚拟化。
但是这样的缺陷就是:程序运行起来太慢了,每次的指令都要VMM“翻译”后交给0环处理。
半虚拟化
为了使程序更快的在虚拟机上运行,半虚拟化应运而生。实现方式是:不需要VMM层来“翻译”指令了,直接就让虚拟机操作系统认清自己的地位,变相的让虚拟机OS跑在0环,但必须修改宿主机操作系统来实现虚拟机OS的自我认知,所以Windows不能实现,因为它是闭源OS。
硬件辅助虚拟化
为了解决权限等级问题,Intel的VT-x和AMD的AMD-V从硬件层面帮助虚拟机认清自己是虚拟机,并把虚拟机OS放在新的级别,不需要VMM层的转化,大部分指令直接可以调用CPU资源,只有遇到少部分敏感指令才会交给内核态处理,这样就大大提高了系统运行速度。