KVM 学习笔记:再谈虚拟化


虚拟化是云计算的基石,抛开虚拟化谈云计算无异于缘木求鱼,不得要领。

虚拟化简介

虚拟化是一种技术,它是对物理硬件资源的虚拟。通过虚拟化使得应用运行在虚拟化之后的虚拟机上,达到充分利用物理资源的目的。
 
根据虚拟化的类型可将虚拟化分为 I 型虚拟化和 II 型虚拟化。I 型虚拟化是直接作用于裸机上的,如 Xen 等虚拟化技术。II 型虚拟化是在操作系统之上的虚拟化,如 qemu-kvm,HyperV 等虚拟化技术。
 
根据虚拟化技术可将虚拟化分为:全虚拟化,半虚拟化和硬件辅助的虚拟化。
 

全虚拟化

 
如上图所示,全虚拟化是通过 QEMU 的模拟代码来模拟 Guest 请求的虚拟化。全虚拟化需要经过捕获/拦截/模拟等一系列流程。
 
物理上的 CPU 作用在不同的运行级别上,分别是 Ring3,Ring2,一直到 Ring0。对于 kernel 的代码,CPU 是运行在 Ring0 级别,可以执行特权指令,例如访问硬件资源等指令。而,作用在其它级别上时,CPU 是处于受限模式的。对于 QEMU 和 Guest 来说,CPU 在执行它们的指令时没有用 Ring0 级别去执行,当 Guest 执行 I/O 请求的时候,CPU 会报异常,这个异常会被内核模块的 KVM 捕获到,KVM 将该异常消息放入 I/O sharing page 中,然后通过 /dev/kvm 接口,告知 QEMU 去读取 sharing page 中的异常消息,QEMU 读取到该异常消息,通过自己的模拟代码来驱动内核中相应的设备模块实现 I/O 操作。当操作成功后,把结果放到 I/O sharing page 中,并通知 KVM 内核去读取该操作成功后,把结果,KVM 读取到该结果,将结果发给 Guest 的驱动程序实现整个 I/O 请求。
 
全虚拟化的指令都需要经过捕获/拦截/模拟的过程,很复杂,效率很低。
 

半虚拟化

 
如图所示,半虚拟化是对 Guest 的模块进行修改的虚拟化。现在的半虚拟化通常是基于 virtio 框架的虚拟化。在 Guest 中包含 virtio 的 Front-end,在 Host 上安装 virtio 的 Back-end。当有 I/O 请求时,Guest 上的前端 virtio driver 会直接和 Host 上的 virtio devcie 进行通信,实现对硬件资源的访问。
 
相比于 qemu 的全虚拟化,半虚拟化绕过了 QEMU ,从而少了指令捕获/拦截/模拟的过程,效率要更高。
 
完整的 Guest I/O 流程如下图所示: 

你可能感兴趣的:(KVM 学习笔记:再谈虚拟化)