x86虚拟化

CPU和X86架构

CPU的功能:指令控制,保证机器按规定的顺序执行程序;操作控制:CPU管理产生由内存取出的每条指令的操作信号,并把各种操作信号送往相应的部件,从而控制这些部件按指令的要求进行动作;时间控制:对各种操作实施时间上的控制;数据加工:对数据算术运算和逻辑运算处理,完成数据的加工处理,这是CPU的根本任务。

寄存器(Register):功能是存储二进制代码,是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。分类:指令寄存器(IR) 、程序计数器(PC)。

计算机指令:就是指挥机器工作的指示和命令,程序就是一系列按一定顺序排列的指令,执行程序的过程就是计算机的工作过程。

两种主要的计算机处理器体系结构:

CISC(Complex Instruction Set Computer,复杂指令集计算机),代表:x86

RISC(Reduced Instruction Set Computer,精简指令集计算机),代表:ARM。

X86架构(The X86 architecture)是微处理器执行的计算机语言指令集,指一个intel通用计算机系列的标准编号缩写,也标识一套通用的计算机指令集合。

X86处理器,X86架构不断被改进,X86指令集则被当做一种规范一直沿用至今,所以在这种规范下制作出的CPU就被称为X86处理器。

ARM架构,曾称进阶精简指令集机器(Advanced RISC Machine)更早称作Acorn RISC Machine,是一个32位精简指令集(RISC)处理器架构。

X86架构虚拟化

X86虚拟化技术指的是基于x86处理器架构的虚拟化技术,虚拟化之后可以在同一台服务器硬件上运行多个Guest OS,Guest OS是指虚拟机所用的操作系统。

X86处理器架构是市场占有率最高的服务器架构,基于x86处理器架构的虚拟化方案也是较为成熟的。Intel公司和AMD公司都有X86处理器架构下的虚拟化技术,分别为:Intel-VT和AMD-V。通过在CPU级别的扩展支持,能够为Guest OS模拟出虚拟的硬件设备,使虚机操作系统之间独立运行而不会感知到宿主操作系统(Host OS)的存在。

使用Intel-VT和AMD-V时,需要在BIOS中选择相应的扩展功能,然后运行诸如VMWare类的Hypervisor软件来实现虚拟化。x86虚拟化出的Guest OS最好也是X86架构的,否则如果用X86架构的硬件虚拟ARM架构的系统,会因为架构体系指令不一样造成硬件利用率低。

X86服务器虚拟化方法上的三个主要技术流派:Para-Virtualization,Full-Virtualization和Hardware-Assisted-Virtualization。

1、Para-Virtualization,准虚拟化/半虚拟化

代表:Citrix的Xen、Microsoft的Hyper-V

2、Full-Virtualization,完全虚拟化

代表:VMware的ESX

3、Hardware-Assisted-Virtualization,硬件协助的虚拟化

Intel VT-x与AMD-V,这两家x86处理器厂商对处理器硬件作了修改,使得guest OS“低特权态部件发出的敏感指令”能够自动被hypervisor截获。所以在这种新机器上,Para-Virtualization就没有必要再对guest OS内核作修改,Full-Virtualization也无必要对guest OS做可执行代码翻译。也可以说,如果不考虑Para-Virtualization与Full-Virtualization在IO设备处理上还有不同之处,那么硬件协助的虚拟化技术已经取消了前两种虚拟化技术之间的差别:两者都可以被看作是全虚拟化技术。

X86虚拟化技术

虚拟化的概念

虚拟化是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。

在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互相不影响,从而显著提高计算机的工作效率。

虚拟化使用软件的方法重新定义划分IT资源,可以实现IT资源的动态分配、灵活调度、跨域共享,提高IT资源利用率,使IT资源能够真正成为社会基础设施,服务于各行各业中灵活多变的应用需求。

Hypervisor的概念,一种运行在物理服务器和操作系统之间的中间层软件,可以允许多个操作系统和应用共享一套基础物理硬件。

虚拟化层次种类

完全虚拟化(Full-Virtualization),又叫硬件辅助虚拟化技术,它在虚拟机(VM)和硬件之间加了一个软件层--Hypervisor,或者叫做虚拟机管理程序(VMM)。Hypervisor可以划分为两大类。首先,类型 1,这种hypervisor是直接运行在物理硬件之上的。其次,类型 2,这种hypervisor运行在另一个操作系统(运行在物理硬件之上)中。类型1 hypervisor 的一个基于内核的虚拟机(KVM —— 它本身是一个基于操作系统的hypervisor)。类型2 hypervisor包括 QEMU 和 WINE。

因为运行在虚拟机上的操作系统通过Hypervisor来最终分享硬件,所以虚拟机发出的指令需经过Hypervisor捕获并处理。为此每个客户操作系统(Guest OS)所发出的指令都要被翻译成CPU能识别的指令格式,这里的客户操作系统即是运行的虚拟机,所以Hypervisor的工作负荷会很大,因此会占用一定的资源,所以在性能方面不如裸机。

