随着云计算技术的发展及其应用的普及和深入,云平台资源的高效利用成为日益重要的问题,而服务器虚拟化技术是实现云计算资源有效利用的关键技术。云计算的云系统本质上是一个大规模的分布式系统。虚拟化在一个物理平台上虚拟更多的虚拟平台,每个虚拟平台都可以作为一个独立的终端加入云中的分布式系统。与直接使用物理平台相比,虚拟化在资源有效利用、动态分配和高可靠性方面具有很大优势。
一、虚拟化技术
服务器虚拟化技术是指可以在一台物理服务器上运行多台虚拟服务器的技术。在用户、应用软件甚至操作系统眼里,上面提到的虚拟服务器几乎和物理服务器一样,用户可以在虚拟服务器上灵活安装任何软件。此外,服务器虚拟化技术还应保证上述虚拟服务器之间的数据隔离和可控的资源占用。
在X86平台虚拟化技术中,新引入的虚拟化层通常称为Virtual MachineMonitor,VMM),也称为Hypervisor。虚拟机监视器运行的环境,即真实的物理平台,称为主机。虚拟平台通常称为来宾机,运行在其中的系统也相应地称为来宾操作系统,如下图所示:
1974年,波普克和痴心小蚂蚁在一篇论文中定义了“经典虚拟化”的基本要求。他们认为一个真正意义上的VMM至少应该符合三个标准:
等价执行:除了资源的可用性和时间上的差异,虚拟化环境和真实环境中程序的执行完全相同。
性能:指令集中的大多数指令应该能够直接在CPU上运行。
安全性):VMM应该能够完全控制系统资源。
二、CPU虚拟化技术的实现
软件虚拟化和硬件虚拟化
1)软件虚拟化
纯软件虚拟化,顾名思义,就是在现有的物理平台往往不支持硬件虚拟化)上,利用纯软件的方法拦截和模拟对物理平台的访问。常见的软件虚拟机,如QEMU,使用纯软件模拟X86平台处理器的取值、解码和执行,客户端的指令不直接在物理平台上执行。因为所有的指令都是由软件模拟的,所以性能往往很差,但是不同架构平台的虚拟机可以在同一个平台上模拟。
VMWare的软件虚拟化使用了动态二进制翻译BT)技术。与QEMU的模拟不同,BT是加速虚拟化的方案之一,另一种常见的虚拟化加速方案是硬件辅助虚拟化技术。BT是允许客户端的指令在虚拟机监控器的可控范围内直接运行在物理平台上。但是,客户端指令在运行前会被虚拟机监控器扫描,其中突破虚拟机监控器限制的指令会被可以直接在物理平台上运行的安全指令,或者被对虚拟机监控器的软件调用动态替换。这样做的好处是纯软件仿真的性能大大提高仿真就是通过一个软件来做一个赝品,这个可能存在,也可能不存在;虚拟化就是通过一些切割或者其他方式对这个设备进行虚拟化,提供一定程度的服务),但同时也失去了跨平台虚拟化的能力。
使用BT技术,来宾的用户空间在CPU环3上运行,而来宾的内核空间在CPU环1上运行,主机的内核空间在CPU环0上运行。在CPU环1上监控BT,随时将Guest内核的调用转换为特权指令调用。当然CPU环1还没有使用,BT技术大大提升了虚拟化性能。但是BT有一个很大的缺点就是不能跨平台。使用QEMU模拟器可以模拟各种CPU架构平台,如PowerPC和ARM,而不考虑底层硬件。但是BT做不到这一点。英国电信严重依赖底层架构。例如,如果底层架构是X86,则只能创建X86 CPU虚拟机。
在纯软件虚拟化解决方案中,VMM在软件套件中的位置是传统意义上的操作系统的位置,而操作系统的位置是传统意义上的应用程序的位置。这种转变将不可避免地增加系统的复杂性。软件栈的日益复杂意味着这些环境难以管理,这将增加确保系统可靠性和安全性的难度。
2)硬件辅助虚拟化
硬件辅助虚拟化HVM)简而言之,就是物理平台本身为拦截和重定向特殊指令提供硬件支持,甚至新的硬件也会提供额外的资源,帮助软件虚拟化关键硬件资源,从而提升性能。可以理解为CPU增加了一个额外的ring -1环供虚拟机运行。以X86平台的虚拟化为例。支持虚拟技术的X86 CPU有专门优化的指令集来控制虚拟进程。通过这些指令集,VMM可以轻松地将客户端置于受限模式。一旦客户端尝试访问物理资源,硬件将暂停客户端的操作,并将控制权返回给VMM进行处理。VMM还可以利用硬件虚拟化增强机制,将客户端在受限模式下对某些特定资源的访问完全从硬件重定向到VMM指定的虚拟资源,整个过程不需要暂停客户端的运行和VMM软件的参与。
因为虚拟化硬件可以提供
全新的架构,支持操作系统直接在上面运行,无需进行二进制转换,减少了相关的性能开销,极大简化了VMM 设计,进而使VMM能够按通用标准进行编写, 性能更加强大。
需要说明的是, 硬件虚拟化技术是一套解决方案。完整的情况需要CPU、主板芯片组、BIOS和软件的支持,例如VMM软件或者某些操作系统本身。即使只是CPU支持虚拟化技术,在配合VMM软件的情况下,也会比完全不支持虚拟化技术的系统有更好的性能。鉴于虚拟化的巨大需求和硬件虚拟化产品的广阔前景,Intel一直都在努力完善和加强自己的硬件虚拟化产品线。自2005年末,Intel便开始在其处理器产品线中推广应用Intel Virtualization Technology(IntelVT)虚拟化技术,发布了具有IntelVT虚拟化技术的一系列处理器产品,包括桌面的Pentium和Core系列,还有服务器的Xeon至强和Itanium安腾。Intel一直保持在每一代新的处理器架构中优化硬件虚拟化的性能和增加新的虚拟化技术。现在市面上,从桌面的Core i3/5/7,到服务器端的E3/5/7/9,几乎全部都支持Intel VT技术。可以说, 在不远的将来, Intel VT很可能会成为所有Intel处理器的标准配置。当然AMD的CPU也都支持虚拟化技术。
3)总结
硬件辅助虚拟化貌似比BT技术更好,如果BT技术能够让虚拟机性能达到物理机80%的性能的话,那么硬件辅助虚拟化(HVM)就能够让虚拟机性能达到物理机85%左右。当然这中间的转换还是需要的,只不过是由硬件直接完成了,仅此而已。
全虚拟化和半虚拟化
1)Full-virtualization(全虚拟化)
全虚拟化为客户机提供了完整的虚拟X86平台, 包括处理器、 内存和外设, 支持运行任何理论上可在真实物理平台上运行的操作系统, 为虚拟机的配置提供了最大程度的灵活性。不需要对客户机操作系统做任何修改即可正常运行任何非虚拟化环境中已存在基于X86平台的操作系统和软件,这也是全虚拟化无可比拟的优势。
在全虚拟化情况下,虚拟机并不知道自己运行在虚拟化环境下,是无感知的,安装使用时跟在物理机上没有什么区别。但是这种完全虚拟化中间需要软件做支撑的,需要软件去模拟提供所有的硬件资源,至少是这个CPU的特权指令需要用软件去模拟的,因为你要让各Guest并不知道自己运行在虚拟环境中,那么你就必须要提供一个带有特权指令的CPU。
在虚拟化环境中,通常虚拟跟模拟是两个概念,VMWare的动态二进制翻译技术(BT)是虚拟的而QEMU软件技术是模拟的。最大的区别在于,模拟通过软件实现时需要模拟CPU ring 0-3,也就是需要转换CPU ring 0-3所有的指令,而虚拟只需要转换CPU ring 0特权指令即可。
当然不管上面说到的BT技术还是QEMU还是硬件辅助虚拟化技术都属于完全虚拟化技术,都是需要指令转换的,都是需要复杂的步骤才能完成的,如果我们能够精简这其中的步骤那么虚拟机的性能一定会有提升的。那么怎么精简呢?这就是下面说的半虚拟化技术。
另外,在全虚拟化模式下:
CPU如果不支持硬件虚拟化技术:那么所有指令都是通过VMM虚拟的,通过VMM内的BT动态翻译技术把虚拟机要运行的特权指令转换为物理指令集,然后到CPU上运行。
CPU如果支持硬件虚拟化技术:VMM运行ring -1,而GuestOS运行在ring 0。
2)Para-virtualization(半虚拟化)
软件虚拟化可以在缺乏硬件虚拟化支持的平台上完全通过VMM软件来实现对各个虚拟机的监控,以保证它们之间彼此独立和隔离。 但是付出的代价是软件复杂度的增加,和性能上的损失。减轻这种负担的一种方法就是,改动客户操作系统,使它知道自己运行在虚拟环境下,能够与虚拟机监控机协同工作。这种方法就叫半虚拟化(para-virtualization)。虚拟机内核明确知道自己是运行在虚拟化之上的,对于硬件资源的使用不再需要BT而是自己向VMM申请使用,如对于内存或CPU的使用是直接向VMM申请使用,直接调用而非翻译。就算对于I/O设备的使用它也可以通过Hyper Call(Hypervisor提供的系统调用)直接可以跟硬件打交道,减少了中间的翻译步骤自然性能就好了,据说这种半虚拟化方式能够让虚拟化达到物理机90%的性能。本质上,半虚拟化弱化了对虚拟机特殊指令的被动截获要求,将其转化成客户机操作系统的主动通知。但是,半虚拟化需要修改客户机操作系统的源代码来实现主动通知。
Xen是开源准虚拟化技术的一个例子,操作系统作为虚拟服务器在Xen Hypervisor上运行之前,它必须在内核层面进行某些改变。因此,Xen适用于BSD、Linux、Solaris及其他开源操作系统,但不适合对像Windows这些专有的操作系统进行虚拟化处理,因为它们不公开源代码,所以无法修改其内核。
3)总结
由于硬件辅助虚拟化的出现,使得完全虚拟化在性能上也得到了提升。并且相比半虚拟化而言,完全虚拟化使用上更加简化,虚拟过程对于Guest而言是透明的。所以完全虚拟化更加符合市场需求,比如后面说的KVM虚拟机。
三、虚拟化的运行模式
Type-I:直接运行在操作系统之上的虚拟化,模式如下图:
如:Vmware workstations、Kvm等。
Type-II:直接运行在硬件之上的(提供各种硬件驱动),模式如下图:
如:Vmware EXSI、Xen等。
但是Xen有点特别,虽然也是直接安装在硬件之上,提供Hypervisor,但是只负责CPU、内存、中断,不提供I/O驱动,需要额外安装一个虚拟机再安装一个Linux系统用来管理I/O设备,如下图:
四、其他类型
当然,除了上面提到的基于操作系统或直接基于硬件的虚拟化外,还有如下常见的类型。
容器虚拟化
基于内核的虚拟化,所有的虚拟机都是一个独立的容器,但共同运行硬件之上,使用着同一个内核。优点就是速度快,部署容易,缺点就是相互间的资源相互隔离比较麻烦,但现在市场也都有了相对成熟的解决方案。如,如今大火的Docker,网上都有人说Docker具有取代虚拟化的势头。
模拟器虚拟化
通过模拟器模拟所有的硬件,如QEMU,KVM就是使用QEMU。
库虚拟化
通过在操作系统之上模拟出不同系统的库,如Linux上运行Wine就可以支持Windows上的软件运行,Windows上运行Cywin就可以支持Linux上的软件运行。因为现在操作系统都是遵循POSIX标准,所以各自提供的库接口都是同一个标准,只需要在对应的平台上运行一个可以提供对方库的软件,然后在此软件之上运行针对对方系统编译好的软件即可。为什么要运行针对对方平台编译好的软件,因为虽然库统一了,但是各自的ABI(应用二进制接口)接口还是不同的。
极速赛车五码稳赢技巧拟化)
软件虚拟化可以在缺乏硬件虚拟化支持的平台上完全通过VMM软件来实现对各个虚拟机的监控,以保证它们之间彼此独立和隔离。 但是付出的代价是软件复杂度的增加,和性能上的损失。减轻这种负担的一种方法就是,改动客户操作系统,使它知道自己运行在虚拟环境下,能够与虚拟机监控机协同工作。这种方法就叫半虚拟化(para-virtualization)。虚拟机内核明确知道自己是运行在虚拟化之上的,对于硬件资源的使用不再需要BT而是自己向VMM申请使用,如对于内存或CPU的使用是直接向VMM申请使用,直接调用而非翻译。就算对于I/O设备的使用它也可以通过Hyper Call(Hypervisor提供的系统调用)直接可以跟硬件打交道,减少了中间的翻译步骤自然性能就好了,据说这种半虚拟化方式能够让虚拟化达到物理机90%的性能。本质上,半虚拟化弱化了对虚拟机特殊指令的被动截获要求,将其转化成客户机操作系统的主动通知。但是,半虚拟化需要修改客户机操作系统的源代码来实现主动通知。
Xen是开源准虚拟化技术的一个例子,操作系统作为虚拟服务器在Xen Hypervisor上运行之前,它必须在内核层面进行某些改变。因此,Xen适用于BSD、Linux、Solaris及其他开源操作系统,但不适合对像Windows这些专有的操作系统进行虚拟化处理,因为它们不公开源代码,所以无法修改其内核。
3)总结
由于硬件辅助虚拟化的出现,使得完全虚拟化在性能上也得到了提升。并且相比半虚拟化而言,完全虚拟化使用上更加简化,虚拟过程对于Guest而言是透明的。所以完全虚拟化更加符合市场需求,比如后面说的KVM虚拟机。
三、虚拟化的运行模式
Type-I:直接运行在操作系统之上的虚拟化,模式如下图:
如:Vmware workstations、Kvm等。
Type-II:直接运行在硬件之上的(提供各种硬件驱动),模式如下图:
如:Vmware EXSI、Xen等。
但是Xen有点特别,虽然也是直接安装在硬件之上,提供Hypervisor,但是只负责CPU、内存、中断,不提供I/O驱动,需要额外安装一个虚拟机再安装一个Linux系统用来管理I/O设备,如下图:
四、其他类型
当然,除了上面提到的基于操作系统或直接基于硬件的虚拟化外,还有如下常见的类型。
容器虚拟化
基于内核的虚拟化,所有的虚拟机都是一个独立的容器,但共同运行硬件之上,使用着同一个内核。优点就是速度快,部署容易,缺点就是相互间的资源相互隔离比较麻烦,但现在市场也都有了相对成熟的解决方案。如,如今大火的Docker,网上都有人说Docker具有取代虚拟化的势头。
模拟器虚拟化
通过模拟器模拟所有的硬件,如QEMU,KVM就是使用QEMU。
库虚拟化
通过在操作系统之上模拟出不同系统的库,如Linux上运行Wine就可以支持Windows上的软件运行,Windows上运行Cywin就可以支持Linux上的软件运行。因为现在操作系统都是遵循POSIX标准,所以各自提供的库接口都是同一个标准,只需要在对应的平台上运行一个可以提供对方库的软件,然后在此软件之上运行针对对方系统编译好的软件即可。为什么要运行针对对方平台编译好的软件,因为虽然库统一了,但是各自的ABI(应用二进制接口)接口还是不同的。