说起虚拟化,相信大家应该都不陌生,像虚拟内存、Java 虚拟机、Android 模拟器这些都是虚拟化技术的体现,为什么这样说,这个就要回到虚拟化技术的本质上——虚拟化就是由位于下层的软件模块,根据上层的软件模块的期待,抽象(虚拟)出一个虚拟的软件或硬件模块,使上一层软件直接运行在这个与自己期待完全一致的虚拟环境上。从这个意义上来看,虚拟化既可以是软件层的抽象,又可以是硬件层的抽象。
所以说,像虚拟内存、Java 虚拟机、Android 模拟器这些都属于是软件虚拟化技术,而硬件虚拟化技术更多的应用就是在云计算领域。从提出至今,虚拟化技术已经出现了多种实现方式,这些不同的方式其实就是软件和硬件的不同组合。本文主要就是对这些实现方式进行一个总览,形成一个总体认识,方便后面的学习。
VMM
VMM 全称是 Virtual Machine Monitor,虚拟机监控系统,也叫 Hypervisor,是虚拟化层的具体实现。主要是以软件的方式,实现一套和物理主机环境完全一样的虚拟环境,物理主机有的所有资源,包括 CPU、内存、网络 IO、设备 IO等等,它都有。这样的方式相当于 VMM 对物理主机的资源进行划分和隔离,使其可以充分利用资源供上层使用。虚拟出的资源以虚拟机的形式提供服务,一个虚拟机本质上和一台物理机没有什么区别,可以跑各种操作系统,在之上再跑各种应用。这种方式无疑是计算机历史上非常里程碑的一步,你想想,以前可能要买多台服务器才能解决的事,现在只用一台就解决了。
虚拟机通常叫做客户机(guest),物理机叫宿主机(host),VMM 处在中间层,既要负责对虚拟资源的管理,包括虚拟环境的调度,虚拟机之间的通信以及虚拟机的管理等,又要负责物理资源的管理,包括处理器、中断、内存、设备等的管理,此外,还要提供一些附加功能,包括定时器、安全机制、电源管理等。
VMM 分类
VMM 根据平台类型和实现结构有两种不同的分类,按平台类型可以分为完全虚拟化和类虚拟化,完全虚拟化就是 VMM 完全模拟出一个跟物理主机完全一样的环境。但是这个是非常困难的,首先,这需要硬件的支持,而硬件在初期设计的时候,没有那么远的前瞻性,可以预想到为虚拟化提供支持,前次,指令的复杂性,即使通过模拟的方式也很难做到全部指令都模拟。所以,就需要借助其他的一些技术来辅助虚拟化。
软件辅助虚拟化是通过优先级压缩(Ring Compression)和二进制代码翻译(Binary Translation)这两个技术来完成的。简单讲,RC 基于 CPU 特权级的原理,也就是 guest、VMM 和 host 分别处于不同的特权级上(这个后面讲 CPU 虚拟化的时候会详述),guest 要访问 host 就属于越级访问,会抛异常,这时 VMM 会截获这个异常,并模拟出其可能的行为,从而进行相应处理。但这个问题很明显,就是由于硬件设计的缺陷,有些指令并不能截获,从而导致“漏洞”。
BT 可以弥补这个缺陷,它通过去扫描 guest 的二进制的代码,将难以虚拟化的指令转为支持虚拟化的指令,从而可以配合 VMM 完成虚拟化功能。这两种方式都是通过「打补丁」的方式来辅助虚拟化,很难再架构上保证完整性。
所以,后期的硬件厂商就在硬件上对虚拟化提供了支持,有了硬件辅助的虚拟化。通过对硬件本身加入更多的虚拟化功能,就可以截获更多的敏感指令,填补上漏洞。在这一块,Intel 的 VT-x/d 技术和 AMD 的 AMD-V 技术是其中的代表。
而类虚拟化则是另外一种通过软件来避免漏洞的方式,就是通过修改 guest 操作系统内核代码(API 级)来避免漏洞,这种方式好处就是可以自定义内核的执行行为,某种程度上对性能进行优化。
上面这种分类仅供了解即可,重点掌握下面这种分类,就是根据 VMM 的实现结构分类,主要分类 Hypervisor 模型(1 型)和宿主模型(2 型)。
Hypervisor 模型中 VMM 既是操作系统,也是虚拟化软件,也就是集成了虚拟化功能的操作系统,对上为 guest 提供虚拟化功能,对下管理着所有物理资源,它的优点就是效率高,虚拟机的安全性只依赖于 VMM,缺点就是管理所有的物理资源,意味着 VMM 要承担很多的开发工作,特别是驱动层面的开发,我们知道硬件的 I/O 设备是很多的,这些设备都要有对应的驱动来设配才能为虚拟机提供功能。
宿主模型剥离了管理功能和虚拟化功能,虚拟化功能只是作为内核的一个模块来加载,比如 KVM 技术就是其中的佼佼者,KVM 技术可以说是云计算最核心的技术了,后面会经常用到。一般 KVM 只负责 CPU 和内存的虚拟化,I/O 的虚拟化则由另外一个技术来完成,即 Qemu。这些技术都是后面的重点,在这里只是提一下。
典型的虚拟化产品
-
VMware
VMware 可以说是虚拟化的鼻祖,现在很多公司都是在模仿 VMware 的产品,相应用过 VMware 虚拟机的朋友应该不陌生了,VMware 提供了很多的虚拟化产品,从服务器到桌面都有很多应用。主要有面向企业级应用的 ESX Server,面向服务端的入门级产品 VMware Server,面向桌面的主打产品 VMware Workstation(这个相信大家经常用),面向苹果系统的桌面产品 VMware Fusion,还有提供整套虚拟应用产品的 VMware vSphere,细分的话还有 VMware vStorage(虚拟存储),VMware vNet(虚拟网络)等。
-
Xen
Xen 是一款开源虚拟机软件,Xen 结合了 Hypervisor 模型和宿主模型,属于一种混合的虚拟化模型,基于 Xen 的虚拟化产品也有很多,比如 Ctrix、VirtualIron、RedHat 和 Novell 等都有相应的产品。这个一般是研究机构用得多一些,生产环境中大部分用的是 KVM。
-
KVM
KVM 也是一款开源软件,于 2007 年 2 月被集成到了 Linux 2.6.20 内核中,成为了内核的一部分。KVM 采用的是基于 Intel VT 的硬件辅助虚拟化技术,以及结合 Qemu 来提供设备虚拟化,从实现上看,属于宿主模型。使用 KVM 的厂商很多啊,像我们比较熟悉 VMware Workstation 和 VirtualBox 都在使用,在此就不一一列举了。文章来自于公众号Linux云就是网络。