Think Deep,Work Lean

kvm虚拟化云计算

Posted on By zack

前言

云计算是实现信息化的的基础服务,虚拟化是云计算的基础技术。目前商业的虚拟化产品和技术几乎被VMare、Citrix和Microsoft垄断,开源的虚拟化技术主要是KVM。从2007始linx2.6.20内核加入KVM模块至今,KVM受到Intel、Redhat、IBM、华为、Google为代表的大力支持,从而在软件、硬件、应用层面发展非常迅速,成为企业进行系统虚拟化和云平台建设的重要选择。

在虚拟化领域也有很多技术和产品种类,包括传统的老牌虚拟化软件VMare、Microsoft的Hyper-V、Citrix的XenServer/XenClient、Oracle的VirtualBox等 ,还在Linux平台上流行的KVM、Xen等,甚至包括在linux轻量级的虚拟化技术LXC; 随着Linux服务器广泛应用在互联网行业,KVM作为Linux内核原生的虚拟化技术得到大规模应用,如Google的GCE底层就是使用KVM作为虚拟化技术来实现的。

KVM虚拟机最初由以色列的创业公司Qumranet员工Avi Kivity等人开发,于2006年8月完全开源到Linux内核社区;Redhat公司于2008年将该公司收购,并于2010年将发布的RHEL6中完全用KVM替换RHEL5中默认支持的XEN,自此KVM成为RHEL默认的虚拟化支持方案。

KVM必须依赖CPU的硬件虚拟化,以Intel、AMD为代表x86的硬件平台也推出了很多虚拟化相关的硬件特性,包括最初基本的CPU的VT支持和EPT、VPID,以及I/O设备的VT-d、SR-IOV,还包括最新的APIC-v、Shadow VMCS等特性。

开源社区如KVM Libvirt QEMU

kvm的上层应用软件和云计算平台:如libvirt Ovirt Virt-Manager Openstack

公有云平台比较出名的是Amazon(亚马逊)和google(谷歌)提供的服务。Amazon使用弹性计算云(EC2)和简单存储服务(S3),为企业提供计算和存储服务,服务项目包括存储服务器、带宽、CPU资源及月租费。Amazon把云计算做成一个大生意并没有花太长时间,不到两年,但在上面注册的开发人员就达到44万;云计算成为增长最快的业务之一,2012年云计算收入已达21亿美元;Google于2008年4月推出Google App Engin(GAE)云计算服务,GAE采用的是Paas(平台即服务)

定义

  • 什么是云计算?

维基百科给的定义是:云计算是一种通过因特网以服务的方式提供动态可伸缩虚拟化的资源的计算模式
美国国家标准与技术研究院(NIST)定义:云计算是一种按量使用付费的模式,这种模式提供可用的、便捷的、按需的网络访问,进入可配置的计算资源共享池(资源包括网络、服务器、存储、应用软件和服务),这些资源能够被快速提供,只需提供很少的管理工作,或与服务商进行很少的交互。
提供资源的网络称为“云”,“云”中的资源在使用者看来是可以无限扩展,随时使用、按需付费。
云计算的兴起改变了现在以本地计算为主的应用模型。用户不再需要付费购买软件将下载并安装到本地计算机中执行。取而代之的,大量的计算任务,由客户端通过网络发起,在云计算提供商的数据中心的服务器集群上进行计算,将其结果经过由网络返回,在客户端进行呈现。 他们有三种表现形式IAAS/PAAS/SAAS

IAAS(infrastructure as a service)

由多台服务器组成的“云端”基础设施,作为计量服务提供给客户。它将内存、I/O设备、存储和计算能力整合成一个虚拟的资源池为整个业界提供所需要的存储资源和虚拟化服务器等服务。这是一种托管型硬件方式,用户付费使用厂商的硬件设施。例如Amazon Web服务(AWS)、Google的Google Compute Engin、IBM的BlueCloud等均将基础设施作为服务出租。IASS的·优点是:用户只需低成本的获得所需硬件资源、按需租用相应的计算能力、存储容量、网络带宽,而且省去了硬件运维成本,大大降低了用户在硬件上的开销。

PAAS(platform as a service)

把开发环境作为一种服务来提供。这是一种分布式平台服务,厂商提供开发环境、服务器平台、硬件资源等服务给客户,用户在其平台基础上定制开发自己的应用软件,并通过其服务器和互联网传递给其他客户。PAAS能够为企业和个人提供研发的中间件平台,提供应用程序开发、数据库、应用服务器、试验、托管及应用服务。Google App Engine为例,由python应用服务器群、BigTable数据库及GFS组成的平台,为开发商提供一体化主机服务器及可自动升级的在线服务。用户编写应用程序并在Google的基础架构上运行就可以为互联网用户提供服务,Google提供应用运行及维护所需要的平台资源。

SAAS(service as a service)

提供商将应用软件统一部署在自己服务器上,用户根据需求通过互联网向厂商订购应用软件服务,服务提供商根据客户所定软件数量、时间长短等因素收费,并且通过浏览器向客户提供软件的模式。这种模式的优势是,由服务提供商提供和管理软件,提供软件运行的硬件设施,用户只需拥有能够接入互联网的终端,即可随时随地使用软件。在这种模式下客户不需在花大量资金在硬件、软件、维护人员上,只需要支出一定的租赁费用,通过互联网就能享受到相应硬件、软件和维护服务,这是网络应最具效益的营运模式。对小型企业来说,SAAS是采用先进技术的最好途径。salesforce.com是提供这类服务最著名的公司。Google Docs、Google Apps和Zoho Office也属于这类服务。