准虚拟化/半虚拟化(Para-Vrtualization),半虚拟化技术是后来才出现的技术,也叫做准虚拟化技术,它就是在全虚拟化的基础上,把客户操作系统进行了修改,增加了一个专门的API,这个API可以将客户操作系统发出的指令进行最优化,即不需要Hypervisor耗费一定的资源进行翻译操作,因此Hypervisor的工作负担变得非常的小,因此整体的性能也有很大的提高。不过缺点就是,要修改包含该API的操作系统,但是对于某些不含该API的操作系统(主要是windows)来说,就不行能用这种方法。

系统虚拟化,就操作系统层的虚拟化而言,没有独立的hypervisor层。相反,主机操作系统本身就负责在多个虚拟服务器之间分配硬件资源,并且让这些服务器彼此独立。一个明显的区别是,如果使用操作系统层虚拟化,所有虚拟服务器必须运行同一操作系统 (不过每个实例有各自的应用程序和用户、账户 ) 。虽然操作系统层虚拟化的灵活性比较差,但本机速度性能比较高。此外,由于架构在所有虚拟服务器上使用单一、标准的操作系统,管理起来比异构环境要容易。

容器虚拟化/容器技术,使用 Linux 内核中的 namespaces 和 cgroups 实现进程组之间的隔离。是用内核技术实现的隔离,所以它是一个共享内核的虚拟化技术。

桌面虚拟化,服务器虚拟化主要针对服务器而言,而虚拟化最接近用户的还是要算得上桌面虚拟化了,桌面虚拟化主要功能是将分散的桌面环境集中保存并管理起来,包括桌面环境的集中下发,集中更新,集中管理。桌面虚拟化使得桌面管理变得简单,不用每台终端单独进行维护,每台终端进行更新。终端数据可以集中存储在中心机房里,安全性相对传统桌面应用要高很多。桌面虚拟化可以使得一个人拥有多个桌面环境,也可以把一个桌面环境供多人使用。

虚拟机架构

1型虚拟化

Hypervisor直接安装在物理机上,多个虚拟机在Hypervisor上运行。Hypervisor实现方式一般是一个特殊定制的Linux系统。Xen和VMWare的ESXi都属于这个类型。

虚拟化需要什么样的服务器(云服务虚拟化X86虚拟化技术)(1)

2型虚拟化

物理机上首先安装常规的操作系统,比如 Redhat、Ubuntu 和 Windows。Hypervisor作为OS上的一个程序模块运行,并对管理虚拟机进行管理。KVM、VirtualBox 和VMWare Workstation都属于这个类型。

虚拟化需要什么样的服务器(云服务虚拟化X86虚拟化技术)(2)

KVM虚拟化技术

虚拟化KVM的发展

2006年10月由以色列的Qumranet组织开发的一种新的“虚拟机”方案,并将其贡献给开源世界;

2007年2月于 Linux Kernel-2.6.20 中第一次包含了 KVM;

2008 年 9 月,红帽收购了Qumranet,由此入手了KVM的虚拟化技术。在之前红帽决是将Xen 加入到自己的默认特性当中——那是2006年,因为当时Xen技术脱离了内核的维护方式,也许是因为采用Xen的RHEL在企业级虚拟化方面没有赢得太多的市场,也许是因为思杰跟微软走得太近了,种种原因,导致其萌生了放弃Xen。而且在正式采用KVM,一年后,就宣布在新的产品线中彻底放弃Xen ,集中资源和精力进行KVM的工作;

2009年9月,红帽发布其企业级Linux的5.4版本( RHEL5.4 ),在原先的 Xen 虚拟化机制之上,将KVM添加了进来;

2010年11月,红帽发布其企业级Linux的6.0版本(RHEL6.0),这个版本将默认安装的Xen 虚拟化机制彻底去除,仅提供KVM虚拟化机制;

2011年初,红帽的老搭档IBM找上红帽,表示KVM这个东西值得加大力度去做。于是到了5月, IBM和红帽,联合惠普和英特尔一起,成立了开放虚拟化联盟(Open Virtualization Alliance),一起声明要提升KVM的形象,加速KVM投入市场的速度,由此避免VMware一家独大的情况出现。联盟成立之时,红帽的发言人表示,大家都希望除“VMware之外还有一种开源选择。未来的云基础设施一定会基于开源自Linux 2.6.20之后逐步取代Xen被集成在Linux的各个主要发行版本中,使用Linux自身的调度器进行管理。

基于内核的虚拟机KVM

KVM全称是,基于内核的虚拟机(Kernel-based Virtual Machine),它是一个Linux的一个内核模块,该内核模块使得Linux变成了一个 Hypervisor:

由Quramnet开发,该公司于2008年被Red Hat收购。

