之前大致介绍了什么是虚拟化,并以CPU的虚拟化为例进行简要介绍,纠正一些人们对于虚拟化的误解!那本本节就来说一说常见的虚拟化技术!

概述

上节提到,以笔者为例,平时在PC上使用比较多的虚拟化是Vmwear(一个桌面软体,当然偶尔也会使用Virtual Box,后者是一个开源软体功能依旧很强大),这类软体可以在windows上安装linux虚拟机(用户学习linux系统,或者安装hadoop集群进行学习测试),且安装完成的虚拟机就是一个文件夹,可以拷贝到任意其他PC电脑上使用,只要那台电脑上也装了Vmwear,等同于一个移动操作系统。但是这仅仅是我们个人在PC端使用的虚拟化软体,如果在企业级伺服器上相应的工具又是什么?Vmwear在伺服器端也推出了自己的虚拟化工具,叫做ESXI,打开后是一个文本界面,但是它并不是使用最广泛的虚拟化技术,使用最广泛的服务端虚拟化技术是KVM和Xen。KVM是Host OS 中的两个内核模块,且是使用做广泛的开源的hyperviser。但是KVM出现的比较晚,KVM是依赖硬体辅助虚拟化技术实现的,是在06年硬体虚拟化技术出现后才有的。而06年之前使用的是另一个开源的hyperviser,那就是XEN,国内的阿里和国外的AWS都是使用的XEN。Xen是剑桥实验室开发的,对系统修改比较大。目前linux伺服器首选KVM(为什么AWS和阿里云没有使用KVM而使用XEN,或许因为他们开始做云计算的时候KVM还不成熟,无法商用)。下面主要以KVM和XEN这两种典型的技术进行介绍。

一、XEN:

上一节中提到,X86不好做虚拟化的根本原因就是虚拟的操作系统中有些指令没有办法执行(特权指令)。KVM是基于应将辅助虚拟化技术解决的这个问题,但是XEN出现的的时候还没有硬体辅助虚拟化技术,它是怎么解决这个问题的呢?XEN的处理方法就是让虚拟机的操作系统不要去用这些指令(简单,暴力,我喜欢)。那虚拟机的操作系统不用这些指令,虚拟机怎么工作呢?XEN给出的解决方案是,当虚拟机用到这些指令时不去调用CPU的指令而是调用xen的hyperviser,它帮你把完成这些指令相应的功能。而这样需要付出的代价就是要改操作系统,把操作系统的内核给改了,让操作系统在遇到这些指令的时候不要去调CPU的指令而是去调用XEN的hyperviser,所以XEN把这种调用叫做HyperCall(国内大多被翻译成「超级调用」)。因此XEN里面是跑不了widow的虚拟机的,因为没有办法修改windows的内核,但有支持XEN的linux版本。

1.1 XEN的使用

首先找台伺服器过来,装上linux,之后装上XEN,装上xen之后他会修改linux的内核,改完之后他会告诉你重启这台伺服器机器。而当你重启这台伺服器之后,里面软体的位置就发生了翻天覆地的变化,如下图所示:

在重启伺服器之前,我们是在伺服器硬体上 装了linux的操作系统,然后在linux之上装了Xen;本来物理伺服器上跑的是操作系统,但是装完XEN并重启之后,在伺服器的硬体之上跑的不在是linux操作系统而是XEN 的Hypervisor,而之前我们装的linux作为Host OS 在其之上 ,即左上角的HOST OS,其本质上也就是一个虚机了。之后如果再创建虚机GUEST OS就会如图Host OS的右边,也称之为Paravirtualized OS因为Para这个前缀愿意是并列的意思 ,但因为也有半的意思,所以在某些文献中被称之为「半虚拟化」(算是一种英文直译的后果吧)。

此时还涉及到一个问题就是外部设备怎样供多个虚机使用?这是就要依靠右上角的那个Host OS即管理用的虚机称之为Domain0,之后再启动的虚机,即供用户使用的虚机成为DomainU。也就是Domain0是做管理用的虚机,DomainU是用户用的虚机。回到之前的问题,而外设的虚拟化怎么实现?其实就是在Domain0 里面跑物理的驱动通过Domain0将这个物理的设备虚拟化成多个设备供其他的虚机(DomainU)去使用,所以说Domain0和Hypervisor一起实现了外部设备的虚拟化。由此可见外部设备的虚拟化从来都不是HyperVisor自己可以搞定的,都要依赖其他的辅助协同去实现,对于KVM来说他依赖于qemu,对于XEN来说依赖于Domain0,另外VMware在服务端的虚拟化技术叫做ESXI,他的架构在本质上跟KVM是非常类似的。微软的HyperVisor叫做Hyper_V跟Xen比较类似。

XEN虚拟化结构示意图:

二、KVM

上一节我们提到,在安装虚拟机时底层跑的是系统(我们PC机上的windows)我们称为Host OS。相应的在linux伺服器端,原始装的那个linux系统我们也称为Host OS,在器之上我们安装各种应用,JVM,JCC,Python等等。而KVM是Host OS中的两个内核模块,KVM自己主要完成指令集的虚拟化工作和硬体辅助虚拟化技术(就是晶元里面的硬体辅助虚拟化技术,比如interl的NT-x AMD-V配合起来去完成计算虚拟化的功能),此外一台计算机光有计算功能还是不够的,一台计算机还要有外部设备,还有内存的管理,而这样一些功能并不在KVM里面实现,而是在qemu里面实现,所以我们也可以说KVM虚机指的是KVM和Qemu在一起实现的虚机。需要注意,每一个虚机在我们的Host OS里面他都是一个进程,跟普通进程的地位是一样的。正如上节提到的,虚拟化与模拟是不一样的,模拟的方式是模拟一个CPU,而程序的指令集先在模拟器上翻译一下,翻译成底层硬体的指令集,在底层硬体上执行,当硬体CPU返回结果以后,他在将底层硬体返回的信息经过模拟器翻译成上层软体的指令集运行。而KVM和硬体辅助虚拟化技术结合起来可以使得指令直接在CPU上执行。

KVM虚拟化结构示意图:

下一节将介绍虚拟机在使用中遇到的问题,并由此引出Container技术!

推荐阅读:

相关文章