导图社区 虚拟化技术
这是一篇关于虚拟化技术的思维导图,主要内容包括:虚拟化平台管理工具-Libvirt,KVM工作原理,KVM 与 QEMU,Xen vs KVM,KVM虚拟化,Xen虚拟化,I/O虚拟化,内存虚拟化,CPU虚拟化,虚拟化的优势,虚拟化的特点,虚拟化类型,虚拟化。
编辑于2024-01-25 18:04:27虚拟化技术
虚拟化
虚拟机操作系统 Guest OS
虚拟机 Guest Machine
虚拟化软件层 Hypervisor/虚拟机监控机 CCM
运行在物理机之上的OS Host OS
物理机 Host Machine
虚拟化类型
全虚拟化
使用VMM实现CPU、内存、设备I/O的虚拟化,而GuestOS和计算机系统硬件 都不需要进行修改。该方式兼容性好,但会给处理器带来额外开销
半虚拟化
使用VMM实现CPU和内存虚拟化,设备I/O虚拟化由GuestOS实现。需要修改 GuestOs,使其能够与VMM协同工作。该方式兼容性差,但性能较好
硬件辅助虚拟化
借助硬件(主要是处理器)的支持来实现高效的全虚拟化。该方式不需要修改 GuestOS,兼容性好。该技术将逐渐消除软件虚拟化技术之间的差别,成为 未来的发展超势
虚拟化的特点
分区
分区意味看虚拟化层为多台虚拟机划分服务器资源的能力:每台虚拟机可以同时运行一个单独的操作系统(相同或不同的操作系统),使您能够在一台服务器上运行多入应用程序;每人操作系统只能看到虚拟化层为提供的“虚拟硬件“图(虚拟网卡、CPU、内存等),以使它认为运行在自己的专用服务器上。
隔离
1.虚拟机是互相隔离的一台虚拟机的崩溃或故障(例如,操作系统敌障、应用程序崩溃、驱动程序敌障,等等)不会影响同一服务器上的其他虚拟机。 2.一台虚拟机中的病毒、糯虫等与它虚拟机相隔离,就像每台虚拟机都位于单独的物理机器上一样。 3.可以进行资源控制以提供性能隔离:您可以为每台虚拟机指定最小和最大资源使用量,以确保某台虚拟机不会占用所有的资源而使得同一系统中的其他虚拟机无资源可用。
封装
封装意味看将整台虚拟机(硬性配置、BIOS配置、内存状态、磁盘状态、CPU状态)诺存在独立于物理硬件的一小组支件中。这样,您只需复制几人支件就可以随时随地根据需要复制、保存和移动虚拟机。
相对于硬性独立
因为虚拟以机运行于虚以化层之上,所以只能看到虚拟化层提供的虚拟以硬件;此虚拟硬件也同样不必考虑物理服务器的情况:这样,虚拟机就可以在任伺x86服务器(IBM、Dell、HP等)上运行而无需进行任何修改。这打破了操作系统和硬件以及应用程序和操作系统/硬件之间的约束。
虚拟化的优势
对比
操作系统与物理服务器分离
易于迁移、扩展,资源整合
标准化的虚拟硬件由一系列文件组成
易于保护
CPU虚拟化
问题
如何模拟CPU指令(所有敏感指令)
敏感指令
可以读写系统关键资源的指令叫做敏感指令
特权指令
决大多数的敏感指令是特权指令,特权指令只能在处理器的最高特权级(内核态)执行
如何让多台VM共享CPU
利用与Native操作系统类似的机制一通过定时器中断,在中断触发时陷入VMM,从而根据调度机制进行调度
方案
操作系统(内核)需要直接访问硬件和内存,因此它的代码需要运行在最高运行级别Ringo上,这样它可以使用特权指令,控制中断、修改页表、访问设备等。
应用程序的代码运行在最低运行级别上Ring3上,不能做受控操作。如果要做比如要访问磁盘,写文件,那就要通过执行系统调用(函数),执行系统调用的时候,CPU的运行级别会发生从Ring 3到Ring o的切换,并跳转到系统调用对应的内核代码位置执行,这样内核就为你完成了设备访问,完成之后再从Ringo返回Ring3。这个过程也称作用户态和内核态的切换。
内存虚拟化
问题
内存都是从物理地址o开始的
物理地址0开始的:物理地址0只有一人,无法同时满足所有客户机从0开始的要求
内存都是连续的
地址连续:虽然可以分配连续的物理地址,但是内存使用效率不高,缺乏灵活性在中断进行调度
方案
KVM中,虚拟机的物理内存即为qemu-kvm进程所占用的内存空间。KVM使用cPU辅助的内存虚拟化方式
内存虚拟化-影页表
由于宿主机MMU不能直接装载客户机的质表来进行内存访,所以当客户机可宿主机物理内存时,需要经过多次地址转换。即首先根据客户机页表把客户机虚拟地址(GVA)转换成客户机物理地址(GPA),然后再通过客户机物理地址(GPA)到宿主机虚拟地址(HVA)之间的映射转换成宿主机虚拟地址: 最后再根据宿主机页表把宿主机虚拟地址(HVA)转换成宿主机物理地(HPA)。而通过影子页表,则可以实现客户机虚拟以地址到宿生机物理地址的直接转换
Intel的CPU提供了EPT(ExtendedPaeTables,扩展页表)技术,直接在硬件上支持GVA->GPA->HPA的地址转换,从而降低内存虚拟化实现的复杂度,也进一步提升内存虚拟化性能
KVM为了在一台机器上运行多台虚拟机,需要增加一人新的内存虚拟化层(客户机物理地址空间),这人地址空间不是真正意义上的物理地址空间,它们之间还有一层转,换。客户机虚拟地址(GVA)到客户机物理地址(GPA)的转换
但是客户操作系统不能直接访问实际机器内存,因此VMM需要负责映射客户物理内到实际机器内存(GPA->HPA)
I/O虚拟化
问题
设备发现
需要控制各虚拟机能够访问的设备
访问截获
通过I/O端口或者MMIO对设备的访问
设备通过DMA与内存进行数据交换
方案
I/O虚拟化可以被看作是位于服务器组件的系统和各种可用1/O处理单元之间的硬件中间件层,使得多个guest可以复用有限的外设资源
设备虚拟化(1/O虚拟化)的过程,就是模拟设备的这些寄存器和内存,截获Guest Os对IO端口和寄存器的访问,通过软件的方式来模拟设备行为
在QEMU/KVM中,客户机可以使用的设备大致可分为三类
模拟设备:完全由QEMU纯软件模拟的设备
优点
对硬件平台依赖性较低、可以方便模拟一些流行的和较者久的设备、不需要宿主机和客户机的额外支持,因此兼容性高
缺点
I/O路径较长、VM-Exit次数很多,因此性能较差。一般适用于对I/O性能要求不高的场景,或者模拟一些老旧遗留(legacy)设备(如RTL8139的网卡)
Virtio设备:实现VIRTIOAPl的半虚拟化设备
优点
实现了VIRTIOAPI,减少了VM-Exit次数,提高了客户机l/O执行效率,比普通模拟/O的效率高很多
缺点
需要客户机中与Virtic相关驱动的支持(较老的系统默认没有自带这些驱动,windows系统中需要额外安装Virtio驱区动),因此兼容性较差,而且l/O频繁时的cPU使用率较高
PCl设备直接分配(PCldeviceassignment)
优点
设备直接分配让客户机完全占有PC设备,这样在执行V/O操作时大量地减少甚至避免了VM-Exit陷入到Hypervisor中,极大地提高了I/O性能,可以达到几乎和Native系统中一样的性能。尽管virtio的性能也不错,但VT-d克服了某兼容性不多好和cPU使用率较高的问题
缺点
VT-d也有自已的缺点,一台服务器主板上的空间比较有限,允许添加的PCI和PCI-E设备是有限的,如果一台宿主机上有较多数量的客户机,则很难向每台客户机者都独立分配VT-d的设备。另外,大量使用-d独立分配设备给客户机让硬件设备数量增加,这会增加硬件投资成本
Xen虚拟化
Xen支持两种类型的虚拟机
半虚拟化(PV,Paravirtualization)
半虚拟化需要特定内核的操作系统,如基于Linux paravirt_ops(Linux内核的一套编译选项)框架的Linux内核,而windows操作系统由于其封闭性则不能被Xen的半虚拟化所支持,Xen的半虚拟化有个特别之处就是不要求CPU具备硬件辅助虚拟以化,这非常适用于2007年之前的旧服务器虚拟化改造
全虚拟化(Xen称其为HVM,HardwareVirtual Machine)
全虚拟化支持原生的操作系统,特别是针对indows这类操作系统,Xen的全虚拟化要求CPU具备硬件辅助虚拟化,它修改的OEMU仿真所有硬件包括:BIOS、IDE控制器、VGA显示卡、USB控制器和网卡等。为了提升IO性能,全虚拟化特别针对磁盘和网卡采用半虚拟以化设备来代替仿真设备,这些设备动称之为PV on HVM,为了使PV on HVM有最佳性能,CPU应具备MMU硬件辅助虚拟化
Xen的Hypervisor层非常薄,少于15万行的代码量,不包含任何物理设备驱动,这一点与Hyper-V是非常类似的,物理设备的驱动均是驻留在Domo中,可以重用现有的Linux设备驱动程序。因此,Xen对硬件兼容性也是非常广泛的,Linux支持的,它就支持
KVM虚拟化
KVM充分利用了CPU的硬件辅助虚拟化能力,并重用了Linux内核的诸多功能,使得,KVM本身是E常瘦小的,KVM的创始者AviKivity声称KVM模块仅有约10000行代码但我们不能认为KVM的Hypervisor就是这个代码量,因为从严格意义来说,KVM本身并不是Hypervisor,它仅是Linux内核中的一个可装载模块,其功能是将Linux内核转换成一个裸金属的Hypervisor
通过KVM模块的加载将Linux内核转变成Hypervisor,Linux本身运行于内核模式,主机进程运行于用户模式,虚拟机则运行于客户模式,使得转变后的Linux内核可以将主机进程和虚拟机进行统一的管理和调度,这也是KVM名称的由来。
Xen vs KVM
Xen平台架构侧重安全性:为保证安全性,各Domain对共享区域的访问和映射必须通过Hypervisor授权
KVM平台架构侧重性能:VM之间以及与Host Kernel之间对共享区域的访问和映射无需Hypervisor进行授权,故整个访问路径较短。使用Linux Baremetal内核,无PVOPS性能损耗
KVM 与 QEMU
KVM工作原理
KVM基本结构如上图。KVM已经是内核模块,被看作是一个标准Linux字符集设备(/dev/kvm)。QEMU通过Libkvm应用程序接口,用fd(文件描述符)通过ioctl向 设备驱动来发送创建、运行虚拟机命令。设备驱动KVM会解析命令
KVM模块让Linux主机成为了一个虚拟机监视器(VMM), 在原有执行模式基础上增加了客户模式。 在虚拟机运行时,三种模式的工作为:
客户模式
执行非/O的客户代码,虚拟机运行在这个模式下
用户模式
代表用户执行I/O指令,QEMU运行在这个模式下,它用来为虚拟机模拟执行/O类的操作请求
内核模式
实现客户模式切换,处理因I/O或者他指令引起的从客户模式退出动作(VM-Exit)。KVM模块工作在这个模式下。此模式下可以真正操作硬件,当GuestOS执行O类操作或特权指令操作时,需要可用户模式提交请求,然后由用户模式再次发起硬件操作请求给内核模式,从而真正操作硬件
KVM工作原理-扩展
用户模式的QEMU利用Libkvm通过ioctl进入内核模式,KVM模块为虚拟机创建虚拟内存、虚拟CPU后,执行VMLAUCH指令进入客户模式,加载Guest OS并执行
如果GuestOs发生外部中断或影子页表缺失等情况,会暂停GuestOs(客户模式)的执行,退出客户模式到内核模式执行异常处理,之后重新进入客户模式,执行客户代码
如果发生I/O事件或者信号队列中有信号到达,就会进入用户模式(QEMU)进行处理,执行模拟
虚拟化平台管理工具-Libvirt