虚拟化

虚拟化是通过一个物理平台上虚拟出更多的虚拟平台,而其中的每个虚拟平台则可以作为独立的终端加入云端的分布式系统。比起直接使用物理平台,虚拟化在资源使用、动态调配和高可靠性方面有巨大优势。在X86平台虚拟化技术中,新引入的虚拟化层通常称为虚拟机监控器(Virtual Machine Monitor,VMM),也叫作Hypervisor。虚拟机监控器运行的环境就是真实的物理平台,称之为宿主机。而虚拟出来的平台称为客户机,里面运行的操作系统称为客户机操作系统。还分全虚拟化和准虚拟化,或软件虚拟化和硬件虚拟化。

虚拟化–软件方案

QEMU(软件虚拟机),通过纯软件来仿真x86平台处理器的取指、解码和执行,客户机的指令并不在物理机上执行。由于所有的指令都是软件模拟的,因此性能会比较差,但是可以在一个平台上模拟不同架构平台的虚拟机。 VMare的软件则使用了动态进制翻译技术。虚拟机监控机在可控的范围内,允许客户机的指令在物理平台上直接运行。但是,客户机指令在运行前会被虚拟机监控机扫描,其中突破虚拟机监控机限制的指令会被动态替换为可以在物理平台上直接运行的安全指令,或者替换为对虚拟机监控器的软件调用。这样做的好处,比纯软件模拟性能有大幅的提升,但是同时也失去了跨平台虚拟化的能力。
在纯软件虚拟化解决方案中,VMM在软件套件中的位置是传统意义上操作系统所处的位置,而操作系统的位置是传统意义上应用程序所处的位置。这种转换会增加系统的复杂性。

虚拟化–硬件方案

如Intel VT

准虚拟化 para-virtualization

也就是半虚拟化,如Xen,不适合windows,因需改动内核源代码,windows未公开源代码

全虚拟化 full-virtualization

KVM

Kernal Virtal Machine,内核虚拟机,基于linux Kernal,通过加载模块从而使Linux Kernal本身变成一个hypervisor。KVM是基于虚拟化扩展(Intel VT或AMD-V)的x86硬件,是linux完全原生的全虚拟化解决方案。KVM本身并不执行任何模拟,需要用户空间程序通过/dev/kvm接口设置一个客户机虚机服务器的地址空间,向它提供模拟的I/O,并将它的视频显示映射回宿主的显示屏,目前这个应用程序就是QEMU.

  • 存储 KVM能够使用LINUX 支持的任何存储来存储虚拟机镜像,包括具有IDE、SCSI和SATA的本地磁盘,网络附加存储(NAS)(包括NFS和SAMBA/CIFS),或者支持iSCSI和光纤通道的SAN。
  • 性能和伸缩 KVM在很多方面(如计算能力、网络带宽等)已经可以达到非虚拟化原生环境的95%以上的性能。

Intel的虚拟化

  • VT-x:处理器相关
  • VT-d:芯片组相关
  • Intel网卡自有的VMDq和PCI组织定义的SR-IOV:输出输入设备相关

一般服务器都将VT打开了,一般在BIOS中,VT的选项通过 “advanced-processor configuration”来查看和配置。
linux系统中,/proc/cpuinfo文件中的CPU特性标志flags来查看是否支持虚拟化,x86和x86-64平台中Intel系列CPU支持虚拟化的标志为“vmx”,AMD为”svm”

egrep '(vmx|svm)' /proc/cpuinfo

KVM QEMU Libvirt之间的关系

  • Qemu是一个模拟器,它向GuestOS模拟CPU,也模拟其他硬件,正如非硬件辅助全虚拟化讲到的,GuestOS认为自己在和硬件直接打交道,其实是同Qemu模拟出来的硬件打交道,Qemu将这些指令转译给真正的硬件。由于所有的指令都要从Qemu里面过一手,因而性能比较差;
  • KVM是内核模块,采用硬件辅助虚拟化技术Intel-VT,AMD-V; 使用KVM,GuestOS的CPU指令不用经过Qemu转译,直接运行,大大提高了速度;KVM通过/dev/kvm暴露接口,用户态程序可以通过ioctl来访问这个接口
  • Qemu将KVM整合进来,通过ioctl调用/dev/kvm接口,将有关CPU指令部分交由内核来做,就是qemu-kvm(qemu-system-XXX),Qemu还会模拟其他硬件,如Network,Disk,同样会影响这些设备的性能,于是产生pass through半虚拟化设备virto_blk,virto_net,提高设备性能
  • libvirt是目前使用最广泛的对KVM虚拟机进行管理的工具和API,Libvirt是一个daemon进程,可以被本地virsh调用,也可以被远程virsh调用;libvirtd调用qemu-kvm操作虚拟机,有关CPU虚拟化的部份,qemu-kvm调用kvm内核模块来实现