免费背景图片素材网站,江津区建设工程交易中心网站,医疗手机网站建设,校园网络建设方案设计☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython
一、虚拟化原理
将多个“同质或异构”资源#xff08;包括但不限于芯片、硬件、软件、应用#xff09;形成一个资源池#xff0c;对资源池进行抽象、解耦形成独立的“虚拟资源”#xff0c;并实现虚拟资… ☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython
一、虚拟化原理
将多个“同质或异构”资源包括但不限于芯片、硬件、软件、应用形成一个资源池对资源池进行抽象、解耦形成独立的“虚拟资源”并实现虚拟资源之间隔离从而提升资源利用率、业务运营效率。
本文介绍内容主要是基于单个物理机进行虚拟化的角度进行介绍。
二、虚拟化特征 三、虚拟化的架构层次及架构种类
虚拟化的层次架构按照从物理机到虚拟机操作系统可以分为5层如图 虚拟化的架构分为2种
裸金属架构Bare-Metal也称原生架构Hypervisor直接运行在物理机上其下没有宿主机的单独操作系统老猿认为也可以理解为宿主机的操作系统就是Hypervisor典型的样例如VMware ESX、Xen、微软的Hyper-V寄居架构HostedHypervisor直接运行在宿主机的操作系统上很多虚拟化功能依赖于宿主机操作系统或专门的硬件功能典型的样例如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运行ring0guestos发出的特权指令和敏感指令被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-IOVSingle Root I/O VirtualizationIO硬件辅助虚拟化技术它通过为guestos提供独立的内存地址、中断和DMA流而避免Hypervisor介入I/OSR-IOV允许一个PCI设备提供多个VFsVirtual FunctionsHypervisor将一个或者多个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或UnixDomain0实现对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虚拟化、网络虚拟化以及虚拟机的迁移和声明周期管理。
参考资料
分析关于CPU的三种虚拟化机制(三
写博不易敬请支持
如果阅读本文于您有所获敬请点赞、评论、收藏谢谢大家的支持
关于老猿的付费专栏
付费专栏《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。
如果有兴趣也愿意支持老猿的读者欢迎购买付费专栏。
老猿Python跟老猿学Python
☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░