kvm Xen 笔记
引言
对于虚拟化一直以来都认为是高攀不起的领域,不过最近项目上要用到 openstack 做虚拟化集群,”无奈”从0学起,本文是最近入门虚拟化的个人笔记,才疏学浅,必有纰漏,后续不断补充改正,欢迎批评指正.
虚拟化,总体上包括全虚拟化,半虚拟化,和硬件辅助虚拟化.
全虚拟化
指Hypervisor程序,完全模拟硬件和OS执行过程.Guest OS 完全透明.例如 X86架构上的Ring 3 指令直接在host物理内存上执行, Ring0 执行异常由 Hypervisor 捕获,翻译,模拟执行之后,返回给Guest OS. Guest OS 无感知.这种方案通常性能较低,涉及到特权指令等一系列复杂的处理流程.好处是Guest OS 不需要有改动.常见的 QEMU, KVM, QEMU-KVM技术均属于全虚拟化, 还有VMWare Virtual PC等
半虚拟化
有时候也叫准虚拟化或超虚拟化,指改造Guest OS的方法,实现虚拟化的方案.比如,替换Guest OS 高特权级指令,改造 hypercall(hypervisor 提供的调用服务). Guest OS 需要执行类似指令,就 产生 hypercall 给hypervisor 程序, 由 hypervisor 调用 host OS或者裸金属硬件,完成执行.
这省去了之前的异常捕获和翻译过程,大大提高了性能,代表就是Xen 的半虚拟化模式.
hypervisor 同时也提供了超级调用接口来满足其他关键内核操作,比如内存管理、中断和时间保持.
这种做法省去了全虚拟化中的捕获和模拟,大大提高了效率.所以像XEN这种半虚拟化技术,客户机操作系统都是有一个专门的定制内核版本,和x86、mips、arm这些内核版本等价.这样以来,就不会有捕获异常、翻译、模拟的过程了,性能损耗非常低.这就是XEN这种半虚拟化架构的优势.这也是为什么XEN只支持虚拟化Linux,无法虚拟化windows原因,微软不改代码啊.
硬件辅助虚拟化
随着硬件技术的提高,单个运行的OS很难吃到硬件资源的上限,这样就导致硬件性能过剩,反过来说造成了资源浪费.另外有些应用出于安全性和隔离性的考虑,需要单独的OS环境,因此对于虚拟化有需求变的更加迫切.硬件厂商也看到了这个趋势.
在2005年左右,Intel 和 AMD 也分别推出了各自的硬件虚拟化技术 Inter-VT 和 AMD VX.
Intel-VT 技术在CPU上引入了根模式(VMX root operation)和非根模式(VMX non root operation),两种模式都支持Ring0 ~ Ring3的架构,虚拟机监控程序(VMM)运行在跟模式下,通过 VMLAUNCH 和 VMRESUME 切换到 非根模式下,直接运行 Guest OS. CPU 直接在 Guest 的上下文下进行执行.产生中断或者切换,由 VMM 返回跟模式下执行之后.
这种方式全虚拟化的“异常捕获-翻译-模拟执行”不需要了,由于硬件的支持 CPU 和 内存虚拟化的速度大大逼近半虚拟化的,逐渐成为主流.代表实现 VMware ESXi , Xen 3.0, KVM, Hyper-v
运行在 VMX root operation 模式下的 VMM 通过显式调用 VMLAUNCH 或 VMRESUME 指令切换到 VMX non-root operation 模式,硬件自动加载 Guest OS 的上下文,于是 Guest OS 获得运行,这种转换称为 VM entry.Guest OS 运行过程中遇到需要 VMM 处理的事件,例如外部中断或缺页异常,或者主动调用 VMCALL 指令调用 VMM 的服务的时候(与系统调用类似),硬件自动挂起 Guest OS,切换到 VMX root operation 模式,恢复 VMM 的运行,这种转换称为 VM exit.VMX root operation 模式下软件的行为与在没有 VT-x 技术的处理器上的行为基本一致;而VMX non-root operation 模式则有很大不同,最主要的区别是此时运行某些指令或遇到某些事件时,发生 VM exit.
KVM vs Xen
- 背景
作为新老两代主流虚拟化技术的实现,XEN 最早有Citrix 公司 2003年推出,统治了虚拟化领域 十年有余,KVM 由以色列 XXX 公司 2005推出,由于其简单稳定的设计理念和实现,发展非常迅速,目前已经被合并入Linux 2.6 内核,被各大厂商和云服务商主推.截止日前(2019-4-18),亚马逊宣布2020年在VPS 业务上逐步用KVM 替换 Xen.
- 对比
Xen 是可以直接运行在裸金属硬件上hypervisor 程序,有全虚拟化,和半虚拟化的两种模式.但半虚拟化性能接近主机性能,被广泛采用.不过半虚拟化模式需要修改Guest OS, 因此兼容性和广泛性一直是其掣肘.
KVM 严格的说,可以看做是Linux 内核扩展的一个模块.主要负责CPU和内存虚拟化的任务,其他设备的虚拟化需要借助 QEMU 等实现.从设计角度看,KVM 把 Linux 本身变成了 Hypervisor,运行在裸金属上.内存管理,任务调度,中断异常处理等很多核心功能依赖 Linux 内核模块来实现.所以 KVM 非常轻量级,代码规模较小,这也意味着稳定性出错率较小.因此从诞生之初就发展非常快.
(to be continue)