Linux Virtualiztion

首先计算机虚拟化技术是多种技术的综合实现,它包括硬件平台、操作系统、存储及网络等。
简单来说,虚拟化技术就是在单台主机上虚拟多个虚假主机,并可以在这些虚拟机上运行不同的操作系统平台。虚拟化技术的出现可以节约大量的硬件资源与能源资源消耗,降低资金成本,虚拟化现在已经是每个企业必有的项目。目前所提供的比较成熟的虚拟化解决方案主要有VMware、Xen、KVM和Kyper-V等。虚拟化技术是通过Hypervsion动态模拟于分配计算机硬件资源给虚拟机操作系统Guest OS,由于Hypervsion可以模拟多个硬件资源给多个Guest OS,所以对于Guest OS来说,它们就像是运行在独立、真实的硬件资源上一样。

Linux Virtualiztion—概述_第1张图片

虚拟化技术的类型有主机虚拟化,容器虚拟化,系统库虚拟化和应用程序级虚拟化;

主机虚拟化类型分为Type-I和Type-II两种,Type-I物理硬件上直接运行的不是操作系统而是一个专门的虚拟化管理器(VMM,Hypervisor),在此基础上所有操作系统都是运行于虚拟机实例之中;Type-II是于硬件级别上运行一个OS,通常称为“HOST OS”,就是宿主机的操作系统;而后在这个宿主机操作系统上安装并运行一个虚拟化管理器(VMM,Hypervisor),在VMM上再创建并安装虚拟机和对应的OS,通常称为“Guest OS”,即虚拟机操作系统; 主机虚拟化所用到的主要技术有CPU虚拟化、内存虚拟化、和IO虚拟化。

按照虚拟化程度可分为全虚拟化、半虚拟化、硬件辅助虚拟化。

CPU全虚拟化技术主要采用优先级压缩技术(Ring Compression)和 二进制代码翻译技术(Binary Translation)。优先级压缩技术让VMM和Guest 运行在不同的特权级下
CPU半虚拟化技术主要采用Hypercall 技术。Guest OS 的部分代码被改变,从而使Guest OS会将和特权指令相关的操作都转换为发给VMM的Hypercall(超级调用),由VMM继续进行处理。而Hypercall支持的批处理和异步这两种优化方式,使得通过Hypercall 能得到近似于物理机的速度
CPU硬件辅助虚拟化技术
目前主要有Intel 的VT-x和AMD的AMD-V这两种技术。其核心思想都是通过引入新的指令和运行模式,使VMM和Guest OS分别运行在不同模式(ROOT 模式和非ROOT模式)下,且Guest OS 运行在Ring 0 下。通常情况下,Guest OS 的核心指令可以直接下达到计算机系统硬件执行,而不需要经过VMM。当Guest OS执行到特殊指令的时候,系统会切换到VMM,让VMM来处理特殊指令。CPU的虚拟化技术可以单CPU模拟多CPU并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。

内存虚拟化,KVM 通过内存虚拟化共享物理系统内存,动态分配给虚拟机,为了在一台机器上运行多个虚拟机,KVM 需要实现 VA(虚拟内存) -> PA(物理内存) -> MA(机器内存)直接的地址转换。虚机 OS 控制虚拟地址到客户内存物理地址的映射 (VA -> PA),但是虚机 OS 不能直接访问实际机器内存,因此 KVM 需要负责映射客户物理内存到实际机器内存 (PA -> MA)。

内存全虚拟化技术通过使用影子页表(Shadow Page Table)实现虚拟化。VMM 为每个Guest 都维护一个影子页表,影子页表维护虚拟地址(VA)到机器地址(MA)的映射关系。而Guest页表维护VA到客户机物理地址(GPA)的映射关系。当VMM捕获到Guest 页表的修改后,VMM 会查找负责GPA 到MA 映射的P2M 页表或者哈希函数,找到与该GPA对应的MA,再将MA填充到真正在硬件上起作用的影子页表,从而形成 VA 到 MA 的映射关系。而 Guest 的页表则无需变动。
内存半虚拟化技术通过使用页表写入法实现虚拟化。Guest OS 在创建一个新的页表时,会向VMM注册该页表。之后在 Guest 运行的时候,VMM 将不断的管理和维护这个表,使Guest 上面的程序能直接访问到合适的地址。
 内存硬件辅助虚拟化技术通过扩展页表EPT(extended page table)实现虚拟化。
 EPT通过使用硬件虚拟化技术,使其能在原有的页表的基础上,增加一个EPT页表,用于记录GPA到MA的映射关系。VMM预先把EPT页表设置到CPU中。Guest 修改Guest 页表,无需VMM干预。地址转换时,CPU 自动查找两张页表完成 Guest 虚拟地址到机器地址的转换,从而降低整个内存虚拟化所需的开销。

