平台虚拟化的好处不少。美国环境保护署(EPA)报告的一组有趣的统计数据就证实了其好处。EPA 研究服务器和数据中心的能源效率时发现,实际上服务器只有 5% 的时间是在工做的。在其余时间,服务器都处于 “休眠” 状态。在单个服务器上的虚拟化平台可以改善服务器的利用率,可是减小服务器的数量才是它的最大功用。减小服务器数量意味着减小不动资产、能耗、冷却和管理成本。使用更少的硬件还能提升可靠性。总之,平台虚拟化不只带来技术优点,还能创形成本和能源优点。 html
在图 1 中能够看到,hypervisor 是提供底层机器虚拟化的软件层(在某些状况下须要处理器支持)。并非全部虚拟化解决方案都是同样的,您能够在 参考资料 中了解更多的虚拟化方式。继续讨论进程,操做系统将对机器的底层资源的访问虚拟化为进程。hypervisor 也作同样的事情,但其对象不是进程,而是整个来宾操做系统。 linux
hypervisor 能够划分为两大类。首先是类型 1,这种 hypervisor 是直接运行在物理硬件之上的。其次是类型 2,这种 hypervisor 运行在另外一个操做系统(运行在物理硬件之上)中。类型 1 hypervisor 的一个例子是基于内核的虚拟机(KVM —— 它自己是一个基于操做系统的 hypervisor)。类型 2 hypervisor 包括 QEMU 和 WINE。 服务器
hypervisor 的构成 网络
hypervisor(不论是什么类型)仅是一个从其来宾操做系统抽象机器硬件的分层应用程序。经过这种方式,每一个来宾操做系统看到的仅是一个 VM 而不是真实的硬件机器。咱们大体看一下 hypervisor 的内部组成,以及它在 VM(来宾操做系统)上的表示。 架构
在较高级别上,hypervisor 须要少许设施启动来宾操做系统:一个须要驱动的内核映像、一个配置(好比 IP 地址和所需的内存量)、一个磁盘盒一个网络设备。磁盘和网络设备一般映射到机器的物理磁盘和网络设备(如图 2 所示)。最后,须要使用一组来宾操做系统工具启动和管理来宾操做系统。 jsp
而后,一个简化的 hypervisor 架构实现最后的关键功能,从而使来宾操做系统能够和宿主操做系统同时运行。实现这个功能须要一些特定的要素,如图 3 所示。首先,相似于将用户空间应用程序和内核函数链接起来的系统调用,一个一般可用的虚拟化调用(hapercall,hypervisor 对操做系统进行的系统调用)层容许来宾系统向宿主操做系统发出请求。能够在内核中虚拟化 I/O,或经过来宾操做系统的代码支持它。故障必须由 hypervisor 亲自处理,从而解决实际的故障,或将虚拟设备故障发送给来宾操做系统。hypervisor 还必须处理在来宾操做系统内部发生的异常。(毕竟,来宾操做系统发生的错误仅会中止该系统,而不会影响 hypervisor 或其余来宾操做系统)。hypervisor 的核心要素之一是页映射器,它将硬件指向特定操做系统(来宾或 hypervisor)的页。最后,须要使用一个高级别的调度器在hypervisor和来宾操做系统之间传输控制。 函数
图 3. 简化的基于 Linux 的hypervisorLinux hypervisor 工具
本文探索两个基于 Linux 的 hypervisor 解决方案。首先是 KVM,它是首个被集成到 Linux 内核的 hypervisor 解决方案,而且实现了完整的虚拟化。其次是 Lguest,这是一个实验 hypervisor,它经过少许的更改提升准虚拟化。 性能
KVM 针对运行在 x86 硬件硬件上的、驻留在内核中的虚拟化基础结构。KVM 是第一个成为原生 Linux 内核(2.6.20)的一部分的 hypervisor,它是由 Avi Kivity 开发和维护的,如今归 Red Hat 全部。
这个 hypervisor 提供 x86 虚拟化,同时拥有到 PowerPC® 和 IA64 的通道。另外,KVM 最近还添加了对对称多处理(SMP)主机(和来宾)的支持,而且支持企业级特性,好比活动迁移(容许来宾操做系统在物理服务器之间迁移)。
KVM 是做为内核模块实现的,所以 Linux 只要加载该模块就会成为一个hypervisor。KVM 为支持 hypervisor 指令的硬件平台提供完整的虚拟化(好比 Intel® Virtualization Technology [Intel VT] 或 AMD Virtualization [AMD-V] 产品)。KVM 还支持准虚拟化来宾操做系统,包括 Linux 和 Windows®。
这种技术由两个组件实现。第一个是可加载的 KVM 模块,当在 Linux 内核安装该模块以后,它就能够管理虚拟化硬件,并经过 /proc 文件系统公开其功能(见图 4)。第二个组件用于 PC 平台模拟,它是由修改版 QEMU 提供的。QEMU 做为用户空间进程执行,而且在来宾操做系统请求方面与内核协调。
当新的操做系统在 KVM 上启动时(经过一个称为 kvm 的实用程序),它就成为宿主操做系统的一个进程,所以就能够像其余进程同样调度它。但与传统的 Linux 进程不同,来宾操做系统被 hypervisor 标识为处于 “来宾” 模式(独立于内核和用户模式)。
每一个来宾操做系统都是经过 /dev/kvm 设备映射的,它们拥有本身的虚拟地址空间,该空间映射到主机内核的物理地址空间。如前所述,KVM 使用底层硬件的虚拟化支持来提供完整的(原生)虚拟化。I/O 请求经过主机内核映射到在主机上(hypervisor)执行的 QEMU 进程。
KVM 在 Linux 环境中以主机的方式运行,不过只要底层硬件虚拟化支持,它就可以支持大量的来宾操做系统。您能够在 参考资料 部分找一个到受支持的来宾操做系统的列表。
Lguest hypervisor 由澳大利亚 IBM 的 Rusty Russell 开发,它采用彻底不一样的方式实现虚拟化。Lguest 并无为运行任意操做系统提供完整的虚拟化支持,而是为支持 x86 的 Linux 来宾操做系统(也称为Linux-on-Linux 虚拟化)提供轻量级准虚拟化。这意味着来宾操做系统知道本身正在被虚拟化,而且这同时还会改进性能。可是,Lguest 不须要 QEMU 提供平台虚拟化(像在 KVM 中同样)来改进性能。使用 Lguest 这种方法还减小了总代码需求,仅需在来宾操做系统和宿主操做系统中使用一个瘦层。如今,咱们探索这些变化,并查看 Lguest 环境的高级别架构。
如图 5 所示,来宾操做系统包含一个 Lguest 代码瘦层(根据定义,就是准虚拟化)。这段代码提供许多服务。在最高的级别,有一些代码能够决定正在启动的内核是否被虚拟化。此外,还有一个经过虚拟化调用将特权操做发送给宿主操做系统的抽象层(经过 paravirt_ops 实现)。例如,来宾操做系统不能禁用中断,以使这些请求在宿主操做系统中执行。您还可找到一个为来宾操做系统实现设备抽象的总线,以及一组实现控制台、虚拟块驱动器和虚拟网络驱动器(容许与其余来宾通讯)的简单驱动器。
内核部分被实现为可加载的模块,即lg.ko。这个模块包含来宾操做系统通向宿主内核的接口。第一个组件是切换器,它实现一种方法,让来宾操做系统在执行时根据上下文进行切换。这个模块还实现 /proc 文件系统代码(针对 /dev/lguest),该代码实现到内核和驱动器(包括虚拟化调用)的用户空间接口。还有一些代码经过使用影子页表(shadow page-table)和管理 x86 区段来提供内存映射。
最后,内核中的 Documentation 子目录包含启动实用程序(lguest),用于启动新的来宾操做系统实例。这个文件负责两项任务,即便用和记录。
Lguest 从 2.6.23(2007 年 10 月)开始就成为主流内核,而且由 Rusty Russell 开发和维护。它大约包含 5000 行源代码,包括用户空间实用程序。尽管 Lguest 很简单(听说是这样的),但它能提供真正的准虚拟化。不过简单性每每与局限性相随。例如,Lguest 仅虚拟化其余支持 Lguest 的来宾操做系统,而且目前仅能用于 x86 架构。尽管存在这些限制,Lguest 仍然提供一种有趣的虚拟化方式,而且对任何但愿研究 Rusty 的代码的人员公开。
使用 Linux 做为内核开发 hypervisor 有实实在在的好处。最明显的是, 以 Linux 为基础开发 hypervisor 受益于稳步前进的 Linux,以及为改进 Linux 投入的大量工做。从典型的优化、bug 修复、调度和内存管理创新到支持不一样处理器架构,Linux 都是一个不断进步的平台(引自 Salisbury 市的 John 的 “站在巨人的肩膀上” 一文)。
不久前已经证实,经过向 KVM 添加一个内核模块,就能够将 Linux 内核转变为 hypervisor。Lguest 进一步改进了这种方法,而且经过受限制的准虚拟化进一步简化了该解决方案。
使用 Linux 做为平台的另外一个奇特好处是,除了能够将该平台用做 hypervisor 以外,您还能够将其用做操做系统。所以,除了能够在 Linux hypervisor 上运行多个来宾操做系统以外,您还能够在该级别上运行其余传统的应用程序。因此,没必要担忧带有新的应用编程接口(API)的新平台,由于您拥有用于开发应用程序的标准 Linux 平台(若是须要监控应用程序或 hypervisor)。标准协议(TCP/IP)和其余有用的应用程序(Web 服务器)和来宾操做系统都是可用的。回顾一下讨论 KVM 时的 图 4:除了来宾操做系统以外,还使用了修改了 KVM 的 QEMU。这是一个标准进程,并展现了 Linux 做为 hypervisor 的强大之处。KVM 在平台虚拟化中利用 QEMU,并使用 Linux 做为hypervisor,所以实现了这个构思,即让来宾操做系统可以和其余 Linux 应用程序协调执行。
在 hypervisor 开发的过程当中,hypervisor 就是新开辟的战场。3 年之前,操做系统是战场的主线,而且控制了一小部分据点。然而,今天战场已转移到 hypervisor,而且 Linux 担任一个明确的角色。
可是,也有声音反对使用 Linux 做为 hypervisor,而且最剧烈的批评来自于夸夸其谈的空论。在数年之前这种状况曾出如今嵌入式领域。今天,做为嵌入式操做系统的 Linux 已经是未曾止步的强者。可是咱们也有对付批评的办法,经过一些架构上的改进可让 Linux 成为最强大、最广泛和更灵活的操做系统。
学习
copy from:http://www.ibm.com/developerworks/cn/linux/l-hypervisor/