一些术语
汇总在虚拟化世界里经常会涉及到的术语或缩写等。
术语 | 含义 |
---|---|
VM | Virtual Machine,虚拟机 |
VMM | 在系统虚拟化中,管理全局物理资源的软件叫作虚拟机监控器(Virtual MachineMonitor,VMM),VMM之于虚拟机就如同操作系统之于进程,VMM利用时分复用或者空分复用的办法将硬件资源在各个虚拟机之间进行分配 |
Xen | 2001年剑桥大学开发了Xen,早期的开源虚拟化方案,出现在各种硬件虚拟化技术之前。现在远不如KVM |
KVM | 2006年,以色列的初创公司Qumranet利用Intel的硬件虚拟化技术在Linux内核上开发了KVM(Kernel Virtual Machine),是一款非常成功的虚拟化VMM,称为云计算的基石 |
QEMU | Quick Emulator,模拟器 |
VMX | Virtual Machine eXtensions. intel在x86 cpu架构基础上增加VMX架构来实现CPU的硬件虚拟化 VMX架构下有:VMM(虚机监控器) 和 VM(虚机) CPU支持VT-x技术的标志为vmx,Linux中/proc/cpuinfo可查看 |
VT-x | Intel virtualization,intel虚拟化技术。可在BIOS中设置是否启用VT-x技术 所以可以认为 VMX = VT-x,都是指 intel 硬件虚拟化技术 |
虚拟化解决方案
虚拟化解决方案 | |
---|---|
VMware Workstation | VMware最早的产品,至今仍有大量用户使用。VMware Workstation能够很方便地在PC上构建一个虚拟机,用户可以在其上安装各种操作系统,能够非常方便地完成多种任务,比如跨平台的开发测试 |
VirtualBox | 最早由一个德国公司开发,后来被甲骨文收购。它的优点是性能不错并且开源,能够很方便地用来实现一些定制需求 |
HyperV | 微软提供的虚拟化解决方案,微软用它来构建自己的云计算平台 |
Xen | Xen作为早期的开源VMM,其诸多思想直到今天也在影响着虚拟化社区 |
QEMU/KVM架构
VMX operation
VMX架构中,每个VM都是一个虚拟机实例,能够支持操作系统以及各种软件栈和应用程序,VM本身不会意识到其处在虚拟化环境中。每一个VM都相互独立,有自己独立的CPU、内核、中断和设备等,这些资源都是VMM提供的。
VMM需要对各个VM进行管理,包括创建、配置、删除VM实例、为其分配资源、确保各个VM之间的隔离与独立,还需要处理VM对资源的访问、确保公平,所有这些都需要VMM运行的权限高于VM,只有这样,VMM才能够实现对整个系统资源和对VM的管理。但是传统上,操作系统内核已经运行在ring0最高级了,所以为了让CPU支持VMM和VM两种软件,Intel为CPU引入了一种新的模式,叫作VMX operation。
VMM执行的模式叫作VMX root operation模式,VM执行的模式叫作VMX non-root operation模式,这两种模式之间的转换叫作VMX转换。从VMX root转换到VMXnon-root叫作VM Entry,而从VMX non-root转换到VMX root则叫作VM Exit。
每种模式都有自己的ring0和ring3结构。VMX operation与CPU特权级是正交的。在普通的QEMU/KVM架构中,QEMU等用户态软件以及KVM等宿主机的内核都运行在VMX root模式下,在虚拟机也有自己的ring0和ring3。当然,VM中执行指令的行为肯定不能完全与VMM中相同,否则也用不着VMX架构了。在VMX non-root模式中,各种指令是严格受到限制的,执行一些特殊的指令(如之前所说的影响系统全局的指令)或者发生一些特殊的事件都会导致VM Exit,使VM退出到VMM。
QEMU/KVM架构图
CPU在运行包括QEMU在内的普通进程和宿主机的操作系统内核时,CPU处在VMX root模式。CPU在运行虚拟机中的用户程序和操作系统代码的时候处于VMX non-root模式。需要注意的是,CPU的运行模式与CPU运行时的特权等级是相互正交的,虚拟机在VMXroot模式和VMX non-root模式下都有ring 0到ring 3四个特权级别。
可以按上图中的色框线来理解QEMU/KVM架构,整体可以分为3大部分:
- VMX root 应用层:宿主机的qemu等普通进程
- VMX non-root 虚拟机层:虚拟机guest
- VMX root 内核层:宿主机的内核
VMX root 应用层
从图中可以看出,QEMU的主要任务是模拟芯片组,创建CPU线程来表示虚拟机的CPU执行流,在QEMU虚拟地址空间中分配空间作为虚拟机的物理地址,创建用户指定的虚拟设备等,QEMU通过监听事件的方式来响应KVM转过来的虚拟机请求。
VMX non-root 虚拟机层
虚拟机中本身也有自己的操作系统内核和应用层,虚拟机的一个CPU对应QEMU进程中的一个vCPU线程,可以被host主机正常调度。
虚拟机中的物理内存对应QEMU进程的虚拟内存,VM通过guest os的页表管理系统完成VM虚拟地址到VM物理地址的转换,最终经由KVM的页表完成VM物理地址到host物理地址的转换。
VMX root 内核层
Linux内核中的KVM驱动,主要做两件事:
- KVM通过 “/dev/kvm” 设备提供ioctl的API接口,QEMU通过该接口可控制虚拟机,比如设定CPU个数、内存布局等;
- KVM需要截获虚拟机产生的 VM Exit 事件并响应处理;
QEMU与KVM配合起来共同完成了虚拟机各个组件的虚拟化,比如CPU虚拟化、内存虚拟化、设备虚拟化、中断虚拟化等。
CPU虚拟化
QEMU创建vCPU线程,初始化时就设置好vCPU寄存器的值,然后通过KVM API,运行虚拟机。
KVM需要截获虚拟机中的敏感指令,当虚拟机的代码是敏感指令或者满足一定的退出条件时,CPU从VMX non-root模式退出到KVM(VMX root模式),这叫 VM Exit(类似于用户态陷入内核态)。VMX Exit后首先在KVM中处理,如果KVM无法处理,再转给QEMU处理。当QEMU或KVM处理好VM Exit事件后,又将CPU置于VMX non-root模式,这叫VM Entry。虚拟机就这样不停的VM Exit和VM Entry。
KVM中用一个结构来记录虚拟机的VM Exit和VM Entry状态,叫VMCS。