在本文中,我们将首先概述在 20 世纪 70 年代发明的经典陷入 - 模拟(trap-and-emulate )的Hypervisor架构,然后讲述从上世纪 70 年代一直发展到现在云计算时代的Hypervisor技术脉络,最后我们来看看影响Hypervisor设计的未来趋势。 (作者注:本文的灵感来自于Anthony Liguori为AWS的Nitro项目所做的演讲,这也是我极力推荐的,任何对Hypervisor和云基础设施感兴趣的人都应该看看这个视频。) 架构 Hypervisor是一组系统软件,能够提供虚拟机(VM),以供用户来运行他们自己的操作系统和应用程序。Hypervisor提供虚拟机之间的隔离技术,从而使得这些虚拟机彼此独立运行成为可能,而且这些虚拟机可以运行不同的操作系统,和其它的虚拟化技术一样,Hypervisor也提供多租户的实现,从而简化了虚拟机的提供和管理。 目前人们诟病Hypervisor的一个主要原因,是其相比于诸如容器这样的虚拟化技术,显得有点太过繁重(Morabito et al., 2015)。然而,技术从来都不是一成不变的,Hypervisor本身也是在进化的,Hypervisor也可以是非常轻量级的(Manco et al., 2017),而且可以让运行在Hypervisor中的客户操作系统非常的轻量级(Madhavapeddy, 2013)。 Hypervisor可以分解为两部分: 虚拟机监视器 (VMM) 和设备模型。VMM 响应设置虚拟机和掌控由客户操作系统执行诸如I/O访问的特权指令引发的陷阱(即虚拟机出口),设备模型,负责实现所有设备(如网卡,存储设备等)的 I/O 接口。Hypervisor的体系结构如下图所示: (术语Hypervisor和VMM经常可以互换,但是,更为严谨的说法是Hypervisor 由VMM和设备模型组成。) 虚拟机监视器 (VMM) VMM必须满足三个属性(Popek and Goldberg, 1973):
作为一个侧面说明,值得注意的是,仿真器同时满足等价性和资源控制,但不满足效率。Linux内核所实现的KVM子系统,(当然其它操作系统也将 KVM 移植了),就为实现VMM而提供了构建块,KVM子系统实际上是对CPU硬件虚拟化功能的一种友好的抽象,它能够被诸如QEUM这样的用户态应用很好的利用,从而实现VMM的功能以及一个全栈的Hypervisor。 设备模型 若要实现设备模型,就需要I/O虚拟化,而对于I/O虚拟化的实现来说则有两种模式:基于软件和硬件辅助。 基于软件的I/O虚拟化的实现是能够让多个虚拟机可以共享同一个物理设备的软件I/O接口。基于软件的I/O虚拟化的具体实现则可以有多个后端,举例来说,一个基于软件的存储设备既可以基于块设备,也可以基于文件系统。当然,这种实现的方式的缺陷就是所有的vCPU使用的都是同一个CPU资源,这会降低CPU的可用能力,并会引起抖动。 硬件辅助的I/O虚拟化则是在硬件层实现了I/O接口,此方法需要硬件能够支持多个虚拟机可共享访问物理设备。SRV-IO是PCI的扩展,其允许将物理的 PCI功能分割为多个虚拟的PCI功能。 演化 在上世纪 70 年代,VMM的陷入 - 模拟模式被得到了正式的认可(Popek and Goldberg, 1973),但直到 90 年代中期才流行起来,用于在多核的机器上运行商业操作系统(Bugnion et al., 1997)。然而,当年最受欢迎的机器架构是英特尔的 X86,是没有虚拟化功能的,因为其在一些特权声明没有陷入(trap)功能。 在 1999 年,一家叫做VMware的公司做了一款Hypervisor, 它的目标就是在 X86下运行虚拟化。但是它实现的方式是使用二进制翻译,而不是指令的陷入,同时仍然直接在物理CPU上运行无特权的指令,解决了x86的虚拟化问题(Adams and Agesen, 2006),这使得VMware虚拟机管理程序可以在虚拟机的 x86 硬件上运行未修改的商业操作系统,而不会影响性能。 在 2003 年,又出现了叫做Xen的Hypervisor,它使用了完全不同的方法来解决X86的虚拟化问题,放弃了二进制翻译的做法,而是修改了客户操作系统的源代码来陷入到Hypervisor 中,以代替执行非陷入特权指令。 随后,英特尔和AMD分别在 2005 和 2006 年先后发布了带有虚拟化扩展的 X86架构的CPU,这又使得经典的陷入 - 模拟模式成为了可能。而且又一项技术出现了,那就是KVM,最初是为Linux而开发的,其作为Linux内核的一个子系统,与QEMU的设备模式协作,共同构成了完整的Hypervisor。最初,KVM项目提供的基于软件的设备模式从而模拟完整的硬件设备,后来又引入了virtio机制,从而实现了半虚拟化I/O设备模型。 未来 Hypervisor经历如此多年的广泛应用及发展,已经通过了考验,但是我们也要考虑其在未来发展的一些趋势和可能。
总结 Hypervisors是上世纪 70 年代所发明的技术,将近 50 年的时间,验证了其实用性,X86的架构特点只能意味着第一个成功的Hypervisor不得不借助于二进制翻译来处理特权指令。二进制翻译之后又演化出半虚拟化(由Xen得到了很大的推广),再之后则是英特尔和AMD为x86架构增加了虚拟化的扩展,从而实现了Hypervisor整合到了经典的模式。 尽管近年来容器技术成为炙手可热的虚拟化技术,甚至像诸如serverless这样的新兴计算模式更是让Hypervisor再度成为有吸引力的技术,轻量级Hypervisor的设计、unikernels、以及硬件辅助虚拟化,所有这些都在减少Hypervisor 的开销,这一切都使得Hypervisor 相对容器更具竞争力。 |
|
来自: Read_He > 《Hypervisor》