本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。

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

我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。


我的公众号 「Linux云计算网络」(id: cloud_dev) ,号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎大家关注。

KVM 初探的更多相关文章

  1. KVM初探之一--存储池与存储卷,使用virt-install创建虚拟机

    在机器上装了一个Centos6.2用来测试KVM,对比Windows下的VMware worstation,KVM功能强大,定制性高,只要入了门,绝对是功能强大.用来作云计算不错.不过就是操作性差了点 ...

  2. [原] KVM 虚拟化原理探究(1)— overview

    KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...

  3. 基于本地存储的kvm虚拟机在线迁移

    基于本地存储的kvm虚拟机在线迁移 kvm虚拟机迁移分为4种(1)热迁移基于共享存储(2)热迁移基于本地存储(3)冷迁移基于共享存储(4)冷迁移基于本地存储 这里介绍的是基于本地存储的热迁移 动态块迁 ...

  4. [原] KVM 虚拟化原理探究 —— 目录

    KVM 虚拟化原理探究 -- 目录 标签(空格分隔): KVM KVM 虚拟化原理探究(1)- overview KVM 虚拟化原理探究(2)- QEMU启动过程 KVM 虚拟化原理探究(3)- CP ...

  5. [原] KVM 虚拟化原理探究(6)— 块设备IO虚拟化

    KVM 虚拟化原理探究(6)- 块设备IO虚拟化 标签(空格分隔): KVM [toc] 块设备IO虚拟化简介 上一篇文章讲到了网络IO虚拟化,作为另外一个重要的虚拟化资源,块设备IO的虚拟化也是同样 ...

  6. [原] KVM 虚拟化原理探究(5)— 网络IO虚拟化

    KVM 虚拟化原理探究(5)- 网络IO虚拟化 标签(空格分隔): KVM IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输 ...

  7. [原] KVM 虚拟化原理探究(4)— 内存虚拟化

    KVM 虚拟化原理探究(4)- 内存虚拟化 标签(空格分隔): KVM 内存虚拟化简介 前一章介绍了CPU虚拟化的内容,这一章介绍一下KVM的内存虚拟化原理.可以说内存是除了CPU外最重要的组件,Gu ...

  8. [原] KVM 虚拟化原理探究(3)— CPU 虚拟化

    KVM 虚拟化原理探究(3)- CPU 虚拟化 标签(空格分隔): KVM [TOC] CPU 虚拟化简介 上一篇文章笼统的介绍了一个虚拟机的诞生过程,从demo中也可以看到,运行一个虚拟机再也不需要 ...

  9. [原] KVM 虚拟化原理探究(2)— QEMU启动过程

    KVM 虚拟化原理探究- QEMU启动过程 标签(空格分隔): KVM [TOC] 虚拟机启动过程 第一步,获取到kvm句柄 kvmfd = open("/dev/kvm", O_ ...

随机推荐

  1. python常用数据结构

    0. 字典初始化 d = {'a':1,'b':2} 或 d={} d['a'] = 1 d['b'] = 2 是不是和json格式数据很相似,语法和JavaScript又很相似 1. 变量接受序列分 ...

  2. 秒表计时器以及Stopwatch

    Stopwatch:秒表计时器,用来记录程序的运行时间,通常用来测试代码在时间上的执行效率.(需要引用:System.Diagnostics.) Stopwatch sw=new Stopwatch( ...

  3. Bone Collector-HDU

    Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like ...

  4. 2723:不吉利日期-poj

    2723:不吉利日期 总时间限制:  1000ms 内存限制:  65536kB 描述 在国外,每月的13号和每周的星期5都是不吉利的.特别是当13号那天恰好是星期5时,更不吉利.已知某年的一月一日是 ...

  5. 使用 Bundle 在 Activity 之间交换数据

    [toc] 使用 Bundle 在 Activity 之间交换数据 场景 当一个 Activity 启动另一个 Activity 时,常常会有一些数据需要传过去.因为两个 Activity 之间本来就 ...

  6. iOS11UINavigationBar的item左右间距调整

    相信很多同学都知道在iOS7之后调整导航栏两侧按钮距离左右间距,其实就是在左右barButtonItem的数组中添加一个宽度为负的占位item. - (void)addLeftBarButtonIte ...

  7. C语言结构体1.1

    结构体组成 struct 结构体名: 类型名  成员名: 建立结构体 结构体名 类型名 { 成员: }: 建立一个关于学生信息的结构体(名字,年龄,性别,学号,成绩): 结构体定义 //结构体声明 s ...

  8. ##7.Dashboard web管理界面-- openstack pike

    ##7.Dashboard web管理界面 openstack pike 安装 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ##.Dashboard ...

  9. codeforces 893D Credit Card 贪心 思维

    codeforces 893D Credit Card 题目大意: 有一张信用卡可以使用,每天白天都可以去给卡充钱.到了晚上,进入银行对卡的操作时间,操作有三种: 1.\(a_i>0\) 银行会 ...

  10. 利用nginx实现负载均衡和动静分离

    1.Nginx介绍 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器 . Nginx 是由 ...