剖析 Linux hypervisor

图 1. 显示经常使用硬件虚拟化的简单分层架构
显示经常使用硬件虚拟化的简单分层架构  

平台虚拟化的好处不少。美国环境保护署(EPA)报告的一组有趣的统计数据就证实了其好处。EPA 研究服务器和数据中心的能源效率时发现,实际上服务器只有 5% 的时间是在工做的。在其余时间,服务器都处于 “休眠” 状态。在单个服务器上的虚拟化平台可以改善服务器的利用率,可是减小服务器的数量才是它的最大功用。减小服务器数量意味着减小不动资产、能耗、冷却和管理成本。使用更少的硬件还能提升可靠性。总之,平台虚拟化不只带来技术优点,还能创形成本和能源优点。 html

在图 1 中能够看到,hypervisor 是提供底层机器虚拟化的软件层(在某些状况下须要处理器支持)。并非全部虚拟化解决方案都是同样的,您能够在 参考资料 中了解更多的虚拟化方式。继续讨论进程,操做系统将对机器的底层资源的访问虚拟化为进程。hypervisor 也作同样的事情,但其对象不是进程,而是整个来宾操做系统。 linux

hypervisor 分类 编程

hypervisor 能够划分为两大类。首先是类型 1,这种 hypervisor 是直接运行在物理硬件之上的。其次是类型 2,这种 hypervisor 运行在另外一个操做系统(运行在物理硬件之上)中。类型 1 hypervisor 的一个例子是基于内核的虚拟机(KVM —— 它自己是一个基于操做系统的 hypervisor)。类型 2 hypervisor 包括 QEMU 和 WINE。 服务器

hypervisor 的构成 网络

hypervisor(不论是什么类型)仅是一个从其来宾操做系统抽象机器硬件的分层应用程序。经过这种方式,每一个来宾操做系统看到的仅是一个 VM 而不是真实的硬件机器。咱们大体看一下 hypervisor 的内部组成,以及它在 VM(来宾操做系统)上的表示。 架构

在较高级别上,hypervisor 须要少许设施启动来宾操做系统:一个须要驱动的内核映像、一个配置(好比 IP 地址和所需的内存量)、一个磁盘盒一个网络设备。磁盘和网络设备一般映射到机器的物理磁盘和网络设备(如图 2 所示)。最后,须要使用一组来宾操做系统工具启动和管理来宾操做系统。 jsp


图 2. 在假设 hypervisor 中的最小资源映射
在假设 hypervisor 中的最小资源映射  

而后,一个简化的 hypervisor 架构实现最后的关键功能,从而使来宾操做系统能够和宿主操做系统同时运行。实现这个功能须要一些特定的要素,如图 3 所示。首先,相似于将用户空间应用程序和内核函数链接起来的系统调用,一个一般可用的虚拟化调用(hapercall,hypervisor 对操做系统进行的系统调用)层容许来宾系统向宿主操做系统发出请求。能够在内核中虚拟化 I/O,或经过来宾操做系统的代码支持它。故障必须由 hypervisor 亲自处理,从而解决实际的故障,或将虚拟设备故障发送给来宾操做系统。hypervisor 还必须处理在来宾操做系统内部发生的异常。(毕竟,来宾操做系统发生的错误仅会中止该系统,而不会影响 hypervisor 或其余来宾操做系统)。hypervisor 的核心要素之一是页映射器,它将硬件指向特定操做系统(来宾或 hypervisor)的页。最后,须要使用一个高级别的调度器在hypervisor和来宾操做系统之间传输控制。 函数

图 3. 简化的基于 Linux 的hypervisor
简化的基于 Linux 的hypervisor  

Linux hypervisor 工具

本文探索两个基于 Linux 的 hypervisor 解决方案。首先是 KVM,它是首个被集成到 Linux 内核的 hypervisor 解决方案,而且实现了完整的虚拟化。其次是 Lguest,这是一个实验 hypervisor,它经过少许的更改提升准虚拟化。 性能

KVM

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 做为用户空间进程执行,而且在来宾操做系统请求方面与内核协调。


图 4. KVM hypervisor 的高级别视图
KVM hypervisor的高级别视图  

当新的操做系统在 KVM 上启动时(经过一个称为 kvm 的实用程序),它就成为宿主操做系统的一个进程,所以就能够像其余进程同样调度它。但与传统的 Linux 进程不同,来宾操做系统被 hypervisor 标识为处于 “来宾” 模式(独立于内核和用户模式)。

每一个来宾操做系统都是经过 /dev/kvm 设备映射的,它们拥有本身的虚拟地址空间,该空间映射到主机内核的物理地址空间。如前所述,KVM 使用底层硬件的虚拟化支持来提供完整的(原生)虚拟化。I/O 请求经过主机内核映射到在主机上(hypervisor)执行的 QEMU 进程。

KVM 在 Linux 环境中以主机的方式运行,不过只要底层硬件虚拟化支持,它就可以支持大量的来宾操做系统。您能够在 参考资料 部分找一个到受支持的来宾操做系统的列表。

Lguest(之前的 lhype)

Lguest hypervisor 由澳大利亚 IBM 的 Rusty Russell 开发,它采用彻底不一样的方式实现虚拟化。Lguest 并无为运行任意操做系统提供完整的虚拟化支持,而是为支持 x86 的 Linux 来宾操做系统(也称为Linux-on-Linux 虚拟化)提供轻量级准虚拟化。这意味着来宾操做系统知道本身正在被虚拟化,而且这同时还会改进性能。可是,Lguest 不须要 QEMU 提供平台虚拟化(像在 KVM 中同样)来改进性能。使用 Lguest 这种方法还减小了总代码需求,仅需在来宾操做系统和宿主操做系统中使用一个瘦层。如今,咱们探索这些变化,并查看 Lguest 环境的高级别架构。

如图 5 所示,来宾操做系统包含一个 Lguest 代码瘦层(根据定义,就是准虚拟化)。这段代码提供许多服务。在最高的级别,有一些代码能够决定正在启动的内核是否被虚拟化。此外,还有一个经过虚拟化调用将特权操做发送给宿主操做系统的抽象层(经过 paravirt_ops 实现)。例如,来宾操做系统不能禁用中断,以使这些请求在宿主操做系统中执行。您还可找到一个为来宾操做系统实现设备抽象的总线,以及一组实现控制台、虚拟块驱动器和虚拟网络驱动器(容许与其余来宾通讯)的简单驱动器。


图 5. 实现 x86 准虚拟化的 Lguest 的架构
实现 x86 准虚拟化的 Lguest 的架构  

内核部分被实现为可加载的模块,即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 为基础开发 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/

相关文章
相关标签/搜索