目录

KVM虚拟化架构

KVM是嵌入在Linux操作系统标准内核中的一个虚拟化模块,它能够将一个Linux标准内核转换成为一个VMM,嵌有KVM模块的Linux标准内核可以支持通过kvm tools来进行加载的GuestOS。所以在这样的操作系统平台下,计算机物理硬件层上直接就是VMM虚拟化层,而没有独立出来的HostOS操作系统层。在这样的环境中HostOS就是一个VMM。

每个由KVM创建的GuestOS都是HostOS(或VMM)上的一个单个进程。而在GuestOS上的User-space中运行的Applications可以理解为就是进程中的线程。

需要注意的是:KVM只是虚拟化解决方案的一部分,想要实现全虚拟化,还需要其他的条件:

1. CPU处理器提供的虚拟化支持(VT-x 硬件辅助虚拟化,可以为GuestOS创建虚拟化处理器,本质是对寄存器的隔离模拟和对指令集的划分)。

2. 内存可以通过kvm虚拟化成独立的虚拟化地址(/dev/kvm)

3. I/O虚拟化(QEMU)

==> KVM虚拟化 = KVM内核模块 + /dev/kvm + QEMU

/dev/kvm

Linux操作系统标准内核中的KVM内核模块生成了一个名为/dev/kvm的设备,有了/dev/kvm设备,使得GuestOS的地址空间(内存地址、磁盘地址)能够独立于标准内核或其他任何GuestOS的地址空间。Linux操作系统目录结构包含的/dev目录树下的设备对于所有User-space进程或线程(无论是在GuestOS上,还是在VMM上)来说都是通用的,但是每个打开/dev/kvm设备的不同的进程或线程,所能使用的都是唯一且各不相同的地址映射(为了支持GuestOS间的隔离)。

KVM内核模块通过/dev/kvm设备提供了内存虚拟化,给予GuestOS与内核或者其他GuestOS相对独立的地址空间。每个GuestOS都有自己的地址空间,并且这些地址空间是在实例化GuestOS时创建映射的。映射给GuestOS的物理内存实际上是映射给这个GuestOS在VMM中相应进程的虚拟内存。

有两种支持Guest地址到Host(VMM)地址的转换方法:

  • 应用LinuxOS维护的一组影子页表(shadow page table)
  • CPU也可以通过在访问未经映射的内存位置时使用VMM(主机内核)来支持内存转换进程。

所以总的来说,/dev/kvm设备的作用就是:将不同的GuestOS之间的地址隔离,或将GuestOS和HostOS(VMM)之间的地址隔离

QEMU

QEMU是一个I/O虚拟化解决方案,能够对一个完整的计算机物理层环境进行虚拟化(EG. 磁盘、图形适配器、网络设备)。

在GuestOS中生成的所有I/O请求都会被QEMU中途截获,并重新发送到QEMU进程模拟的User Mode中。

Openstack、KVM、QEMU 的关系

KVM 用来模拟 CPU 的运行,但缺少了对 Network 和 I/O 的支持。QEMU-KVM 是一个完整的模拟器,它基于 KVM 上,提供了完整的 Network 和 I/O 支持。其中 Openstack 为了跨 VM 性,所以不会直接控制 QEMU-KVM,而是通过 libvit 的库去间接控制 QEMU-KVM 。

KVM的虚拟化实现

KVM内核模块为Linux标准内核引入了一种除现有的Kernel ModeUser Mode之外的新进程模式。这种新模式就称为Guest Mode模式,顾名思义,它用来执行GuestOS的代码。

Linux标准内核的执行模式可以针对不同的运行内容和目的进行定义。Guest Mode的存在就是为了执行GuestOS的代码,但是只针对那些非I/O的代码。I/O代码还需要QEMU来作为支持。

GuestOS可以在两种模式下运行:

  • 在Guest Mode中运行的GuestOS可以支持标准的内核。
  • 在User Mode下运行的GuestOS则支持自己的内核和User-space(Applications)。

相同的是,GuestOS只能够在User Mode下执行I/O操作,而且这是单独使用QEMU-KVM进行管理的。

