kvm初探

momenglin momenglin     2023-05-04     654

关键词:

KVM 是业界最为流行的 Hypervisor,全称是 Kernel-based Virtual Machine。它是作为 Linux kernel 中的一个内核模块而存在,模块名为 kvm.ko,也可以看作是一个进程,被内核调度并管理,从 Linux 2.6.20 版本开始被完全正式加入到内核的主干开发和正式发布代码中。 KVM 主要用于管理 CPU 和内存的虚拟化,IO 设备的虚拟化则是由 Qemu 来完成。为什么会有这样的分工,请继续往下看。

KVM 与 Qemu 的前世今生

 

Qemu 是一个纯软件实现的开源「模拟」软件,它能够模拟整套虚拟机的实现,包括 CPU、内存、各种 IO 设备、鼠标、键盘、USB 、网卡、声卡等等,基本上没有它不能模拟的。有人可能会比较疑惑它跟 KVM 之间到底有何关系,我们可以把它们看成是合作关系,好基友,谁都离不开彼此。

 

KVM 离不开 Qemu。KVM 实现初期,为了简化开发和代码重用,在 Qemu 的基础上进行了修改,主要是将比较耗性能的 CPU 虚拟化和内存虚拟化部分移到了内核中实现,保留 IO 虚拟化模块在用户空间实现。这样的做法主要是考虑到性能的原因,CPU 和 内存虚拟化是非常复杂的虚拟化模块,而且使用非常频繁,如果实现在用户空间的话,用户态和内核态的频繁切换势必会对性能造成很大的影响。那为什么要单独保留 IO 虚拟化在用户空间呢,这个也是权衡之下的结果,首先 IO 设备太多了,其次 IO 虚拟化相对其他两个模块使用不是很频繁,开销会小一些,所以,为了尽可能保持内核的纯净性,才有了这样的分配。

Qemu 离不开 KVM。上面也说了,Qemu 是一个纯软件的实现,运行在用户空间,性能非常低下,所以,从 Qemu 的角度,可以说是 Qemu 使用了 KVM 的虚拟化功能,为自身虚拟机提供加速。

早期两者还没有区分(没有同居),KVM 修改的模块叫 qemu-kvm,到 Qemu1.3 版本之后,两者就合二为一了(同居啦),如果我们在用 Qemu 创建虚拟机时,要加载 KVM 模块,需要为其指定参数 --enable-kvm。

     技术图片

 

 

KVM 架构

KVM 是基于硬件虚拟化(Intel VT 或 AMD-V)实现的一套虚拟化解决方案,通过以上一个与 Qemu 关系的分析,我们基本上知道它在虚拟化领域处在一个什么样的地位。它其实只负责 CPU 和内存的虚拟化,不负责任何设备的模拟,而是提供接口给用户空间的 Qemu 来模拟。这个接口是 /dev/kvm

Qemu 通过 /dev/kvm 接口设置一个虚拟机的地址空间,然后向它提供模拟好的 I/O 设备,并将相关的设备回显操作映射到宿主机,完成整个 I/O 设备的虚拟化操作。

技术图片


/dev/kvm 接口是 Qemu 和 KVM 交互的“桥梁”,基本的原理是:/dev/kvm 本身是一个设备文件,这就意味着可以通过 ioctl 函数来对该文件进行控制和管理,从而可以完成用户空间与内核空间的数据交互。在 KVM 与 Qemu 的通信过程主要就是一系列针对该设备文件的 ioctl 调用。

 

我就拿创建虚拟机举个例子,虚拟机本质上是宿主机的一个进程,包括用户态数据结构和内核态数据结构,用户态部分由 Qemu 创建并初始化,内核态部分则由 KVM 来完成,完成后会返回一个文件句柄来代表所创建的虚拟机,针对该文件句柄的 ioctl 调用就可以对虚拟机进行相应的管理,比如建立虚拟机地址空间和宿主机地址空间的映射关系,创建多个线程(虚拟处理器,vCPU)来供虚拟机使用等,对于创建出的 vCPU,也会生成相应的文件句柄,同样,对 vCPU 的文件句柄的 ioctl 调用就可以对 vCPU 进行管理。

VMM 管理工具 —— libvirt

 

目前,虚拟化这个领域可以说是百花齐放,针对不同的场景提出了很多的虚拟化解决方案,KVM、Xen、VMware、VirtualBox、Hyper-V 等等,具体的这些方案有什么特点,可以看前文「虚拟化技术总览」。这么多方案势必有很多通用的模块,不同之处可能在于,与不同硬件厂商的适配上,为了支持更多厂商,以及应用更多的领域,有很多 IaaS 解决方案需要融合多种虚拟化技术。这个时候如果有一个平台类的管理工具就会非常方便,libvirt 就是这样一个工具。

技术图片

libvirt 除了能够支持多种虚拟化方案之外,还支持 OpenVZ、LXC 等容器虚拟化系统。它提供一套完善的虚拟机管理工具,支持 GUI 和命令行的形式,如 virsh、virt-install、virt-manager。由于它的通用性和易管理,很多云计算框架平台都在底层使用 libvirt 的 API 来管理虚拟机,比如 OpenStack、OpenNebula、Eucalyptus 等。这个工具我们仅仅提一下,有兴趣的可以装个玩玩。

 

下面给出 KVM 和 Qemu 的 git 路径,有兴趣的可以把源码下下来研究下。

kvm.git:
git clone git://git.kernel.org/pub/scm/virt/kvm/kvm.git
qemu.git(包括了 kvm):
git clone git://git.qemu-project.org/qemu.git
kvm.git:

 

 

