x86平台上虚拟化方式是可以分为以下几种方式
1 软件模拟的方式
软件模拟是通过程序模拟cpu,芯片组,磁盘,网卡,等等。
因为是软件模拟,所以理论上可以模拟任何的硬件,甚至是不存在的硬件,但是这种方式因为全部是软件模拟硬件,所以非常低效,一般只用于研究测试的场景。典型产品有Bochs,QEMU等。
2 虚拟化层翻译
先介绍下x86平台的指令集权限划分,x86平台指令集划分为4个特权模式,ring0,ring1,ring2,ring3,操作系统一般使用ring0级别,应用程序使用ring3级别,驱动程序使用ring1,ring2级别,x86平台在虚拟化的一个难点就是如何将虚拟机越级的指令使用进行隔离。
VMWare找到了找到了最早的解决方法,就是对虚拟机指令的使用进行捕获和翻译。
通过虚拟化引擎,捕获虚拟机的指令,并进行处理,这也是为什么在虚拟机上虽然使用的是物理机一样的指令,但是虚拟机不能对硬件进行操作的原因,比如重启虚拟机不会引起宿主机的重启。这种解决方案也叫软件全虚拟化方案。
3 改造虚拟机操作系统的方式
通过虚拟化引擎进行指令捕获和翻译的方式虽然可行,但是在虚拟化层要做大量的工作,XEN找到了另外一种方式,就是对虚拟机的操作系统进行改造,使虚拟机自己对特殊的指令进行更改,然后和虚拟化层一起配合工作,这也是XEN早期一直要使用一个特殊内核的原因。改造虚拟机虽然使用的时候,配置比较麻烦,但是这种方式效率非常高,这种方式也被称为半虚拟化方案。
4 对CPU指令进行改造
2005年的时候,Intel推出了硬件的方案,就是vt-x,对cpu指令进行改造,VT-x 增加了两种操作模式:VMX root operation 和 VMX non-root operation。VMM 运行在 VMX root operation 模式,虚拟机运行在VMX non-root operation 模式。两种操作模式都支持 Ring 0 ~ Ring 3 这 4 个特权级。
这种方案因为是基于硬件的,所以效率非常高,这种方案也称为硬件支持的全虚拟化方案。
现在的一个发展趋势是不光是cpu指令有硬件解决方案,I/O通讯也有硬件解决方案,称为vt-d,网络通许也有硬件解决方案,称为vt-c。
所以当前的虚拟化引擎,都是使用硬件支持的虚拟化解决方案。并且最新的操作系统一般都支持一些半虚拟化的特性,所以宿主机和虚拟机使用比较新的版本,性能也会好一些。
5 容器虚拟化
容器虚拟化原理是基于cgroup,namespace等技术将进行隔离,每个进程就像一台单独的虚拟机一样,有自己被隔离出来的资源,有自己的根目录,自己的进程编号,自己的内存空间。基于容器的虚拟化可以实现在单一内核上运行多个实例,因此是一个更高效率的虚拟化方式。目前最热的容器虚拟化技术就是docker,docker最方便的地方是可以将一个开发环境进行打包,很方便的在另外一个系统上跑起来,并且有版本的概念,可以在前一个版本的基础上累加。但是docker在生产环境的使用还需要一个过程,主要是性能上满足不了要求。