IO虚拟化:服务器单个千兆以太网端口肯定能够支持单个应用,但是当被分割为10个、15个或者更多的服务器负载时(这其中包括网络、存储以及服务器之间的流量)可能就不够用了。当遇到I/O瓶颈时,CPU会空闲下来等待数据,计算效率会大大降低--I/O瓶颈最终会打败虚拟化所带来的资源使用效率的提升。故虚拟化也必须扩展至I/O系统,在工作负载、存储以及服务器之间动态共享带宽,能够最大化地利用网络接口。通过缓解服务器I/O潜在的性能瓶颈,服务器能够承载更多的工作负载并提升其性能。

常见的IO虚拟化主要有三种方案:基于软件模拟的方案,这种方案里, 中断、DMA的访问都是通过软件实现的,优点是可以模拟任何硬件的模型,缺点是性能不会太好;半虚拟化技术,主要是为了解决软件模拟性能问题,比如串口对性能要求不高可以采用软件模拟,但是磁盘设备、网卡设备对性能要求高,主流方案是采用半虚拟化技术,前后端相互感知,通过Shared Memory控制请求的传输,两个设备之间的通知也是基于快速消息传递,性能很高;设备直通模式,比如PCIE的直通、网卡SROV直通,对性能更高的可以采用此模式,可以达到和物理机上直接使用接近的性能,但是设备和虚拟机的耦合会对管理造成影响

Linux目前流行的开源虚拟化技术解决方案:主机虚拟化:Type-I:Xen;Type-II:kvm,virtualbox。容器级虚拟化:lxc(Linux Container),docker,libcontainer,openvz(VMS)等等

Xen(半虚拟化)

Xen由XenSource开发, 一个开源免费的操作系统级准虚拟技术. 回顾一下半虚拟技术, Hypervisor和操作系统共同协作, 虽然操作系统需要做一些修改, 但是性能上比较接近于原始性能.
Xen需要与系统共同协作(客户操作系统需要修改), 只有打过补丁的系统才能使用Xen. 从Linux角度来看, Linux本身是开源的, 结果是Xen的性能要好于全虚拟化技术. 但是从系统支持(比如支持其它非开源的操作系统)的角度来看, 这显然是一个不足之处.
在Xen上可以运行Windows客户机, 但需要Intel Vanderpool或AMD Pacifica处理器的支持. 其它支持的操作系统包括Minix, Plan 9, NetBSD, FreeBSD, 和OpenSolaris.

KVM虚拟化技术

KVM是基于x86架构上Linux操作系统的全虚拟化解决方案,kvm就工作在内核环境之中,所以它的执行效率很高,它需要Intel VT-x和AMD AMD-v的技术支持。
KVM的组件:
两类组件:
/dev/kvm:工作为Hypervisor,在用户空间中可以通过ioctl()系统调用与内核中的kvm模块进行交互,从而完成虚拟机的创建、删除、启动、停止等各种管理功能;
qemu-kvm进程:工作于用户空间,用于实现IO设备的模拟,也是kvm进行各种IO访问的加速器;
kvm模块被装载至内核,系统的运行模式:
Hypervisor模式:装载了kvm模块的原操作系统内核,将运行为Hypervisor模式;
用户模式:Host OS的原用户模式,用于代Guest OS发送IO请求;
内核模式:Guest OS执行IO类的操作或其他特殊指令操作时的工作模式;也被称为"Guest-Kernel"模式;
来宾模式:Guest OS的用户模式,用于所有的非IO类请求;