文章参考自公众号小白运维

docker初探

近期虚拟化领域Docker炒的沸沸扬扬,一时间不晓得它究竟是个什么鬼~查阅许久。略微明确了点:1,Docker是一种应用虚拟化技术,它是基于Linux内核提供的LXC技术实现的,而传统的虚拟化技术是基于CPU虚拟化的(当然,还有KVM等... 查看详情

网络虚拟化初探

数据包从虚拟机到物理机的过程KVM的网络优化方案,总的思路就是让虚拟机访问物理网卡的层数更少,直至对物理网卡单独占领,和物理机一样使用物理网卡单独占领,和物理机一样使用物理网卡,以达到和物理机一样的网络性... 查看详情

javascript函数初探---闭包初探#1

首先我们来看一个函数:vara=‘globalvariable‘;varF=function(){varb=‘localvariable‘;varN=function(){varc=‘innerlocal‘;returnb}returnN;}cosole.log(b)//b:isnotdefind; 函数F中包含了局部变量b,因此b在全局空间里是不可见得。函数N有自己的私有空间,... 查看详情

javascript对象初探---call()和apply()初探

在javascript中,每个函数都具有call()和apply()两个方法,您可以用她们来触发函数,并指定相关的调用参数。此外,这两个方法还有另一个功能,就是她可以让一个对象去‘借用‘另一个对象的方法,并为己用。这也是一种... 查看详情

servlet源码初探

  年底,公司的事情告一段落,就来捣鼓一下这个Servlet源码,为下一步的spingmvc源码初探做准备1、Servlet接口publicinterfaceServlet{voidinit(ServletConfigvar1)throwsServletException;ServletConfiggetServletConfig();voidservice(ServletRequestvar1, 查看详情

初探postman

第一种:安装postman扩展程序第二种:本地安装postman登陆进来postman的界面发送第一个postman请求将请求保存到集合未完,待续... 查看详情

dfs初探

dfs初探 慕课(视频)pku的dfs例子实现#include<iostream>#include<cstdio>#include<cstring>usingnamespacestd;intpath[11];intarr[11][11];booltag[11];#defineendl‘‘?/*dfs的四个步骤1、定义dfs的功能2、if()结束条件 查看详情

kvm虚拟化之kvm基本管理

KVM虚拟化之KVM管理(二)KVM管理操作virsh是kvm虚拟机常用的管理工具1、virsh命令格式:virsh参数kvm虚拟机名2、virsh常用参数:查看正在运行的KVM虚拟机virshlist查看所有的KVM虚拟机virshlist--all开启KVM虚拟机virshstartcentos7关闭KVM虚拟机vir... 查看详情

c#泛型初探

初探的类:publicclassTClass{///<summary>///int参数///</summary>///<paramname="iParameter"></param>publicstaticvoidShowInt(intiParameter){Console.WriteLine("这里是TClassShowInt{0},类型为{1}" 查看详情

nodejs初探

varhttp=require(‘http‘);varserver=http.createServer(function(req,res){ res.writeHead(200,{"Content-type":"text/html;charset=UTF-8"}); res.end("<h2>我是标题</h2>")});server.listen(3000,"127.0.0 查看详情

lucene初探-查询

lucene初探,是为了后面solr做准备的.如果跳过lucene,直接去看solr,估计有点懵. 由于时间的关系,lucene查询方法也有多个,所以单独出来. 一.精确查询/***获取查找对象*@return*@throwsException*/privateIndexSearchergetSearcher()throwsException{//1.... 查看详情

javascript初探二

//----------总结01.查找dom元素document.getElementById();//通过id获取一个dom元素document.getElementsByClassName();//通过class获取dom数组document.getElementsByTagName();//通过标签名获取dom数组//02.修改dom元素dom.type="text"//type属性dom. 查看详情

原创themida2260虚拟机fish初探

标题: 【原创】Themida2260虚拟机FISH初探(一)作者: xiaohang时间: 2016-03-03,00:39:37链接: http://bbs.pediy.com/showthread.php?t=208207引用:标 题: 【原创】Themida 2260 虚拟机 FISH 初探 查看详情

kvm之实现批量创建kvm虚拟机

KVM之通过virsh制作image实现批量创建KVM虚拟机*******通过KVM虚拟机xml模板文件创建虚拟机(制作一个raw格式的image,并安装ubuntu操作系统)******************一、准备工作1、准备一个KVM虚拟机配置文件模板KVM虚拟机配置文件模板文件已... 查看详情

http传输二进制初探

【转】HTTP传输二进制初探http://www.51testing.com/?uid-390472-action-viewspace-itemid-233993 【转】HTTP传输二进制初探上一篇 / 下一篇  2011-04-1104:34:49/个人分类:知识查看(139) / 评论(0) / 评分(& 查看详情

django初探

一、首先我们用PyCharm来创建一个Django项目终端命令:django-adminstartprojectsitename图形创建: 这样一个Django项目就创建完成了,上面可以看到项目的一个结构接下来创建一个APP二、创建APP进入到项目所在目录执行命令 C:Usersya... 查看详情

cartographerrosforturtlebots初探

今天抽了会时间安装了Cartographer ROSforTurtlebots 系统版本: Ubuntu14.04(Trusty)withROSIndigo,系统是用的TurtleBotISOwiththefollowinglinkandcreatestartupUSBdiskusing StartupDiskCreator orsimilarto 查看详情

semaphore初探

 示例一:packagecom.smbea.demo.semaphore;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.Semaphore;/***Semaphore用于为线程加锁与释放锁*@authorhapday*@2 查看详情