大家好,又见面了,我是你们的朋友全栈君。
Linux hypervisor介绍
荣涛
2021年10月14日
管理程序对操作系统所做的事情就像操作系统对进程所做的大致相同。 它们为执行提供隔离的虚拟硬件平台,从而提供对底层机器的完全访问的错觉。 但并非所有的虚拟机管理程序都是一样的,这是一件好事,因为 Linux 是关于灵活性和选择的。 本文首先简要介绍虚拟化和管理程序,然后探讨几个基于 Linux 的管理程序。
平台虚拟化是关于在两个或多个操作系统之间共享一个平台,以便更有效地利用资源。 但平台不仅仅意味着处理器:它还包括构成平台的其他重要元素,包括存储、网络和其他硬件资源。 某些硬件资源可以轻松虚拟化,例如处理器或存储器,但其他硬件资源则不能,例如视频适配器或串行端口。 当共享不可能或没有用时,外围组件互连 (PCI) 直通提供了有效使用这些资源的方法。 本章探讨了直通的概念,讨论了它在管理程序中的实现,并详细介绍了支持这一最新创新的管理程序。
图片来源:Linux virtualization and PCI passthrough
图片来源:Linux virtualization and PCI passthrough
图片来源:Linux virtualization and PCI passthrough
图片来源:Linux virtualization and PCI passthrough
让我们先花一点时间了解为什么虚拟化很重要以及管理程序所扮演的角色。 (有关这两个主题的更多信息,请参阅资源部分。)
在本文的上下文中,虚拟化是隐藏底层物理硬件的过程,使其透明地可供多个操作系统使用和共享。 这种架构通常被称为平台虚拟化。 在典型的分层架构中,提供平台虚拟化的层称为管理程序(有时称为虚拟机监视器,或 VMM)。 客户操作系统的每个实例都称为虚拟机 (VM),因为对于这些 VM,硬件被虚拟化为专用于它们。 这种分层架构的简单说明如下图所示。
图片来源:Anatomy(剖析) of a Linux hypervisor 平台虚拟化的好处很多。 但美国环境保护署 (EPA) 报告的一项有趣的统计数据脱颖而出。 EPA 关于服务器和数据中心能效的研究发现,实际仅使用了大约 5% 的服务器容量。 其余时间,服务器处于休眠状态。 在单个服务器上虚拟化平台可以提高服务器利用率,但减少服务器数量的好处是一种力量倍增器。 随着服务器数量的减少,空间、功耗、冷却(能源成本降低)和管理成本也随之降低。 更少的硬件也意味着更高的可靠性。 总而言之,平台虚拟化带来的不仅是技术优势,还有成本和能源优势。
正如上图中看到的,管理程序是提供底层机器虚拟化(在某些情况下,具有处理器支持)的软件层。 并非所有虚拟化解决方案都是平等的,您可以在资源部分了解有关各种虚拟化风格的更多信息。 继续进程主题,操作系统将机器底层资源的访问虚拟化为进程。 管理程序做同样的事情,但它们不是进程,而是为整个客户操作系统完成这项任务。
管理程序可以分为两种不同的类型。
类型 1 管理程序的示例包括基于内核的虚拟机(KVM-它本身就是一个基于操作系统的管理程序)。 类型 2 管理程序的示例包括 QEMU 和 WINE。
因此,虚拟机管理程序(无论类型如何)只是一个分层的应用程序,它将机器硬件从其来宾中抽象出来。 通过这种方式,每个客户看到的是一个虚拟机,而不是真正的硬件。 现在让我们一般地看一下管理程序的内部结构以及它对 VM(来宾操作系统)的呈现。
在高层次上,管理程序需要少量项目来引导客户操作系统:要引导的内核映像、配置(例如 IP 地址和要使用的内存量)、磁盘和网络设备。 磁盘和网络设备通常映射到机器的物理磁盘和网络设备(如图2所示)。 最后,需要一组访客工具来启动访客并随后对其进行管理。
图片来源:Anatomy(剖析) of a Linux hypervisor 然后,简化的虚拟机管理程序架构实现了允许客户操作系统与主机操作系统同时运行的粘合剂。此功能需要一些特定元素,如上图所示。首先,类似于桥接用户空间应用程序与内核函数的系统调用,超级调用层通常可用,允许来宾向主机操作系统发出请求。输入/输出 (I/O) 可以在内核中虚拟化,也可以由客户操作系统中的代码辅助。中断必须由管理程序唯一处理,以处理实际中断或将虚拟设备的中断路由到客户操作系统。管理程序还必须处理来宾中发生的陷阱或异常。 (毕竟,来宾中的故障应该停止来宾而不是管理程序或其他来宾。)管理程序的核心元素是页面映射器,它将硬件指向特定操作系统(来宾或管理程序)的页面。最后,需要一个高级调度程序来在虚拟机管理程序和来宾操作系统之间(并返回)传输控制。
图片来源:Anatomy(剖析) of a Linux hypervisor
KVM主页https://www.linux-kvm.org/page/Main_Page。
KVM 是 x86 硬件上 Linux 的内核驻留虚拟化基础架构。 KVM 是第一个成为本机 Linux 内核 (2.6.20) 一部分的虚拟机管理程序,由 Avi Kivity 通过现在由 Red Hat 拥有的 Qumranet 初创公司开发和维护。
该虚拟机管理程序提供 x86 虚拟化,并在处理中提供到 PowerPC® 和 IA64 的端口。此外,KVM 最近增加了对对称多处理 (SMP) 主机(和来宾)的支持,并支持企业级功能,例如实时迁移(允许来宾操作系统在物理服务器之间迁移)。
KVM 是作为内核模块实现的,只需加载一个模块,Linux 就可以成为管理程序。 KVM 在提供管理程序指令支持的硬件平台上提供完全虚拟化(例如英特尔® 虚拟化技术 [Intel VT] 或 AMD 虚拟化 [AMD-V] 产品)。 KVM 还支持半虚拟化来宾,包括 Linux
和 Windows®
。
该技术作为两个组件实施。
/proc
文件系统公开其功能(参见下图)。图片来源:Anatomy(剖析) of a Linux hypervisor 当一个新的操作系统在 KVM 上启动时(通过一个名为 kvm 的实用程序),它成为主机操作系统的一个进程,因此可以像任何其他进程一样进行调度。 但与 Linux 中的传统进程不同,来宾操作系统被虚拟机管理程序识别为处于“来宾”模式(独立于内核和用户模式)。
每个客户操作系统都通过 /dev/kvm
设备映射,具有映射到主机内核物理地址空间的自己的虚拟地址空间。 如前所述,KVM 使用底层硬件的虚拟化支持来提供完整的(原生)虚拟化。 I/O 请求通过主机内核映射到在主机(管理程序)上执行的 QEMU 进程。
KVM 在 Linux 环境中作为主机运行,但支持大量的客户操作系统,提供底层硬件虚拟化支持。 您可以在资源部分找到支持的访客列表。
Lguest 管理程序由澳大利亚 IBM 的 Rusty Russell 开发,采用完全不同的虚拟化方法。 Lguest 不是为运行任意操作系统提供完整的虚拟化支持,而是为支持 Lguest 的 x86 Linux 来宾提供轻量级半虚拟化(也称为 Linux-on-Linux 虚拟化)。这意味着来宾操作系统知道它们正在被虚拟化,并且会伴随着性能的增强。然而,Lguest 提供了合理的性能,而无需 QEMU 提供平台虚拟化(就像 KVM 的情况)。 Lguest 方法还简化了整体代码要求,只需要在来宾和主机操作系统中都有一个薄层。现在让我们探索这些变化并回顾 Lguest 环境的高级架构。
如下图所示,客户操作系统包括一个薄层 Lguest 代码(根据定义,半虚拟化)。此代码提供了许多服务。在最高层,有代码来确定被引导的内核是否正在被虚拟化。还有一个抽象层(通过 paravirt_ops 实现)通过超级调用将特权操作路由到主机操作系统。例如,来宾不能禁用中断,因此这些请求在主机操作系统中执行。您还将找到为来宾实现设备抽象的总线以及一组实现控制台、虚拟块驱动程序和虚拟网络驱动程序(允许与其他来宾通信)的简单驱动程序。
图片来源:Anatomy(剖析) of a Linux hypervisor
内核方面是作为一个名为 lg.ko
的可加载模块实现的。该模块包含客户操作系统与主机内核的接口。第一个元素是切换器,它实现了来宾操作系统上下文切换以执行的方法。 /proc
文件系统代码(用于/dev/lguest
)也在这个模块中实现,它实现了内核和驱动程序的用户空间接口,包括超级调用。有代码通过使用影子页表和 x86 段管理来提供内存映射。
最后,内核中的 Documentation 子目录包含启动程序实用程序 (lguest),用于启动新的客户操作系统实例。该文件具有实用程序和文档双重作用。
Lguest 自 2.6.23(2007 年 10 月)以来一直在主线内核中,由 Rusty Russell 开发和维护。它由大约 5000 行代码组成,包括用户空间实用程序。虽然(据报道)很简单,但 Lguest 提供了真正的半虚拟化。然而,伴随这种简单性而来的是限制。例如,Lguest 仅虚拟化其他支持 Lguest 的客户操作系统,目前仅适用于 x86 架构。但即使有这些限制,Lguest 还是提供了一种有趣的虚拟化方法,任何愿意研究 Rusty 代码的人都可以访问它。
Copyright (C) CESTC Com.
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/190837.html原文链接:https://javaforall.cn