支持x86 (32 and 64 位),s390, Powerpc等CPU。

从 Linux 2.6.20起就作为一模块被包含在Linux内核中。

需要支持虚拟化扩展的CPU。

完全开源的。

KVM是一个开源软件,基于内核的虚拟化技术,实际是嵌入系统的一个虚拟化模块,通过优化内核来使用虚拟技术,该内核模块使得Linux变成了一个Hypervisor,虚拟机使用Linux自身的调度器进行管理。

KVM是基于虚拟化扩展(Intel VT 或者 AMD-V)的X86硬件的开源的Linux原生的全虚拟化解决方案。KVM 中,虚拟机被实现为常规的Linux进程,由标准Linux调度程序进行调度;虚机的每个虚拟CPU被实现为一个常规的Linux进程。这使得KMV能够使用Linux内核的已有功能。但是,KVM本身不执行任何硬件模拟,需要客户空间程序通过/dev/kvm接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的I/O,并将它的视频显示映射回宿主的显示屏,目前这个应用程序是QEMU。

Linux的用户空间、内核空间、虚机

Guest:客户机系统,包括CPU(vCPU)、内存、驱动(Console、网卡、I/O 设备驱动等),被 KVM 置于一种受限制的 CPU 模式下运行。

KVM:运行在内核空间,提供CPU和内存的虚级化,以及客户机的I/O拦截。Guest的I/O被KVM拦截后,交给QEMU处理。

QEMU:修改过的为KVM虚机使用的QEMU代码,运行在用户空间,提供硬件I/O虚拟化,通 IOCTL /dev/kvm 设备和 KVM 交互。

KVM组成

KVM基本上有两个组件构成:

KVM驱动:现在已经是Linux内核的一个模块了,它的作用主要是负责虚拟机的创建,虚拟内存的分配,虚拟CPU寄存器的读写和虚拟CPU的运行。

QEMU组件:是一个通用的开源机器模拟器和虚拟器,其主要的功能是用于模拟虚拟机的用户空间组件,提供IO设备模型,访问外设的途径。

kvm.ko(内核模块),只用于管理虚拟CPU和内存。IO的虚拟化,就交给Linux内核和qemu来实现。

Libvirt:是KVM的管理工具。Libvirt 除了能管理KVM这种Hypervisor,还能管理 Xen,VirtualBox 等。OpenStack 底层也使用 Libvirt。

Libvirt包含3个东西:后台daemon程序libvirtd、API 库和命令行工具virsh。

1)libvirtd是服务程序,接收和处理 API 请求;

2)API 库使得其他人可以开发基于Libvirt的高级工具,比如virt-manager,这是个图形化的KVM管理工具;

3)virsh 是经常要用的KVM命令行工具,作为 KVM 和 OpenStack 的实施人员,virsh 和 virt-manager是一定要会用的。

虚拟化VT开启确认

KVM本身也有一些弱点,那就是相比裸金属虚拟化架构的Xen 、VMware ESX 和 HyperV ,KVM是运行在Linux内核之上的寄居式虚拟化架构,会消耗比较多的计算资源;不过针对这一点, Intel、AMD已经在处理器设计上有专门的VT-x和AMD-V扩展,这种特性在每次硬件更新的时候也会更新,往往每次更新后都对虚拟化性能和速度上有明显的提升,所以长远来看,也不是什么大问题。

KVM的虚拟化需要硬件支持,需要处理器支持虚拟化,如:Intel厂商的Intel-VT( vmx )技术&&AMD 厂商的AMD-V( svm )技术,基于硬件的完全虚拟化。而Xen早期则是基于软件模拟的半虚拟化( Para-Virtualization ),新版本则是基于硬件支持的完全虚拟化。但Xen本身有自己的进程调度器,存储管理模块等,所以代码较为庞大。

当前的CPU是否支持VT技术,当不确定你当前 CPU 是否支持 VT 技术时:

1. 可以在 windows 下使用cpu-z软件来进行测试。

2. 可以在 Linux下查看CPU的相关信息来确定。

KVM QEMU组件

KVM Qemu虚拟化模拟器

Qemu是纯软件设计的虚拟化模拟器,几乎可以模拟任何硬件设备,能够模拟一台能够独立运行操作系统的虚拟机,虚拟机认为自己和虚拟机打交道,但其实是和Qemu模拟出来的硬件打交道,Qemu将这些真正的指令转译给真正的硬件。

QEMU是一个主机上的VMM(virtual machine monitor),通过动态二进制转换来模拟CPU,并提供一系列的硬件模型,使guest os认为自己和硬件直接打交道,其实是同QEMU模拟出来的硬件打交道,QEMU再将这些指令翻译给真正硬件进行操作。通过这种模式,guest os可以和主机上的硬盘,网卡,CPU,CD-ROM,音频设备和USB设备进行交互。但由于所有指令都需要经过QEMU来翻译,因而性能会比较差:

,