![](https://i-blog.csdnimg.cn/blog_migrate/71d9f5e131a4586f37d9721c0d9291fd.png)
☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython
一、虚拟化原理
将多个“同质或异构”资源(包括但不限于芯片、硬件、软件、应用)形成一个资源池,对资源池进行抽象、解耦形成独立的“虚拟资源”,并实现虚拟资源之间隔离,从而提升资源利用率、业务运营效率。
本文介绍内容主要是基于单个物理机进行虚拟化的角度进行介绍。
二、虚拟化特征
三、虚拟化的架构层次及架构种类
虚拟化的层次架构,按照从物理机到虚拟机操作系统,可以分为5层,如图:
虚拟化的架构分为2种:
- 裸金属架构(Bare-Metal):也称原生架构,Hypervisor直接运行在物理机上,其下没有宿主机的单独操作系统,老猿认为也可以理解为宿主机的操作系统就是Hypervisor,典型的样例如VMware ESX、Xen、微软的Hyper-V;
- 寄居架构(Hosted):Hypervisor直接运行在宿主机的操作系统上,很多虚拟化功能依赖于宿主机操作系统或专门的硬件功能,典型的样例如VMware workstation、KVM、QMenu、VirtualBox。
上图左边是裸金属架构的逻辑示意图,右边是寄居架构的逻辑示意图。
三、虚拟化方式
- 全虚拟化(Full Virtualization ):Hypervisor负责所有虚拟化工作,客户机操作系统不需要修改,国内应用广泛的VMware workstation就是全虚拟化的(VMWare 在 1999 年开始销售 VMWare workstation, 2001 年VMWare 又发行了 ESX 和 GSX),其优点是对gustos是透明的,缺点就是性能慢;
- 准虚拟化(Para-Virtualization ):又称为半虚拟化,gustos需要修改,并感知底层虚拟化环境,与Hypervisor配合完成虚拟化工作,Xen就是典型的半虚拟化,特点是guestos需要配套修改,不适合windows这类闭源的操作系统,优点是性能相比全虚拟化有所提升;
- 硬件辅助虚拟化(Hardware-Assisted Virtualization ):借助于某些特别设计的CPU或硬件改进虚拟化的性能,如Intel VT-X/AMD-V,应用广泛的Linux KVM就是硬件辅助虚拟化的典型样例。其特点是无需修改guestos,性能高,但需要硬件支持。
四、虚拟化关键技术
现在主流的虚拟化技术有:CPU虚拟化、内存虚拟化、IO虚拟化、网络虚拟化。
4.1、CPU虚拟化
CPU虚拟化是指在一台物理计算机上,通过软件模拟出多台虚拟计算机的CPU计算资源,每台虚拟计算机都可以运行自己的操作系统和应用程序,就像在多台独立的物理计算机上一样。
CPU虚拟化的多种虚拟化方式包括全虚拟化、半虚拟化(或称为准虚拟化)和硬件辅助虚拟化。
4.1.1、全虚拟化
4.1.1.1、CPU全虚拟化概念
CPU全虚拟化是指在虚拟机中运行的操作系统无需对硬件进行任何修改,就可以直接运行。
在这种模式下,虚拟机监控程序(Hypervisor)会拦截虚拟机中的所有指令,并将其翻译成对底层硬件的访问。这种模式的优点是可以运行未经修改的操作系统,但缺点是由于需要翻译指令,因此性能较低。
4.1.1.2、CPU全虚拟化原理
要实现CPU全虚拟化有三种方式:陷入模-模拟仿真技术、二进制翻译技术、纯软件模拟。
4.1.1.2.1、 陷入- 模拟仿真技术(Trap-and-emulation)
最先实现CPU全虚拟化技术的是陷入-模拟仿真技术。
CPU中有一些操作和管理关键系统资源的指令,这些指令只有在最高特权级上能够正确运行,如果在非最高特权级上运行,特权指令会引发一个异常,处理器会陷入到最高特权级,交由系统软件处理。
对硬件设备访问的陷入模式和模拟仿真技术,就是利用这个机制,以X86架构CPU为例,这种技术将运行在ring1或ring3的guestOS的特权指令通过陷入机制被Hypervisor自动捕获,然后由Hypervisor执行,执行后返回给guestOS,这种捕获机制无需guestos进行修改。
4.1.1.2.2. 二进制翻译技术
CPU的指令中存在着2种特殊的指令–特权指令和敏感指令:
- 特权指令:系统中有一些操作和管理关键系统资源的指令,这些指令只有在最高特权级上能够正确运行;
- 敏感指令:操作特权资源的指令,包括修改虚拟机的运行模式或者下面物理机的状态;读写时钟、中断等寄存器;访问存储保护系统、地址重定位系统及所有的I/O指令。
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,是一种直接翻译可执行二进制程序的技术,能够把一种处理器上的二进制程序翻译到另外一种处理器上执 行。二进制翻译技术将机器代码从源机器平台映射(翻译)至目标机器平台,包括指令语义与硬件资源的映射,使源 机器平台上的代码“适应”目标平台。因此翻译后的代码更适应目标机器,具有更高的运行时效率。
二进制翻译系统是位于应用程序和计算机硬件之间的一个软件层,它很好地降低了应用程序和底层硬件之间的耦合度,使得二者可以相对独立地发展和变化。
二进制翻译也是一种编译技术,它与传统编译的差别在于其编译处理对象不同。传统编译处理的对象是某一种高级语言,经过编译处理生成某种机器的目标代码;二进制翻译处理的对象是某种机器的二进制代码,该二进制代码是通过传统编译过程生成的,经过二进制翻译处理后生成另一种机器的二进制代码。
4.1.1.2.3、纯软件模拟
纯软件模拟是一种CPU全虚拟化的方式,它通过软件模拟整个硬件系统,包括CPU、内存、I/O设备等。这种方式可以在任何平台上运行,不受硬件限制。
纯软件模拟的机制是这样的:在虚拟化场景中,Hypervisor通过软件模拟CPU的行为,包括执行指令、访问内存和I/O操作等。当虚拟机guestos执行特权指令时,Hypervisor会捕获这些指令并模拟执行,然后将结果返回给虚拟机。这种方式可以实现CPU的全虚拟化,但是性能相对较低,因为需要模拟整个硬件系统的行为。
相比之下,陷入模式-模拟仿真技术和二进制翻译技术都是针对特定硬件平台进行优化的虚拟化技术,可以提供更高的性能。其中,陷入模式-模拟仿真技术通过将虚拟机中的特权指令捕获并模拟执行,而二进制翻译技术则通过将虚拟机的指令翻译成可以在物理机上执行的指令来实现虚拟化。
4.1.2、CPU半虚拟化
CPU半虚拟化需要修改guestos的内核,guestos通过Hypercall来调用特权指令。
Hypercall是一种由虚拟机监控器(Hypervisor)提供的超级调用,允许虚拟机guestos直接向Hypervisor发起特定的请求。当虚拟机guestos需要调用特权指令时,它会通过Hypercall向Hypervisor发起请求。Hypervisor接收到Hypercall后,会继续处理这个请求,并将结果返回给虚拟机。这种方式避免了虚拟机直接执行特权指令,从而提高了系统的安全性。
Hypercall机制支持同步和异步两种调用方式。同步调用方式是指guestos等待Hypervisor处理完请求并返回结果;而异步调用方式则是指guestos不必等待结果返回,可以继续执行其他任务。
Hypercall机制是CPU半虚拟化技术中的重要组成部分,它实现了guestos与Hypervisor之间的通信,提高了系统的安全性和性能。
4.1.3、CPU硬件辅助虚拟化
硬件辅助虚拟化是指利用CPU硬件的虚拟化支持,提高虚拟机的性能和安全性。
CPU硬件辅助虚拟化通过在硬件级别上提供对虚拟化的支持,使得虚拟机监视器(Hypervisor)能够更高效地管理虚拟机的执行。这种机制可以改善在虚拟化环境中运行的性能,同时增强系统的安全性。
硬件辅助虚拟化机制的CPU新增一种VMX root的运行模式,这种模式新增了支持虚拟化的指令,这种模式下guestos运行ring0,guestos发出的特权指令和敏感指令被VMX root模式下的Hypervisor捕获和处理。
4.2、内存虚拟化
4.2.1、内存虚拟化技术介绍
内存虚拟化是一种抽象技术,它通过隐藏物理内存细节,将虚拟内存呈现给虚拟机,实现了一种抽象的内存访问方式。这种技术可以使得每个虚拟机都认为自己独占了从0开始连续的整个内存空间,这个空间成为客户机物理地址空间(Guest Physical Address,简称GPA),而实际上它们只能访问到分配给它们的宿主机的部分内存,这部分宿主机内存可能并不是连续的。
具体来说,当虚机进程需要访问GPA内存时,根据这个地址GPA内存的偏移量获得对应的宿主机虚拟地址,通过宿主机的页表查找到宿主机虚拟地址到物理地址的映射关系,从而实现guestos的内存访问到宿主机的内存访问。
4.2.2、内存气泡技术
内存气泡技术是一种内存管理技术,它通过虚拟化平台主动回收一些暂时没用上的物理内存,然后分配给需要复用内存的虚拟机使用。
具体来说,当虚拟机创建时,会根据其规格分配一定的内存空间。但在运行过程中,如果虚拟机并没有完全使用其分配的内存空间,那么这部分未使用的内存就被称为内存气泡。内存气泡可以被虚拟化平台识别并回收,然后重新分配给其他需要更多内存的虚拟机使用。
这种技术可以有效地提高内存的利用率,并使得虚拟机能够更灵活地适应不同的内存需求。同时,由于内存气泡的回收和重新分配都是自动完成的,因此也减少了人工干预的麻烦。
4.2.3、零页共享
零页共享机制是一种内存虚拟化的实现方式,它允许不同的虚拟机共享相同的内存页面,从而节省内存资源。
在零页共享机制中,虚拟机监控器会定时扫描虚拟机的内存数据,如果发现数据内容全为零,就会通过修改PA to MA映射的形式,把其指向一个特定的零页。这样,在物理内存中只保留一份零页拷贝,所有的虚拟机的零页都指向这个零页。
当零页数据发生变动时,Hypervisor会动态分配一页内存给虚拟机,存放修改后的数据。对于GuestOS(客户操作系统)来说,整个零页共享技术是完全不感知的。
除了华为FusionCompute的零页共享技术,VMware的ESX解决方案中也有同样的技术。当对某一个虚拟机进行页面共享扫描时,Hypervisor会针对该虚拟机物理页面的数据计算散列值,并在全局散列表中进行遍历及匹配是否有相同的散列值的表项。
4.2.4、内存交换
内存虚拟化的内存交换机制是一种在虚拟机和物理机之间进行内存资源共享和管理的技术。通过内存交换机制,虚拟机可以像使用普通内存一样使用虚拟内存,同时物理机也可以对虚拟机进行管理和监控。
内存交换机制下,虚拟机的内存被分成多个页,每个页的大小与物理机的页大小相同。当虚拟机需要使用更多的内存时,物理机会将一些不常用的页保存到磁盘上,以便为虚拟机腾出更多的物理内存空间。当虚拟机需要访问这些页时,物理机会将它们从磁盘上加载回物理内存中。
4.3、IO虚拟化
Hypervisor通过I/O虚拟化来复用有限的外设资源,Hypervisor截获guestos的I/O设备访问请求,然后通过软件模拟真实硬件实现I/O虚拟化。
I/O虚拟化与CPU虚拟化一样也分为全虚拟化、半虚拟化(准虚拟化)和硬件辅助虚拟化,其实现方式与类似。
- 全虚拟化:由Hypervisor完全模拟I/O设备寄存器和读写操作,不需要guestos进行修改,直接使用已有的驱动,但性能比较差,每一次针对I/O设备的访问都会触发trap到Hypervisor,而Hypervisor需要模拟复杂的硬件,不同硬件需要不同的实现;
- 半虚拟化:要求在guestos中增加前端驱动(frontend),在Hypervisor中增加后端驱动(backend),前端发送客户机请求给后端,后端驱动处理完这些请求后再返回给前端。优点是性能好,无需模拟外设操作,缺点是需要修改guestos;
- 硬件辅助虚拟化:使用SR-IOV(Single Root I/O Virtualization)IO硬件辅助虚拟化技术,它通过为guestos提供独立的内存地址、中断和DMA流而避免Hypervisor介入I/O,SR-IOV允许一个PCI设备提供多个VFs(Virtual Functions),Hypervisor将一个或者多个VFs分配给一个虚机。 一个VF同时只能被分配一个虚机。使用SR-IOV技术可以提高虚拟机的性能,并且可以避免对CPU和内存资源的浪费。同时,SR-IOV技术也支持在线迁移等功能,使得虚拟机的迁移更加方便和高效。其优点是不需要修改guestos,不需要Hypervisor模拟I/O,但需要硬件设备支持
4.4、网络虚拟化
4.4.1、概念
网络虚拟化是一种在一个物理网络上模拟出多个逻辑网络的技术。它允许远程用户访问组织的内部网络,就像物理上连接到该网络一样。此外,它还通过抽象网络连接的概念来实现安全、稳定的隧道,以便对数据进行加密和保护。
4.4.2、络虚拟化目标
网络虚拟化要达到如下三个目标:
- 连通性:虚拟机之间能网络连通、虚拟机能访问互联网或者其他私有网、城域网
- 隔离性:虚拟机root用户可以获取虚拟网络接口信息,但不能获取物理机的MAC地址,可以避免物理攻击
- 性能:虚拟机之间的虚拟网络传输性能应尽可能与实际物理网络一致
4.4.3、网络虚拟化方式
-
桥接:将虚拟机的网卡桥接到宿主机的网卡上,提供近似于实际物理网络的性能,同一个物理机的虚拟机网络桥接到宿主机同一网卡时,相互之间以及与宿主机之间网络是互通的,如图:
-
NAT网关:这种方式下,虚拟机相当于运行在内网的机器,宿主机相当于NAT服务器,这种模式下,同一个宿主机的虚拟机之间网络连通,但虚拟机和宿主机的网络隔离
- VLAN方式:自定义局域网,并给每个局域网分配一个标签,这个标签就是VLAN ID,每个局域网有唯一的IP地址段,将每个虚拟机分配到一个唯一的局域网中,不同局域网之间通过不同的标签和IP网段进行隔离,不能互相通信,实现网络流量的隔离和控制
五、虚拟机生命周期管理
虚拟机生命周期包括以下阶段:
- 创建虚拟机:创建出符合特定操作系统及硬件要求的虚拟操作系统
- 启动虚拟机:启动一个已创建好的虚拟机,相当于将资源真正分配给虚拟机
- 重启虚拟机:重启虚拟机相当于对正在运行的虚拟机进行关闭以及再启动
- 关闭虚拟机:对处于运行状态的虚拟机执行关机命令,使虚拟机处于关机状态
- 删除虚拟机:删除虚拟机实例,以及虚拟机上的应用实例。被删除的虚拟机不可恢复
下图是虚拟机生命周期的全过程逻辑示意图:
六、虚拟机迁移
虚拟机迁移是在不同物理机之间迁移虚拟机,主要用于容错管理、负载均衡和系统维护。
6.1、虚拟机迁移的衡量指标
虚拟机迁移的两个衡量指标:
- 宕机时间:虚拟机服务不可用的总时间
- 总迁移时间:从迁移开始到旧虚拟机被终止的时间
6.2、虚拟机迁移的内存三阶段
虚拟机迁移的内存三阶段主要包括以下步骤:
- Push阶段:源虚拟机持续运行,期间不断地传送内存页面至目的虚拟机,更改过的页面需要重传;
- Stop-and-Copy阶段:源虚拟机被停止,并传送剩余内存页面至目的虚拟机,传输完成后,目的虚拟机开始启动;
- Pull阶段:新虚拟机启动时如发生page fault,表明新虚拟机上有没有拷贝的内存页,目的虚拟机就会向源虚拟机要求传送缺失的页面。
6.3、虚拟机迁移的方式
- 纯stop-and-copy:源虚拟机停止运行,将虚拟机内存页面拷贝到目的虚拟机,然后启动目的虚拟机。这种方式简单直接,但会导致虚拟机在拷贝期间服务中断,宕机时间和总迁移时间与源虚拟机内存大小成比例
- demand-and-migration:该方式使用很短的stop-and-copy阶段拷贝核心的内核数据结构,使得目的主机具备运行系统的必须资源,此时源主机将控制权转移到目的主机,服务在目的主机上继续运行。目标虚拟机启动后,剩余内存页在第一次使用时被传输。这种方式宕机时间极短,但是总迁移时间很长,同时由于可能存在过多的page fault,目标虚拟机性能会受影响
- 预拷贝迁移分成2阶段
1、有限次数的迭代push阶段:第一轮push阶段,将所有内存页标记为脏页面并拷贝到目的主机上;迭代拷贝内存页,上一轮传输过程中被修改过的页面在本次迁移,当需要传输的内存小于一个阈值或者迭代次数超过设置的最大迭代次数时停止迭代拷贝;
2、非常短的stop-and-copy阶段:源虚拟机停止运行,拷贝CPU状态和最后一轮产生的脏页面到目的主机,然后恢复目的主机上的虚拟机
七、虚拟化主流产品技术
7.1、XEN
Xen的Hypervisor是服务器经过BIOS启动之后载入的首个程序,然后启动一个具有特定权限的虚拟机,称之为Domain0(简称Dom0)。
Dom0的操作系统可以是Linux或Unix,Domain0实现对Hypervisor控制和管理功能。在所承载的虚拟机中,Dom0是唯一可以直接访问物理硬件(如存储和网卡)的虚拟机,它通过本身加载的物理驱动,为其它虚拟机(DomainU,简称DomU)提供访问存储和网卡的桥梁。
7.2、KVM与QEMU
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混合实现的虚拟机逻辑架构如下:
下图是Xen与KVM的虚拟化架构对比:
八、小结
本文介绍了基于单个物理机进行虚拟化的虚拟化技术原理、架构层次,虚拟化有裸金属和寄居架构两种架构种类,虚拟化技术分为全虚拟化、半虚拟化和硬件辅助虚拟化三种,物理机虚拟化关键技术包括CPU虚拟化、内存虚拟化、I/O虚拟化、网络虚拟化以及虚拟机的迁移和声明周期管理。
参考资料:
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
关于老猿的付费专栏
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。
前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。