CPU分为4个级别:Ring0-3
虚拟化的操作系统:hypervisor/VMM
CNA、ESXI
计算虚拟化的矛盾
OS必须处在Ring0,而guest os又不能处于Ring0,这是从虚拟机不能直接操作底层硬件,如果直接操作会对系统环境造成破坏这一角度去看的。
而特权指令都放在0级别,普通指令放在3级别,由于上述的矛盾,guest os只能放在Ring 3级。
解决虚拟化难点的方式:全虚拟化、半虚拟化、硬件辅助虚拟化
经典的虚拟化方法主要使用特权解除(Privilege deprivileging)和陷入-模拟(Trap-and-Emulation)的方式。即:将guest os运行在非特权级(特权解除),而将VMM(Virtual Machine Monitor)运行于最高特权级(完全控制系统资源)。解除了guest os的特权后,guest os的大部分指令仍可以在硬件上直接运行,只有当执行到特权指令时,才会陷入大VMM模拟执行(陷入-模拟)。CPU运行模式分内核态与用户态:客户操作系统运行在用户态;VMM运行在内核态。Ring 0的特权性体现在稍有不慎的修改系统的关键就有可能导致系统崩溃。也是用于驱动物理设备。
CPU虚拟化
全虚拟化(full-v):性能差,全部由hypervisor实现。
半虚拟化(PV):虚拟机知道自己是虚拟机,并且对19条敏感指令进行修改,hypervisor提供hypervisor call给虚拟机调用。性能会提升很多。缺点是只能linux,并且难度大。
硬件辅助虚拟化(HVM):用的最多,性能最好。开机进BIOS,打开CPU选项中的VT-x或者AMD-v。在硬件辅助虚拟化中,在ring0 之上加了一个ring -1,ring -1拥有root权限,放hypervisor。这时ring 0是没有特权指令的,特权指令都在ring -1。因此我们虚拟机就可以使用原来的ring级别,工作在ring 0。一旦要执行特权指令,硬件可以直接参与中断。
内存的虚拟化:从MA机器地址翻译到PA,在从PA翻译到VA。而MMU只能参与一次,需要软件模拟MMU。
HVM参与翻译,那么MMU就只需要翻译一次即可。
IO虚拟化
现实中的外设资源是有限的,为了满足多个客户机操作系统的需求,VMM必须通过I/O虚拟化的方式来复用有限的外设资源。
VMM截获客户操作系统对设备的访问请求,然后通过软件的方式模拟真实设备来实现。
虚拟化的本质:分区、隔离、封装、相对于硬件独立。
虚拟机以文件的形式存放。VMDK、VHD。
考虑一种情况,有20台虚拟机都以文件的形式放在一个硬盘中,那么在这20台虚拟机同时进行虚拟硬盘的IO操作时,我们这个硬盘的IO并发量就很大,性能就会变差。
这样考虑,我们之间不以文件系统形式存放,而是将一整块硬盘做成多个逻辑卷,每个卷还是块设备,只是没有文件系统,这样就少了一层转换,性能就会好一点,还可以实现一块虚拟硬盘对应一块逻辑卷。但性能还是只能提升一点点,同时IO带来的高并发IO还是没有解决。
好的解决方法就是使用SAN存储(存储区域网络storage area network)。可以走IP协议、也可以走FC协议。使用了这种方法后,就可以在SAN里面划分出多个LUN,将这些LUN单独映射给这些虚拟机之后,虚拟机看到的就是一个块设备。这样,只要网络带宽没问题,那IO就没问题。这就叫做IO直通技术。
IO虚拟化也分为:FV、PV、直通IO(HVM)
其中,IO半虚拟化(PV)场景下,给虚拟机打上一个特殊的驱动,这个特殊的驱动叫做PV Driver,或者叫VirtIO。打了这个驱动之后,虚拟机的半虚拟化就会直接去对真实硬件驱动发起调用,这里也是用的hyper call。
如果这里使用的是网卡,而网卡是有限的,这意味着硬件辅助虚拟化带来的IO直通技术是有限制的,但是性能最好。
IO半虚拟化需要安装PV Driver(就是挂载Tools):1、安装PV driver,2、安装UVP Tools。(只装PVdriver只能实现半虚拟化,而装了UVP Tools还可以看到配置信息)
因此,目前虚拟化一般使用技术是这样的:
CPU:HVM
IO:PV(半虚)
虚拟化类型介绍
1.
2.
3.XEN
前后端驱动模型:通过前端驱动把IO发到后端驱动中,driver放在xenstore里面,当后端驱动接收到IO请求之后,直接调用真实驱动下发IO。因此,所有的IO全部要经过Dom0,因此,Dom0是有配置要求的。
/usr/bin/modifyUVPSpec.sh可以修改dom0参数
Dom0通过第三方软件来模拟硬件—QEMU。它可以模拟硬件。qemu-image可以模拟出磁盘镜像之类的。
在Xen使用的方法中,没有指令翻译。这是通过两种方法之一实现的。第一,使用一个能理解和翻译虚拟操作系统发出的未修改指令的CPU(此方法称作完全虚拟化或full virtualization)。另一种,修改操作系统,从而使它发出的指令最优化,便于在虚拟化环境中执行(此方法称作准虚拟化或paravirtualization)。
在Xen环境中,主要有两个组成部分。一个是虚拟机监控器(VMM),也叫hypervisor。Hypervisor层在硬件与虚拟机之间,是必须最先载入到硬件的第一层。Hypervisor载入后,就可以部署虚拟机了。在Xen中,虚拟机叫做“domain”。在这些虚拟机中,其中一个扮演着很重要的角色,就是domain0,具有很高的特权。通常,在任何虚拟机之前安装的操作系统才有这种特权。
Domain0要负责一些专门的工作。由于hypervisor中不包含任何与硬件对话的驱动,也没有与管理员对话的接口,这些驱动就由domain0来提供了。通过domain0,管理员可以利用一些Xen工具来创建其它虚拟机(Xen术语叫domainU)。这些domainU也叫无特权domain。这是因为在基于i386的CPU架构中,它们绝不会享有最高优先级,只有domain0才可以。
在domain0中,还会载入一个xend进程。这个进程会管理所有其它虚拟机,并提供这些虚拟机控制台的访问。在创建虚拟机时,管理员使用配置程序与domain0直接对话。
来自 <https://baike.baidu.com/item/Xen/11050512>
容器与虚拟机