将多个“同质或异构”资源(包括但不限于芯片、硬件、软件、应用)形成一个资源池,对资源池进行抽象、解耦形成独立的“虚拟资源”,并实现虚拟资源之间隔离,从而提升资源利用率、业务运营效率。
本文介绍内容主要是基于单个物理机进行虚拟化的角度进行介绍。
虚拟化的层次架构,按照从物理机到虚拟机操作系统,可以分为5层,如图:
虚拟化的架构分为2种:
上图左边是裸金属架构的逻辑示意图,右边是寄居架构的逻辑示意图。
现在主流的虚拟化技术有:CPU虚拟化、内存虚拟化、IO虚拟化、网络虚拟化。
CPU虚拟化是指在一台物理计算机上,通过软件模拟出多台虚拟计算机的CPU计算资源,每台虚拟计算机都可以运行自己的操作系统和应用程序,就像在多台独立的物理计算机上一样。
CPU虚拟化的多种虚拟化方式包括全虚拟化、半虚拟化(或称为准虚拟化)和硬件辅助虚拟化。
CPU全虚拟化是指在虚拟机中运行的操作系统无需对硬件进行任何修改,就可以直接运行。
在这种模式下,虚拟机监控程序(Hypervisor)会拦截虚拟机中的所有指令,并将其翻译成对底层硬件的访问。这种模式的优点是可以运行未经修改的操作系统,但缺点是由于需要翻译指令,因此性能较低。
要实现CPU全虚拟化有三种方式:陷入模-模拟仿真技术、二进制翻译技术、纯软件模拟。
最先实现CPU全虚拟化技术的是陷入-模拟仿真技术。
CPU中有一些操作和管理关键系统资源的指令,这些指令只有在最高特权级上能够正确运行,如果在非最高特权级上运行,特权指令会引发一个异常,处理器会陷入到最高特权级,交由系统软件处理。
对硬件设备访问的陷入模式和模拟仿真技术,就是利用这个机制,以X86架构CPU为例,这种技术将运行在ring1或ring3的guestOS的特权指令通过陷入机制被Hypervisor自动捕获,然后由Hypervisor执行,执行后返回给guestOS,这种捕获机制无需guestos进行修改。
CPU的指令中存在着2种特殊的指令–特权指令和敏感指令:
x86架构的CPU中,不支持硬件辅助虚拟化技术的X86架构下的CPU有4个特权级(ring0~ring3),操作系统是处于最高级别的ring0,应用程序处于最低级别的ring3。x86绝大多数的敏感指令是特权指令,但是存在部分敏感指令不是特权指令,执行这些指令的时候不会自动trap被Hypervisor捕获,所以并不能完全的解决掉那些不是特权指令的敏感指令的模拟仿真问题,这种模拟仿真技术固有的缺陷,导致对X86架构的CPU的虚拟化并不完整。
为了解决这个问题,业界(如VMware)通过二进制翻译技术(Binary Translation)完成了对x86 CPU架构的完全虚拟。
二进制翻译技术方式下,Guest OS的核心指令无法直接下达到计算机系统硬件执行,而是需要经过Hypervisor的捕获和模拟执行(部分难以虚拟化的指令需要通过二进制翻译【Binary Translation】技术进行转换)。
二进制翻译技术简 称BT,是一种直接翻译可执行二进制程序的技术,能够把一种处理器上的二进制程序翻译到另外一种处理器上执 行。二进制翻译技术将机器代码从源机器平台映射(翻译)至目标机器平台,包括指令语义与硬件资源的映射,使源 机器平台上的代码“适应”目标平台。因此翻译后的代码更适应目标机器,具有更高的运行时效率。
二进制翻译系统是位于应用程序和计算机硬件之间的一个软件层,它很好地降低了应用程序和底层硬件之间的耦合度,使得二者可以相对独立地发展和变化。
二进制翻译也是一种编译技术,它与传统编译的差别在于其编译处理对象不同。传统编译处理的对象是某一种高级语言,经过编译处理生成某种机器的目标代码;二进制翻译处理的对象是某种机器的二进制代码,该二进制代码是通过传统编译过程生成的,经过二进制翻译处理后生成另一种机器的二进制代码。
纯软件模拟是一种CPU全虚拟化的方式,它通过软件模拟整个硬件系统,包括CPU、内存、I/O设备等。这种方式可以在任何平台上运行,不受硬件限制。
纯软件模拟的机制是这样的:在虚拟化场景中,Hypervisor通过软件模拟CPU的行为,包括执行指令、访问内存和I/O操作等。当虚拟机guestos执行特权指令时,Hypervisor会捕获这些指令并模拟执行,然后将结果返回给虚拟机。这种方式可以实现CPU的全虚拟化,但是性能相对较低,因为需要模拟整个硬件系统的行为。
相比之下,陷入模式-模拟仿真技术和二进制翻译技术都是针对特定硬件平台进行优化的虚拟化技术,可以提供更高的性能。其中,陷入模式-模拟仿真技术通过将虚拟机中的特权指令捕获并模拟执行,而二进制翻译技术则通过将虚拟机的指令翻译成可以在物理机上执行的指令来实现虚拟化。
CPU半虚拟化需要修改guestos的内核,guestos通过Hypercall来调用特权指令。
Hypercall是一种由虚拟机监控器(Hypervisor)提供的超级调用,允许虚拟机guestos直接向Hypervisor发起特定的请求。当虚拟机guestos需要调用特权指令时,它会通过Hypercall向Hypervisor发起请求。Hypervisor接收到Hypercall后,会继续处理这个请求,并将结果返回给虚拟机。这种方式避免了虚拟机直接执行特权指令,从而提高了系统的安全性。
Hypercall机制支持同步和异步两种调用方式。同步调用方式是指guestos等待Hypervisor处理完请求并返回结果;而异步调用方式则是指guestos不必等待结果返回,可以继续执行其他任务。
Hypercall机制是CPU半虚拟化技术中的重要组成部分,它实现了guestos与Hypervisor之间的通信,提高了系统的安全性和性能。
硬件辅助虚拟化是指利用CPU硬件的虚拟化支持,提高虚拟机的性能和安全性。
CPU硬件辅助虚拟化通过在硬件级别上提供对虚拟化的支持,使得虚拟机监视器(Hypervisor)能够更高效地管理虚拟机的执行。这种机制可以改善在虚拟化环境中运行的性能,同时增强系统的安全性。
硬件辅助虚拟化机制的CPU新增一种VMX root的运行模式,这种模式新增了支持虚拟化的指令,这种模式下guestos运行ring0,guestos发出的特权指令和敏感指令被VMX root模式下的Hypervisor捕获和处理。
内存虚拟化是一种抽象技术,它通过隐藏物理内存细节,将虚拟内存呈现给虚拟机,实现了一种抽象的内存访问方式。这种技术可以使得每个虚拟机都认为自己独占了从0开始连续的整个内存空间,这个空间成为客户机物理地址空间(Guest Physical Address,简称GPA),而实际上它们只能访问到分配给它们的宿主机的部分内存,这部分宿主机内存可能并不是连续的。
具体来说,当虚机进程需要访问GPA内存时,根据这个地址GPA内存的偏移量获得对应的宿主机虚拟地址,通过宿主机的页表查找到宿主机虚拟地址到物理地址的映射关系,从而实现guestos的内存访问到宿主机的内存访问。
内存气泡技术是一种内存管理技术,它通过虚拟化平台主动回收一些暂时没用上的物理内存,然后分配给需要复用内存的虚拟机使用。
具体来说,当虚拟机创建时,会根据其规格分配一定的内存空间。但在运行过程中,如果虚拟机并没有完全使用其分配的内存空间,那么这部分未使用的内存就被称为内存气泡。内存气泡可以被虚拟化平台识别并回收,然后重新分配给其他需要更多内存的虚拟机使用。
这种技术可以有效地提高内存的利用率,并使得虚拟机能够更灵活地适应不同的内存需求。同时,由于内存气泡的回收和重新分配都是自动完成的,因此也减少了人工干预的麻烦。
零页共享机制是一种内存虚拟化的实现方式,它允许不同的虚拟机共享相同的内存页面,从而节省内存资源。
在零页共享机制中,虚拟机监控器会定时扫描虚拟机的内存数据,如果发现数据内容全为零,就会通过修改PA to MA映射的形式,把其指向一个特定的零页。这样,在物理内存中只保留一份零页拷贝,所有的虚拟机的零页都指向这个零页。
当零页数据发生变动时,Hypervisor会动态分配一页内存给虚拟机,存放修改后的数据。对于GuestOS(客户操作系统)来说,整个零页共享技术是完全不感知的。
除了华为FusionCompute的零页共享技术,VMware的ESX解决方案中也有同样的技术。当对某一个虚拟机进行页面共享扫描时,Hypervisor会针对该虚拟机物理页面的数据计算散列值,并在全局散列表中进行遍历及匹配是否有相同的散列值的表项。
内存虚拟化的内存交换机制是一种在虚拟机和物理机之间进行内存资源共享和管理的技术。通过内存交换机制,虚拟机可以像使用普通内存一样使用虚拟内存,同时物理机也可以对虚拟机进行管理和监控。
内存交换机制下,虚拟机的内存被分成多个页,每个页的大小与物理机的页大小相同。当虚拟机需要使用更多的内存时,物理机会将一些不常用的页保存到磁盘上,以便为虚拟机腾出更多的物理内存空间。当虚拟机需要访问这些页时,物理机会将它们从磁盘上加载回物理内存中。
Hypervisor通过I/O虚拟化来复用有限的外设资源,Hypervisor截获guestos的I/O设备访问请求,然后通过软件模拟真实硬件实现I/O虚拟化。
I/O虚拟化与CPU虚拟化一样也分为全虚拟化、半虚拟化(准虚拟化)和硬件辅助虚拟化,其实现方式与类似。
网络虚拟化是一种在一个物理网络上模拟出多个逻辑网络的技术。它允许远程用户访问组织的内部网络,就像物理上连接到该网络一样。此外,它还通过抽象网络连接的概念来实现安全、稳定的隧道,以便对数据进行加密和保护。
网络虚拟化要达到如下三个目标:
桥接:将虚拟机的网卡桥接到宿主机的网卡上,提供近似于实际物理网络的性能,同一个物理机的虚拟机网络桥接到宿主机同一网卡时,相互之间以及与宿主机之间网络是互通的,如图:
NAT网关:这种方式下,虚拟机相当于运行在内网的机器,宿主机相当于NAT服务器,这种模式下,同一个宿主机的虚拟机之间网络连通,但虚拟机和宿主机的网络隔离
虚拟机生命周期包括以下阶段:
虚拟机迁移是在不同物理机之间迁移虚拟机,主要用于容错管理、负载均衡和系统维护。
虚拟机迁移的两个衡量指标:
虚拟机迁移的内存三阶段主要包括以下步骤:
Xen的Hypervisor是服务器经过BIOS启动之后载入的首个程序,然后启动一个具有特定权限的虚拟机,称之为Domain0(简称Dom0)。
Dom0的操作系统可以是Linux或Unix,Domain0实现对Hypervisor控制和管理功能。在所承载的虚拟机中,Dom0是唯一可以直接访问物理硬件(如存储和网卡)的虚拟机,它通过本身加载的物理驱动,为其它虚拟机(DomainU,简称DomU)提供访问存储和网卡的桥梁。
KVM是一个基于Linux内核的虚拟机,它属于完全虚拟化范畴,从Linux-2.6.20开始被包含在Linux内核中。
KVM基于x86硬件虚拟化技术,它的运行要求Intel VT-x或AMD SVM的支持。KVM的实现采用宿主机模型(Host-based),由于KVM是集成在Linux内核中的,因此可以自然地使用Linux内核提供的内存管理、多处理器支持等功能,易于实现,而且还可以随着Linux内核的发展而发展。
KVM主要用于管理CPU和内存的虚拟化,所有I/O虚拟化工作是借助Qemu完成的,也显著地降低了实现的工作量。以上可以说是KVM的优势所在。
QEMU是一种纯软件实现的虚拟化解决方案,能模拟整套虚拟机的实现。KVM与QEMU混合实现的虚拟机逻辑架构如下:
本文介绍了基于单个物理机进行虚拟化的虚拟化技术原理、架构层次,虚拟化有裸金属和寄居架构两种架构种类,虚拟化技术分为全虚拟化、半虚拟化和硬件辅助虚拟化三种,物理机虚拟化关键技术包括CPU虚拟化、内存虚拟化、I/O虚拟化、网络虚拟化以及虚拟机的迁移和声明周期管理。
分析关于CPU的三种虚拟化机制(三)
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。