作为一个刚接触桌面虚拟化不就的菜鸟来说说我对虚拟化的理解,这里所说的虚拟化是指计算机系统级别的虚拟化,即为实现虚拟计算机(Virtual Machine)的虚拟化。
正常情况下,计算机系统主要由三个部分组成,如下所示:
最底层的硬件,中间的固件(BIOS或者UEFI),最后才是操作系统。一般用户都是在操作系统里面实现各种操作,偶尔会在开机之后狂按F2、F9、F10甚至是ESC键进入BIOS/UEFI Setup里面对硬件设置进行更改,如开启CPU的虚拟化功能,设置内存的工作模式,设置启动顺序等等。当用户按下计算机的电源键的时候,计算机的CPU就会自动从特定的地址(指向UEFI/BIOS所存放的ROM或者Flash等存储设备)取指令并执行,UEFI/BIOS会检测计算机中有哪些硬件,并对这些硬件进行初始化(这里面涉及到很多计算机硬件架构的东西),收集可启动的设备,最后通过特定的中断指令跳转到某个可启动的设备中开始操作系统的加载和执行。UEFI/BIOS会通过一些约定好的数据结构告诉操作系统系统中包含了哪些硬件,以及这些硬件的信息,如有多少内存,内存空间是怎么分配的,系统中有多少PCI设备,这些PCI设备的中断是怎么路由的等等。
以上所说的是典型的物理计算机组成,而虚拟化则是通过Hypervisor/VMM(Virtual Machine Monitor)对硬件进行模拟和抽象,让VM(Virtual Machine)的UEFI/BIOS和OS运行再虚拟的硬件之上。如下图所示:
Hypervisor/VMM可以由一下两种不同的分类:
Hypervisor可能是一个专用的软件,直接运行再UEFI/BIOS环境中,不需要运行再OS上,这叫Type 1型Hypervisor;
Hypervisor可能是一个通用OS(如Windows或Linux)上运行的软件和一些内核模块,这种需要借助OS的解决方案叫做Type 2型Hypervisor。
![](/qrcode.jpg)
对物理计算机进行虚拟化,然后再让其他OS运行在虚拟的硬件平台上,说到底都是为了省钱,主要表现在以下几个方面:
提高硬件资源的利用率,特别是对服务器而言。因为调查显示,很多物理服务器其实大部分事件都是比较空闲,消耗大量的能源,只是在某些时间段会比较繁忙,而且很可能一台物理服务器只跑某个单一的业务。如果能够让多个虚拟的服务器跑在同一台物理服务器上,则能够充分利用该物理服务器的硬件资源,从而减少物理服务器的数量。
减少管理和维护的成本。对于运行于虚拟环境的机器而言,由于其之下还有Hypervisor/VMM软件层,管理员可以充分利用该软件层对虚拟机进行更高效、更快捷的管理,如批量、高效地部署OS,对批量虚拟机的状态进行监控等,采用虚拟化解决方案能够很大地减少管理员的维护和管理成本。
目前很多公司都在说往云上迁移,其实都是基于这两个目的。
虚拟化解决方案并不是一个简单的软件,很多时候它是一整套的解决方案,它的相关软件和模块需要部署到整个系统的各个部分。
对于Type 1型的Hypervisor,它需要先在裸机上部署Hypervisor,然后再在该Hypervisor上创建虚拟硬件,接着在虚拟硬件行安装OS,最后可能还需要在安装的OS里面安装相应的驱动才能达到最佳效果。
而对于Type 2型Hypervisor,则需要先在物理裸机上正常安装OS,然后在OS安装Hypervisor相关软件,这些软件可能只是应用程序,也可能包含了用于加速或者硬件模拟的内核模块,然后在Hypervisor提供的应用程序中创建虚拟机,即先创建虚拟机的硬件部分,然后类似于在物理机上安装OS一样,在模拟的硬件上安装OS。
这些虚拟化解决方案软件部分应该叫做software stack,因为它是一整套软件相互配合工作的,不是一个简单的应用程序,所以部署起来可能会有一定的难度。
而在硬件方面,各大芯片厂商也是积极为芯片添加虚拟化功能,特别是Intel,为x86 CPU添加了大量的虚拟化功能,如VMX,VT-d,VT-g等等,从而大大提升虚拟化的效率(软件模拟的效率在硬件功能面前就是渣渣)。
虚拟化水很深,相当于把整个计算机系统,在另外一个平台上再实现一遍,对计算机的硬件、固件、操作系统、驱动和应用程序都有要求。希望自己在头发掉光之前能把这些东西捋顺。