KVM架构及模块简介
1.简介
2.架构
3.KVM模块及QEMU
一、简介
KVM(Kernel Virtual Machine)基于内核的虚拟机。阿维·齐维迪(Avi Kivity)在一家名为Qumranet的初创企业开始了KVM的研发工作,开发人员基于Linux Kernel通过加载新的模块使Linux Kernel本身变成一个Hypervisor(管理程序),后KVM模块源代码成为Linux内核源代码的一部分。随后此公司于2008年被红帽公司收购,于是redhat在自己的产品中用KVM替换了Xen。
KVM目前的设计为:通过可加载的内核模块支持客户机操作系统(Linux、Solaris、Windows等等)。
KVM的架构中,虚拟机的实现为常规的Linux进程,由标准的调度程序进行调度。
二、架构
从虚拟机的基本架构上来区分,一般分为两种。
类型一:可以视为特别为虚拟机优化裁剪的操作系统内核。虚拟机监控程序运行在底层软件层,实现系统的初始化、物理资源的管理等操作系统的职能。这一类型的虚拟机监控程序一般会提供一个具有一定特定权限的特殊虚拟机,这个特殊虚拟机运行用户日常操作系统和管理使用的操作系统环境。如:Xen、VMware ESXI和Hyper-V。
类型二:虚拟机监控程序依赖操作系统来实现管理和调度,也会受到宿主操作系统的一些限制。无法为了虚拟机的优化而改变操作系统。如:VMware Workstation、VirtualBox。
而KVM是基于宿主操作系统的类型二的虚拟机。(如果说在windows下使用VMware Workstation,这个就可以类比为在Linux下的VMware Workstation。只不过KVM是通过内核模块的形式实现,充分利用Linux内核既有的实现,最大限度的重用代码。)
左侧是标准的Linux操作系统,KVM内核模块在运行时按需加载进入内核空间运行。KVM本身并不进行任何模拟。相反,它暴露出一个/dev/kvm接口,需要用户空间程序通过借口设置一个客户机虚拟服务器的地址空间,向他提供模拟的I/O,并将它的视频显示映射回宿主的显示屏,目前这个应用程序就是QEMU。
三、KVM模块及QEMU
KVM模块
KVM模块是KVM虚拟机的核心部分。KVM仅支持硬件虚拟化。其主要功能是初始化cpu硬件,打开虚拟化模式,然后将虚拟客户机运行在虚拟机模式下,并对虚拟客户机的运行提供一定的支持。
以KVM在Intel的CPU上运行为例,在被内核加载的时候,KVM模块会先初始化内部的数据结构;之后KVM模块检测系统当前的CPU,然后打开CPU控制寄存器CR4中的虚拟化模式开关,并通过执行VMXON指令将宿主操作系统置于虚拟化模式的根模式;最后KVM模块创建特殊设备文件/dev/kvm并等待来自用户空间的命令。接下来虚拟机的创建和运行是一个用户空间程序(QEMU)和KVM模块互相配合的过程。
QEMU
QEMU是一个开源的虚拟机纯软件的实现,性能低下。但是其优点是支持本身编译运行的平台上就可以实现虚拟机的功能,甚至虚拟机可以与宿主机不同架构。QEMU代码中有着整套虚拟机的实现,包括处理器、内存虚拟化以及虚拟设备模拟(比如网卡、显卡、存储控制器及硬盘等。)
虚拟机运行期间,QEMU会通过KVM模块提供的系统接口调用进入内核,由KVM模块将虚拟机至于处理器的特殊模式运行。遇到虚拟机输入输出操作,KVM模块会从上次系统调用的接口返回给QEMU,由QEMU来负责解析和处理这些设备。从QEMU角度看,可以说QEMU使用了KVM模块的虚拟化功能,为自己的虚拟机提供硬件虚拟化的加速,极大提高虚拟机的性能。虚拟机的配置和创建,运行依赖的虚拟设备,用户操作环境和交互,以及一些特殊功能(如动态迁移),都是由QEMU自己实现的。QEMU和KVM模块两者的结合无疑是最合适的选择。而qemu-kvm是为了KVM专门做了修改和优化的QEMU分支。
KVM架构及模块简介的更多相关文章
- Qt5模块简介
原文链接:Qt5 模块简介 无意中看到这篇文章,虽然讲的不是经常用的东西,但是看了这篇文章之后,可以对qt有个大致的了解,能够清晰的知道自己想要什么,应该关注那一部分,学习了,相信以后会又很大 ...
- Qt 学习之路 2(6):Qt 模块简介
Home / Qt 学习之路 2 / Qt 学习之路 2(6):Qt 模块简介 豆子 2012年8月26日 Qt 学习之路 2 20条评论 Qt 5 与 Qt 4 最大的一个区别之一是底层架构 ...
- 常见Struts、Hibernate、Spring、J2EE、ibatis、Oracle等开发框架架构图及其简介
各种系统架构图及其简介 转载请保留出处,不胜人生一场醉汇总. 以下文字和架构图均在本人相关系统设计和架构方案中有所应用. 原文出处:http://space.itpub.net/6517/viewsp ...
- XEN与VMware ESXi、Hyper-V 以及 KVM 架构与特点比较【非原创】
XEN与VMware ESXi.Hyper-V 以及 KVM 架构与特点比较 2018年06月03日 12:47:15 Kim_Weir 阅读数 9402收起 分类专栏: 云计算 版权声明:本文为 ...
- Python::OS 模块 -- 简介
OS 模块简介 OS模块是Python标准库中的一个用于访问操作系统功能的模块,OS模块提供了一种可移植的方法使用操作系统的功能.使用OS模块中提供的接口,可以实现跨平台访问.但是在OS模块中的接口并 ...
- 简述KVM架构和Xen架构
暑假最后一篇更新,因为,,,明天我就回学校了. 以下均为个人理解,如果有不对的地方还望各位dalao不吝赐教. 虚拟化 虚拟化是通过Hypervisor程序实现的,Hypervisor的作用是将硬件虚 ...
- Python 的 six模块简介
Python 的 six模块简介 six : Six is a Python 2 and 3 compatibility library Six没有托管在Github上,而是托管在了Bitbucket ...
- signal模块简介
signal模块简介 最近在看Linux signal 相关内容,signal可以被用来进程间通信和异步处理.Python标准库提供了signal包可以用来处理信号相关.这里讨论的是Unix系统中Py ...
- socketserver模块简介
1. socketserver模块简介 在python的socket编程中,实用socket模块的时候,是不能实现多个连接的,当然如果加入其 它的模块是可以的,例如select模块,在这里见到的介绍下 ...
随机推荐
- VS2015安装水晶报表
最近在做一个打印功能,本来是不想用水晶报表的.想直接用微软原生的报表rdlc完成,但是整了一个上午老是打印乱码,且网上找资料找也找不出. 无奈放弃,然后就想到用水晶报表了,以前用过水晶报表,不过一直都 ...
- 基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil
基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil,把日常能用到的各种CRUD都进行了简化封装,让普通程序员只需关注业务即可,因为非常简单,故直接贴源代码,大家若需使用可以直 ...
- Aooms_微服务基础开发平台实战_002_工程构建
一.关于框架更名的一点说明 最近在做年终总结.明年规划.还有几个项目需要了结.出解决方案,事情还比较多,死了不少脑细胞,距离上一篇文章发出已经过了3天,是不是有些人会认为我放弃了又不搞了,NONO,一 ...
- IDEA写scala简单操作
今天尝试了一下在IntelliJ IDEA里面写Scala代码,并且做到和Java代码相互调用,折腾了一下把过程记录下来. 首先需要给IntelliJ IDEA安装一下Scala的插件,在IDEA的启 ...
- [MySQL] mysql int后面的数字与前导零填充
1.int或者tinyint等数值型字段的存储范围已经是固定的,和类型相关2.后面的数字只与显示有关,并且是在开启了zerofill前导零填充的前提下 3.显示的时候,在前面用0补全了 create ...
- [前端]css前端样式的模块化
css样式文件结构( 模块划分的单入口 ) common|_ _ _ _ _ _reset.css|_ _ _ _ _ _common.css 公用样式 libs|_ _ _ _ _ _bootstr ...
- Spring Boot admin 2.0 详解
一.什么是Spring Boot Admin ? Spring Boot Admin是一个开源社区项目,用于管理和监控SpringBoot应用程序. 应用程序作为Spring Boot Admin C ...
- C++系列总结——构造与析构
前言 在使用资源前,我们需要做一些准备工作保证资源能正常使用,在使用完资源后,我们需要做一些扫尾工作保证资源没有泄露,这就是构造与析构了,这和编程语言是无关的,而是使用资源的一种方式.C++只不过是把 ...
- java压缩文件解压:调用WinRAR5命令强于自己写代码实现
最近,手上维护着一个几年前的系统,技术是用的JSP+Strust2,系统提供了rar和zip两种压缩格式的解压功能,后台是用java实现的 1.解压rar格式,采用的是java-unrar-0.3.j ...
- 设置Editext的光标宽高与颜色
在Editext的布局属性上加上 android:textCursorDrawable="@drawable/cursor_shape" cursor_shape如下: <? ...