服务器虚拟化技术原理与应用内容提要虚拟化技术简介虚拟化实现技术硬件辅助虚拟化原理KVM/QEMU实现分析容器虚拟化Libvirt简介虚拟化简介虚拟化(Virtualization)的本质虚拟化是资源的逻辑表示,不受物理限制的约束。其技术本质就是由位于下层的软件模块,通过向上一层软件模块提供一个与它原先所期待的运行环境完全一致的接口和方法,抽象出一个虚拟机的软件或硬件接口,是的上层软件可以直接运行在虚拟机的环境上。虚拟化的层面硬件层虚拟化:通过虚拟硬件抽象层来实现虚拟机,为虚拟机操作系统呈现和物理硬件相似或接近的硬件层。操作系统层虚拟化:指操作系统的内核可以提供多个互相隔离的用户态实例,各自有自己独立的文件系统、网络和系统设置、库函数等等。又叫容器虚拟化。内存虚拟化:操作系统通过段式页式管理,提供用户态所有应用程序一个连续完整的内存空间,从而屏蔽物理内存细节,简化应用开发。编程语言层的虚拟化:由虚拟机runtime系统将中间代码动态翻译成硬件的机器语言执行,从而在不同硬件和操作系统上运行,例如java的JVM。虚拟化简介系统虚拟化在系统虚拟化中,物理资源通常称为宿主(host),而虚拟出来的资源称为客户(guset),而虚拟化管理软件成为VMM虚拟化简介虚拟化的优点封装性:以虚拟机为粒度的封装似的虚拟机运行环境的保存非常便捷,部署、备份和恢复都非常迅速。多实例:在一个计算机上运行多个虚拟机使得硬件资源的利用率更高。通过多态硬件服务器组成的集群资源池,可以根据负载动态启用或关闭服务器。隔离:相比同一操作系统中的多任务,每个应用程序可以在自己的操作系统中独立的运行,不会影响到其他程序。硬件无关性:通过虚拟化模拟出的应用程序所需的硬件资源,从而使得应用和具体硬件关联性大大降低;通过动态迁移技术更是可以将运行状态的虚拟机无缝的迁移到其他服务器上运行。虚拟化实现技术系统虚拟化的实现方式基于软件完全虚拟化:又称全虚拟化,通过软件的方式完整模拟底层硬件环境,让客户机操作系统完全觉察不到是运行在一个虚拟平台上。这样的虚拟平台可以直接运行现有的操作系统,而无需对操作系统进行任何修改。具体的内容包括对处理器、内存和I/O的虚拟化处理。代表是Boches,Qemu硬件辅助的全虚拟化:基于软件的完全虚拟化方式中,由于所有的指令执行都需要通过软件去模拟,在性能上会有一定的损失,导致虚拟机运行效率明显低于物理机。如果能把部分硬件(如物理CPU)能处理的指令直接交给硬件执行,而对于硬件不支持的操作则采用软件模拟的方式,这样就会大大提高效率。代表是基于KVM的QEMU,VMWare。半虚拟化:通过修改操作系统的代码来解决虚拟化过程中的问题来实现虚拟化。代表是Xen(Xen也支持全虚拟化)虚拟化实现技术异质与同质虚拟化异质虚拟化:在一种指令体系架构的宿主机中虚拟另一种体系架构下的虚拟机。例如,x86虚拟arm,所有指令都需要重新翻译、模拟后执行,效率非常低下,通常不会超过10%。同质虚拟化:虚拟机和宿主机是同种指令体系架构,例如,x86虚拟x86,powerpc虚拟powerpc。同质虚拟化中很多指令可以直接在物理硬件上运行,而不需要逐条指令翻译。效率较高,现代实用级别服务器系统虚拟化都是同质虚拟化。敏感指令:同质虚拟化中,那些由于会产生冲突无法直接在物理硬件上运行的指令称作敏感指令。例如,涉及到硬件设备、内存寻址等方面的指令。同质虚拟化的实现本质就是捕获与模拟。即补获敏感指令,模拟实现其行为。虚拟化实现技术实现同质全虚拟化需要解决的问题CPU虚拟化:实现CPU指令的模拟;中断和异常的模拟和注入内存虚拟化:提供所有虚拟机一个从0开始的连续物理内存空间;在各虚拟机之间有效隔离、调度以及共享内存资源。IO虚拟化:管理有限的外设资源,截获guestos对设备的访问请求,通过软件模拟的方式来模拟真实设备的效果。硬件辅助虚拟化硬件需求:确定机器有VTgrepvmx/proc/cpuinfo(INTEL芯片)grepsvm/proc/cpuinfo(AMD芯片)确保BIOS里开启VTIntel(R)VirtualizationTech[Enabled]确保内核版本较新,支持KVM用uname–r查看内核版本,如果在2.6.20以下的linux版本,需升级内核。硬件辅助虚拟化虚拟化漏洞与硬件辅助虚拟化基本原理x86硬件支持4个特权级(Ring),一般内核运行在Ring0,用户应用运行在Ring3一些关键操作指令只能在最高特权级别上执行,它们一般被称为特权指令。如果在非特权级别上试图执行特权指令,将生成一个一般保护异常非特权指令则可以在任何一个权限级别执行敏感指令是VMM不可以轻易让客户操作系统执行的指令,如果所有敏感指令都是特权指令,就可以利用保护异常实现虚拟化当一部分敏感指令并不是特权指令,这就出现问题了。非特权指令在Ring1~Ring3上是可以执行。VMM不会处理这些指令。这就是硬件架构上的虚拟化漏洞硬件辅助虚拟化VT-x引入两种模式,统称VMX模式根模式(VMXRootOperation):VMM运行的模式非根模式(VMXNon-Root):客户机所运行的模式非根模式的下所有敏感指令的行为被重新定义,他们不经虚拟化就直接运行或通过陷入再模拟的方式运行,在根模式下所有的指令行为没有变化非根模式下敏感指令引起的“陷入”称为VM-Exit,VM-Exit自动从非根模式转换为根模式VM-Entry操作由VMM发起,通常是调度某个客户机运行,此时,CPU由根模式切换到非根模式VT-x引入了VMCS,VMCS保存CPU需要的相关状态,VMCS主要提供CPU使用,CPU发生VM-Exit和VM-Entry时会自动更新VMCS。VMM通过指令配置VMCS,进而影响CPUVMCS(Virtual-MachineControlStructure)VMCS是保存在内存中的数据,包含了虚拟CPU相关寄存器的内容和虚拟CPU相关的控制信息,每个VMCS对应一个虚拟CPU,任何时刻VMCS与物理CPU是一对一的绑定关系VMCS不同时刻可以绑定到不同的物理CPU,这种绑定关系的变化称为VMCS的迁移VT-x提供了两条指令用于VMCS的绑定和解除绑定:VMPTRLDVMCS地址:将指定的VMCS与执行该指令的物理CPU绑定VMCLEAR:将执行该指令的物理CPU与他的VMCS解除绑定。该指令将物理CPU缓存中的VMCS结构同步到内存中,保证VMCS和新物理CPU绑定时,内存中的值是最新的VM-x提供两条指令用于VMX的打开和关闭VMXON:打开VMX操作模式VMXOFF:关闭VMX操作模式VMCS格式字节偏移描述0VMCS数据格式4VMX终止提示(VM-Exit执行不成功时产生VMX终止,CPU在吃出存入终止原因,以方便调试)8VMCS数据域与cpu(相关,不同格式CPU可能不同格式)VMREAD索引:读VMCS中“索引”的数据VMWRITE索引数据:写VMCS中索引指定的域VMCS数据域包括六大信息:Gueststatearea:虚拟机状态域Hoststatearea:宿主机状态域VM-ExecutioncontrolfileldsVM-entrycontorlfileldsVM-exitcontrolfileldsVM退出信息VMCS块格式VM-Entry与VM-Exit执行基本的检查来确保VM-Entry能开始对VMCS中的宿主机状态有效性检查,以确保下一次VM-Exit发生时可以正确的从客户机环境切换到VMM环境检查VMCS中客户机状态域的有效性;根据VMCS中客户机状态域来装载处理器状态根据VMCS中VM-EntryMSR-load区域装载MSR寄存器根据VMCS中VM-Entry事件注入控制的配置,可能需要注入一个事件到客户机中CPU首先将此次VM-Exit的原因记录到VMCS相应的信息域中,VM-Entryinterruption-information字段有效位(bit31)清零CPU状态被保存到VMCS客户机状态,根据设置,CPU也可能将客户机MSR保存到VM_ExitMSR-Store区域根据VMCS中宿主机状态和VM-Exit控制域中的设置,将宿主机状态加载到CPU相应寄存器。CPU由非根模式切换到根模式,从宿主机状态域中CS:RIP指定的VM_Exit入口函数开始执行VM-Entry的过程:VM-Exit的过程:内存虚拟化X86体系内存管理架构内存虚拟化内存寻址与页表结构内存虚拟化虚拟机影子页表技术–客户机页表•GVA-----GPA•载入硬件MMU无法访问真正物理内存–影子页表•GVA---HPA•载入硬件MMU访问真正物理内存•载入硬件MMU,TLB缓存影子页表表项–两者关系•客户机修改客户机页表–TLB刷新–INVLPG•影子页表同步客户机页表–VTLB内存虚拟化•EPT(ExtendedPageTable)被用于支持内存虚拟化。•EPT在非根模式下将客户机物理地址(gpa)转换为宿主机物理机地址(hpa),客户机的虚拟地址(gva)到客户机的物理地址(gpa)的转换由客户机页表实现•CPU同时使用两套页表(在原有的CR3控制器页表的基础上引入了EPT页表的另一次映射)•两次页表转换都由CPU硬件自动完成•通过VMCS的“VM-Execution控制域”中的EnableEPT字段进行激活•EPT在VMentry时生效–当EPT生效时,EPTbasepointer指向ExtendedPageTable–当VMexit时EPT失效EPT硬件辅助技术内存虚拟化使用EPT硬件直接从GVA转换到HPAKVM虚拟机简介kernel-basedVirtualMachine(KVM),是一个开源的系统虚拟化模块,自Linux2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,KVM的虚拟化需要硬件支持(如IntelVT技术或者AMDV技术)。是基于硬件的完全虚拟化kvm由两个部分组成:一个是KVMDriver,已经成为linux内核的一个模块,负责虚拟机的创建,虚拟机内存的分配,虚拟机寄存器的读写以及虚拟CPU的运行等。另外是一个稍微修改过的qemu,用于模拟PC硬件的用户空间组件,提供I/O设备模型以及访问外设的途径。qemu是一种模拟处理器,现在运用最多的就是将KVM和QEMU结合起来KVM使用了QEMU的一部分,并稍加改造,就成了可控制KVM的用户空间工具了KVM基本结构KVM在Linux内核态与用户态的实现内核空间代码实现的功能包括以下几个方面:1.实现硬件辅助的虚拟化的核心功能。2.提供用户空间对KVM控制。3.对x86平台设备进行仿真。4.实现IOPort空间和MMIO空间的仿真。5.MMU虚拟化的支持。6.PCI-Passthrough相关的功能。KVM在用户态的实现(qemu)包括以下部分:1.实现与KVM内核接口的用户空间逻辑。2.各种层次和类型的硬件设备的仿真。3.虚拟块设备的不同磁盘Image文件格式的支持。4.VNC,SPICE等表示层协议的支持。5.Virtio设备的后端。6.QMP协议的支持。KVM在Linux内核态与用户态的实现内核空间代码实现的功能包括以下几个方面:1.实现硬件辅助的虚拟化的核心功能。2.提供用户空间对KVM控制。3.对x86平台设备进行仿真。4.实现IOPort空间和MMIO空间的仿真。5.MMU虚拟化的支持。6.PCI-Passthrough相关的功能。KVM在用户态的实现(qemu)包括以下部分:1.实现与KVM内核接口的用户空间逻辑。2.各种层次和类型的硬件设备的仿真。3.虚拟块设备的不同磁盘Image文件格式的支持。4.VNC,SPICE等表示层协议的支持。5.Virtio设备的后端。6.QMP协议的支持。KVM/QEMU的执行路径machine-initPc.init1Pc_new_cpuQemu_init_vcpuKvm_init_vcpuPthr