一、概述
虚拟化是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而且不影响,从而显著的提高工作效率。
虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程。CPU的虚拟化技术可以单CPu模拟多CPU并行,允许一个平台运行多个操作系统,并且应用程序都可以在相互独立的空间运行而互不影响,从而显著提高计算机的工作效率
二、虚拟化的类别
1、模拟emulation(底层和模拟架构不需要一致);通过软件模拟是需要模拟环境Ring0/1/2/3层;但是性能差;所以使用相对较少
硬件-->Host-->VMM(emulation)-->Virtulization host
虚拟机执行操作(3)-> 虚拟机内核态(0)->物理机用户态(3)->物理机内核态(0)—>物理机用户态(3)->虚拟机内核态(0)->虚拟机用户态返回结果
2、完全虚拟化(full-virtualization):只虚拟出换Ring0(以CPU虚拟化来说明)
BT:二进制翻译技术(Binary Translate);将模拟的CPU直接翻译成特权指令;限定虚拟结构平台和底层物理架构必须保持一致。基于软件的完全虚拟化。
优点:不用修改GuestOS内核可以直接使用;应用广泛
缺点:在VMM捕获特权指令和翻译过程会导致性能下降
在虚拟机用户态和内核态之间直接添加一个BT将一部分用户态的命令直接转化为内核态的命令,直接运行到物理机的内核上。加快了速度,但是需要虚拟机和物理机结构一致
3、硬件辅助虚拟化:5个指令环;在环0的底层增加环-1;环0的特权指令给了环-1;HVM(hardware virtulization machine );属于硬件的完全虚拟化
物理机特权指令(system call)运行在-1环,而虚拟机的指令直接运行到物理机的环0,简化了指令运行的步骤。(但是虚拟机构架和物理机构架需一样)
4、半虚拟化(para-virtulization):Guest明确知道自己运行在虚拟机上;在执行特权指令时直接向hyper call调用;省去了特权指令的翻译过程
优点:相对完全虚拟化;性能高;省去了特权指令的翻译过程
缺点:需要GuestOS内核的修改;应用有限制
虚拟化软件直接通过虚拟化软件的hyper call,省去了特权指令的翻译过程
5、(容器技术)OS级别的虚拟化:硬件-->OS kernel --> 多个用户空间
性能高效,隔离性差,一个用户空间的崩溃导致其他用户空间内核崩溃
6、内存虚拟化KVM(Kernel Virtual Machine) , 作为开源的内核虚拟机,越来越受到 IBM,Redhat,HP,Intel 等各大公司的大力支持,基于 KVM 的开源虚拟化生态系统也日益完善。而实现 KVM 虚拟化,使客户机高效地、安全地使用宿主机的内存资源,就必须实现内存的虚拟化。
二、客户机物理地址空间
为了实现内存虚拟化,让客户机使用一个隔离的、从零开始且具有连续的内存空间,KVM引入一层新的地址空间,即客户机物理地址空间(Guest Physical Address,GPA),这个地址空间并不是真正的物理地址空间,他只是宿主机虚拟地址空间在客户机地址空间的一个映射。对客户机来说,客户机物理地址空间都是从零开始的连续地址空间,但对于宿主机来说,客户机的物理地址空间并不一定是连续地址空间,客户机物理地址空间有可能映射在若干个不连续的宿主机地址区间,如下图所示:
由于客户机物理地址不能直接用于宿主机物理MMU(内存管理单元)进行寻址,所以需要把客户机物理地址转换成宿主机虚拟(Host Virtual Address,HVA),为此,KVM用一个kvm_memory_slot数据结构来记录每一个地址区间的映射关系,此数据结构包含了对应此区间的其实客户机页帧号(Guest Frame Number ,GFN)映射的内存页数目以及起始宿主机虚拟地址。于是KVM就可以实现对客户机物理地址到宿主机虚拟地址之间的转换,也即首先根据客户机物理地址找到对应的映射区间,然后根据此客户机物理地址在此映射区间的物理地址之间的转换,也即GPA到HPA的转换。
实现内存虚拟化,最主要的是实现客户机虚拟地址(Guest Virtual Address,GVA)到宿主机物理地址之间的转换。根据上述客户机物理地址到宿主机物理地址之间的转换以及客户机页表,即可实现客户机虚拟地址空间到客户机物理地址之间的映射,也即GVA到HPA的转换。显然通过这种映射方式,客户机的每次访问都需要KVM接入,并由软件进行多次地址转换,其效率是非常低的。因此为了提高GVA到HPA转换的效率,KVM提供了两种实现方式来进行客户机虚拟地址到宿主机物理地址之间的直接转换。其一是基于纯软件的方式实现的,也即通过影子页表(Shadow Page Table)来实现客户虚拟地址到物理地址之间的直接转换。其二是基于硬件对虚拟化的支持,来实现两者之间的转换。
三、影子页表
由于宿主机MMU不能直接装在客户机的页表来进行内存访问,所以当客户机访问宿主机物理内存时,需经过多次的地址转换。也即首先根据客户机页表吧客户机虚拟地址转传成客户机物理地址,然后再通过客户机物理地址到宿主机虚拟地址之间的映射转换成宿主机虚拟地址,最后再根据宿主机页表吧宿主机虚拟地址转换成宿主机物理地址。而通过影子页表,则可以实现客户机虚拟地址到宿主机物理地址的直接转换。如下图所示
影子页表简化了地址转换过程,实现了客户机虚拟地址空间的直接映射。但是由于客户机中每个进程都有自己的虚拟地址空间,所以KVM需要为客户机中的每个进程页表都要维护一套相应的影子页表。在客户机访问内存时,真正被装入宿主机MMU的时客户机当前页表所对应的影子页表,从而实现了从客户及虚拟地址和宿主机物理地址之间的映射,也因此提高了缓存的效率。
四、网络虚拟化
1、nat virbr0
虚拟机能与宿主机相连,虚拟机之间可以正常通讯,并且虚拟机可以通过NAT(地址转换)的方式与其他主机通讯(SNAT)
2、hostonly virbr1
虚拟机只能与宿主机相连,虚拟机之间可以正常通讯
3、bridg br0
虚拟机和宿主机物理网卡接到一起,可以和其他主机及虚拟机通讯