CPU虚拟化

1 CPU虚拟化:

首先是早期大型机的CPU虚拟化,采用特权解除,和陷入模拟的方法,此方法称为经典虚拟化。
将Guest OS运行在非特权级,VMM运行在最高特权级。
那么此时如果虚拟机发出了敏感指令,会陷入到VMM进行模拟执行,
由VMM向真正的硬件CPU发出特权指令。
经典虚拟化也会结合原始操作系统具有的定时器中断机制,VMM收到一个新的敏感指令会触发中断进行处理,
把它模拟成特权指令发给真正的硬件CPU,如果同时收到两条敏感指令,那么会都模拟,然后依次将特权指令发给CPU处理。

后来X86服务器性能发展的越来越强,人们就想把虚拟化技术运用到X86服务器上来,但是经典虚拟化技术并不能只能拿来在x86上用,
原因是x86的CPU和早期大型机的CPU的指令集架构不同。大型机CPU是RISC精简指令集,x86服务器是CISC指令集,
在RISC架构中,虚拟机的敏感指令是全部包含在特权指令里面的,所以可以正常的进行陷入模拟,
但是在CISC架构里面,有部分敏感指令是不属于特权指令的,不属于ring0,而属于ring1,有19条这样的指令,
那么当这部分指令在发出的时候,VMM就不能捕获到,自然也就没法陷入模拟了,
这称为虚拟化漏洞。
为了解决这个漏洞,提出了三种解决方案:
也就是CPU的全虚拟化和半虚拟化以及硬件辅助虚拟化。

(KVM和Xen都支持)全虚拟:

VMM捕获虚拟机发出的所有指令进行二进制翻译,如果发现指令是特权或者敏感,则进行模拟,调度到CPU的特权级别上执行

(Xen) 半虚拟:

修改GuestOS,让虚拟机自己知道自己是虚拟化的,GuestOS需要发敏感指令时,
会向VMM发起hypercall,告诉VMM去将此命令调度到CPU的特权级别上去执行。

硬件辅助虚拟:

前面两种方法,硬件CPU始终都是不识别虚拟机的指令的,因此可以让硬件CPU直接识别出这些敏感指令,并交给VMM陷入模拟。
这样就大大提高了效率。这也是现在用的最多的虚拟化方式。主流的x86服务器都支持硬件虚拟化。
在这个技术里,为CPU增加了root模式和非root模式,将GuestOS放在非root模式下,VMM运行在root模式下,root模式在CPU的ring0级别之下,
这样特权和敏感指令就自动会在VMM执行。简化了VMM的工作量,提高了效率。

其实主流的虚拟化厂家的技术都支持硬件辅助虚拟化,只不过需要硬件支持。

2 IO虚拟化也同样分为全虚,半虚以及硬件辅助虚拟化。

全虚:模拟出IO设备给虚拟机用,当有IO请求发给虚拟IO设备时,VMM会捕获并交给真实设备处理,
此方法效率低,性能损耗严重。

半虚:半虚拟化需要建立一个特权虚拟机,dom0,在Xen的架构下实现的,其他虚拟机全部称为domU,
domU会有前端驱动,dom0有后端驱动,所有的domU虚拟机的IO请求都会由前端驱动交给dom0上的后端驱动来处理,
分时分通道与真实设备交互处理,之后再把结果返回给domU虚拟机。
这种方法需要对OS作修改,所以只能用开源系统,例如Linux。

硬件辅助虚拟:此方法可以理解为直接将真实IO设备挂载给某台虚拟机使用,设备的IO驱动是直接
安装在虚拟机的GuestOS中的,性能损耗极小,和我们使用物理主机是一样的,效率高。
但是此方法需要硬件的支持。

CPU资源分配

1 关于CPU资源的分配:CPU资源说到底就是时间上的分配。

如果是一个单核CPU的情况下,我们查看任务管理器看到许多应用程序在同时运行,
其实并不是同时运行,在同一时刻,CPU只能运行一个进程,但是呢,CPU将他的时间进行分片,
分发给各个进程,各个进程在轮流调用CPU资源,而这个切换过程是很快的,所以给我们用户感知到的就是CPU在同时处理多个进程,
实际上并不是这样,所以说CPU资源分配说白了就是分配时间。
在任务管理器里面可以看见CPU时间这一栏,这里显示的就是CPU分配给这个程序的时间,而不是我们以为的此程序从打开到现在的运行时间,
只有在使用这个程序的时候,CPU时间才会增加。

2 关于内存虚拟化涉及到两个问题:

一是内存的地址都是从物理地址0开始的,二是内存在分配的时候要求都是连续的。
那么引入虚拟化之后,不同的虚拟机都要使用从开始的地址空间,但是我实际物理资源地址空间从0开始的只有一个,
还有要为虚拟机分配连续的地址空间。
那么以上的问题可以用内存虚拟化技术来解决,它是通过引入了新的一层客户机地址空间,并且在客户机地址空间与真实物理设备地址空间之间形成一个对应的
地址映射表,通过此映射表,可以实现让每个虚拟机都认为自己获得的地址空间都是从开始的。

存储虚拟化

1 虚拟机使用的存储可以从虚拟化存储和非虚拟化存储。

虚拟化的存储,虚拟机的磁盘会对应着一个文件,把磁盘格式化成一个特殊的文件系统,文件系统下磁盘格式多种多样的,
华为的虚拟化场景下常见的.vhd(虚拟化磁盘)文件
KVM——————.qcow2/.iso/.raw等等
而非虚拟化的存储通常对应着一个磁盘的分区

2硬盘分类

硬盘主要分为四种,SAS,SATA,固态,NL-SAS,其中固态性能最好,可靠性一般,价格最贵,
并且寿命没有机械硬盘长。如果对速率要求很大的用户,得使用固态硬盘。

3存储分为集中式和分布式。

所谓集中式就是将所有存储资源聚集在一起然后对外提供一个接口提供服务。集中式存储分为SAN和NAS,
SAN细分为IPSAN,FCSAN,以及FCOESAN(还处于发展阶段),FCSAN和IPSAN比较成熟。

SAN就是一种存储区域网络,是供存储读取和写入的专用网络,独立于业务网络之外的。
其实就是把存储资源通过与主机之间通过某种通信协议连接起来,使其达到可以通过光纤或者网线实现对存储的读写。
NAS就是使用专门的服务器来提供共享的数据存储。

分布式就是不专门把存储资源物理地弄到一起,而是使用每台物理主机上的硬盘全部在逻辑层面整合成一个整体,
整合成一个大的存储资源,这就是分布式。