KVM 虚拟化架构和实现原理的更多相关文章

  1. 虚拟化学习笔记-KVM虚拟化跨机迁移原理

    参考:https://zhuanlan.zhihu.com/p/27055555 在线迁移过程划分为三个阶段:准备阶段.迁移阶段和切换阶段.迁移环境为虚拟化底层KVM+Qemu.虚拟化管理Libvir ...

  2. 《KVM虚拟化技术实战和原理解析》读书笔记(十几篇)

    第一章和第二章 第一章 虚拟化和云计算 Saas(软件即服务):将已经部署好的软件作为一种服务来提供,比如:Google Docs, Google Apps Paas(平台即服务):将开发环境作为一种 ...

  3. KVM虚拟化概述与安装

    虚拟化是构建云计算基础架构不可或缺的关键技术之一,云计算的云端系统,其实质上就是一个大型的KVM分布式系统,虚拟化通过在一个物理平台上虚拟出更多的虚拟平台,而其中的每一个虚拟平台则可以作为独立的终端加 ...

  4. Qemu/kvm虚拟化源码解析学习视频资料

    地址链接:tao宝搜索:Linux云计算KVM Qemu虚拟化视频源码讲解+实践​https://item.taobao.com/item.htm?ft=t&id=646300730262 L ...

  5. KVM虚拟化(KVM简介和KVM安装)

    KVM 虚拟化架构分类 寄居虚拟化架构:指在宿主操作系统之上安装和运行虚拟化程序,依赖于宿主操作系统对设备的支持和物理资源的管理. 裸金属虚拟化架构:指直接在硬件上面安装虚拟化软件,再在其上安装操作系 ...

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

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

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

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

  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. NSPredicate的使用,超级强大

    NSPredicate *ca = [NSPredicate predicateWithFormat:(NSString *), ...]; Format: (1)比较运算符>,<,==, ...

  2. egon说一切皆对象--------面向对象进阶紫禁之巅

    一.检查isinstance(obj,cls)和issubclass(sub,super) class Foo(object): pass obj = Foo() isinstance(obj, Fo ...

  3. JavaEE高级-MyBatisPlus学习笔记

    第 1 章 简介 1.1 MyBatisPlus 介绍 -MyBatis-Plus(简称 MP),是一个 MyBatis 的增强工具包,只做增强不做改变. 为简化开发工作.提高生产率而生我们的愿景是成 ...

  4. DMA方式的数据传送过程

      DMA方式具有如下特点: 1. 外部设备的输入输出请求直接发给主储存器. 主存储器既可以被CPU访问,也可以被外围设备访问.因此,在主存储器中通常要有一个存储管理部件来为各种访问主存储器的申请排队 ...

  5. web框架-(二)Django基础

    上面我们已经知道Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Sessi ...

  6. [效率神技]Intellij 的快捷键和效率技巧|系列一|常用快捷键

    Intellij 是个功能强大的IDE,这里只讲window下社区版的Intellij. 1. 常用快捷: Alt+回车 导入包,自动修正Ctrl+N   查找类Ctrl+Shift+N 查找文件Ct ...

  7. spring bean的生命周期与作用域

    bean的作用域 singleton:单例模式,Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象. prototype:原型模式,每次通过Spri ...

  8. java 通过反射获取数组

    1.创建数组.设置数组元素.访问数组 一维数组: 多维数组: public Class<?> getComponentType() 返回表示数组组件类型的 Class.如果此类不表示数组类 ...

  9. Zookeeper学习笔记(上)

    Zookeeper学习笔记 本篇主要是一些基本的介绍和API的使用介绍, 有些只是记录了知识点,而没有完全在笔记中详细解释, 需要自行查找资料补充相关概念 主要参考了课程中的内容: Zookeeper ...

  10. 题解 P3166 【[CQOI2014]数三角形】

    做完之后看了看题解,怎么一篇和我思路一样的也没有...我好慌啊qwq(所以一定是窝太弱了看不懂dalao的思路) 好吧窝的方法确实很奇怪: 核心代码只有3行 输入 循环 输出 一气呵成 是题解中的豪杰 ...