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则由于新起,没有对之前版本的兼容问题,以轻快的形象受到越来越多人的追捧。
写一篇新的。
其实现在云计算这么流行,并不是技术上有什么突破,只是服务方式或者思维的一种转变得到了大家的认可,趁着互联网化的风潮,云计算以其基础性地位得到很大的重视,
说云计算,肯定绕不开虚拟化, 云计算不等于虚拟化,二者不是一个层面的东西,但是虚拟化是云计算的重要部分;虚拟化和虚机又是两回事,但是虚机是虚拟化在云
计算中给人最直观感受的东西;其实什么是虚拟化?这个很难回答,虚拟化也分为很多层次或者方面,比如计算虚拟化,网络虚拟化,存储虚拟化等等,单就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则由于新起,没有对之前版本的兼容问题,以轻快的形象受到越来越多人的追捧。
相关文章推荐
- Linux个人常用命令
- linux命令之who、w、whoami
- Ubuntu 12.10安装交叉编译器arm-none-linux-gnueabi-gcc
- CentOS_Linux搭建ftp服务器详细教程
- Linux 安装phpsysinfo
- Linux上边安装java
- 如何使用Linux lsblk命令列出块设备信息
- Linux命令之df
- linux命令gpasswd -a和usermod -g的区别
- centos7修改主机名hostname
- 在linux终端下打开pdf文件
- 【面试】58同城-Linux后台开发实习生
- wget命令
- linux udp通讯发包最少代码
- 【马哥linux学员学习笔记】zabbix实现微信报警
- Tickr:一个开源的 Linux 桌面 RSS 新闻速递应用
- linux动态库路径配置
- Linux文件传输scp和rsync断点续传
- Linux下安装过程中编译PHP时报错:configure: error: libjpeg.(a|so) not found
- CentOS6.5 单独编译安装PHP gd库扩展