您的位置:首页 > 运维架构 > Linux

from linux kernel to kvm -- kinds of hypervisor

2015-08-24 13:32 316 查看
标题留在这里,但是最近一直太忙, 没有时间来管blog,今天补上,内容都是我自己的理解,不一定完全正确,就像前面的文章一样,可能到后来我自己的理解变了,我又会

写一篇新的。

其实现在云计算这么流行,并不是技术上有什么突破,只是服务方式或者思维的一种转变得到了大家的认可,趁着互联网化的风潮,云计算以其基础性地位得到很大的重视,

说云计算,肯定绕不开虚拟化, 云计算不等于虚拟化,二者不是一个层面的东西,但是虚拟化是云计算的重要部分;虚拟化和虚机又是两回事,但是虚机是虚拟化在云

计算中给人最直观感受的东西;其实什么是虚拟化?这个很难回答,虚拟化也分为很多层次或者方面,比如计算虚拟化,网络虚拟化,存储虚拟化等等,单就IT领域来说,我

理解的虚拟化是:逻辑上对资源的划分,使得划分之后的逻辑个体具有资源所有的属性并互相隔离,同时逻辑的划分是可控的。

如何进行划分,如何控制并隔离事实上就是不同虚拟化技术的技术差异,虚拟化的实现方式可以从系统内核到应用软件的实现方式,在不同层面实现有效率差异,难易差异

等等,虚拟机以实现难度,对IT格局改变重要性上成为IT重要的一环。

讲了一堆废话都是为了引出虚拟化,特别是os虚拟化在云计算中的地位,IT早期,一套硬件设备上(这么说只得是一块主板上,总线,CPU,南北桥,内存,外设等)装

一个操作系统(后来的双系统和这个完全不是一回事,从bootloader中选择之后,硬件设备上本质上还是运行的一个OS),随着硬件设备性能的提升,CPU日益强大,内存提升

等,一个用户(或一组用户)使用一个OS,往往会造成资源的极大浪费,据统计,平均的硬件资源利用率也就20%-30%,大量闲置,既然这样,一台server要是可以当

4台用,硬件资源差不多就能跑满,省了三台server的钱了,商机出现了。

虚拟机的概念出现的很早,老大哥IBM很早之前就在弄,真正让这个行业飞速发展的却是vmware和citrix, 也就是大家熟知的exsi和xen,用过的都知道,这儿有个词,就是

hypervisor,我理解为操作系统的操作系统。它运行再硬件之上,而虚拟出来的OS(称之为客户机,guest OS
abd2
)运行再hypervisor之上,hypervisor是如何让guest做到隔离,

并能高效利用硬件资源的呢?出现了不同的技术方案:

btw:这里提一句,还有一个词是VMM,virtual machine manager,有人认为hypervisor就是vmm,这个其实不台准确,VMM是hypervisor最重要的部分。

可能需要说到os kernel上,现代os 设计上,为了保证kernel的稳定,不至于应为应用程序的崩溃而使得kernel crash掉,会做两件事,一是micro core,微内核,

尽量减小内核,而是分特权级,让内核运行再较高特权级(一般是0),而系统程序和应用程序则根据不同计算机体系结构略有差异,比如(intel属于CISC,复杂指令

集,有1-3权限级别,而IBM的power等RISC,简单指令集,只分user-kernel两种),这种分层,使得用户不得直接使用特权指令,而必须通过中断,让os kernel执行。

hypervisor的出现打破了原有os kernel运行再Ring 0的规则,怎么办呢?

其实好办,guest os对特权指令的调用会发生异常(现在已经不再Ring 0运行了),hypervisor捕捉这种异常,陷入 Ring 0执行再返回就可以了。

但现实是,除了特权指令,还有一些敏感指令(具体可以网上查阅),需要使用底层公共资源,也需要陷入Ring 0执行否则会引起guest os之间的冲突,

对RISC来说,所有的敏感指令都是特权指令,所有没有这个问题,但是对intel为代表的CISC,有一部分敏感指令不是特权指令,是可以在Ring 1执行的,

这样就麻烦了,不能靠捕捉异常了

为了解决这个问题,出现了几种方案:

1. 全虚拟化方案,引入了hypervisor之后,又不想改变现有的一切,怎么办:

a. 说白了hypervisor就是运行在Ring 0上的一个os,通过VMM可以拿到guest os的运行指令(可以想象linux kernel中程序是怎么运行的),让这些指令全部在Ring 0

运行,也就没有敏感指令代码的问题了,甚至可以通过翻译,将不同系统结构的指令转化执行,其实这种虚拟化,称之为模拟化更合适,

由于所有的指令都要翻译,效率低下, bochs和qemu 都这么干;

b. 运行前扫描所有的指令,将敏感指令替换为跳转指令,跳转后模拟指令的结果(具体没细看), oracle 的virtual box这么干;

c. 逐段扫描指令,将敏感指令替换为Ring 0特权指令(我比较好奇怎么替换),vmware work station

全虚拟化效率比较低,生成环境中不会使用。

2. 半虚拟化(准虚拟化,超虚拟化),方案1是不想改动现有的东西,如果稍微改动呢,比如改一下OS, 给OS kernel打补丁, Xen和 MS的Hyper-V都是这样,

事实上,MS的Hyper-V在实现上就是参考的Xen的架构。在hypervisor上先动点手脚,暴露出一些系统调用接口用于处理敏感指令,然后将OS中调用敏感指令

的地方改成调用hypervisor的系统接口,比方案1一下子效率高很多,在KVM成熟之前,AWS和国内阿里都用的Xen

3. 有人可能说了,改OS有时候不方便,比如windows这样不开源的OS(只有它自己搞hyper-V), 而且用户也不放心在OS里装些不知道的东西,于是

改指令成为尝试,HVM,硬件辅助虚拟化的出现,引爆了虚拟化的新浪潮。

Intel增加了VMCS数据结构和针对vm的新指令,同时对CPU的操作引入了Root-Operatin和None Root-Operation两种模式,这样hypervisor和guest都运行在

Ring 0-3上,guest和hypervisor通过VMCS数据结构联系起来(linux kernel代码中可以找到它,每个vm对应一个vmcs结构,存于内存中),hypervisor通过对

VMCS的切换就能实现对VM调用的切换,提高CPU利用率。

由于HVM的实现,现代的Xen也不需要改动OS了,KVM则由于新起,没有对之前版本的兼容问题,以轻快的形象受到越来越多人的追捧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: