声明:

本博客欢迎转发,但请保留原作者信息!
新浪微博:@孔令贤HW; 
博客地址:http://lingxiankong.github.io/
内容系本人学习、研究和总结,如有雷同,实属荣幸!


virtio-blk是虚拟化KVM平台下虚拟磁盘的一种实现方式,也是存储虚拟化所研究的主要对象之一。在KVM平台下,qemu程序负责模拟一台PC的整个工作过程,是虚拟化技术的精髓所在。大家知道,在物理PC中,磁盘是必不可少的设备,系统、应用程序的安装和数据的存放都离不开磁盘。在虚拟化场景下,qemu自然也需要提供对磁盘的模拟。那qemu到底是如何模拟磁盘的?virtio-blk又是一种什么样的虚拟磁盘呢?

qemu对设备的模拟可以分成两类:全模拟和半模拟。全模拟即完全模拟物理设备的工作过程,使得运行在虚拟机上的软件完全感知不到自身运行环境的差异。例如qemu中实现了对IDE磁盘、LSI控制器(其上可接SCSI磁盘)等物理存储设备的模拟,原先运行在物理机上的IDE驱动、LSI驱动或应用程序不做任何改动即可运行在虚拟机中。因此,全模拟的优点比较明显,即不用提供专门针对虚拟化场景的设备驱动,完全可以复用物理环境下的驱动程序。那么全模拟有何缺点呢?全模拟时,虚拟机内部驱动会频繁访问虚拟机IO端口,KVM平台下会导致大量的陷入和陷出操作;另外虚拟机内外数据传输时只能通过以字节为单位的拷贝方式进行,无法直接采用共享内存的方式,因此存在较大的访问性能问题。

为解决全虚拟化在性能上的问题,半模拟技术应运而生。它构造了一种虚拟化环境所独有的存储设备,因此需要在虚拟机内部安装特定的驱动程序才能正常驱使该设备进行工作。通常我们称虚拟机内部的驱动为前端驱动,称负责实现其功能模拟的程序(KVM平台下即为qemu程序)为后端程序,半模拟技术也常常被叫做前后端技术。采用半摸拟技术后,配合前端驱动,虚拟化设备完全可以采用全新的事件通知和数据传递机制进而大幅提升性能,例如在virtio-blk磁盘中,采用io_event_fd进行前端到后端通知,采用中断注入方式实现后端到前端的通知,并通过IO环(vring)进行数据的共享。

至此,主要说明了virtio-blk产生的背景及其价值。附上qemu所模拟的PC(基于intel i440fx主板架构)的组成结构图,以作为后续深入分析的基础。

qemu模拟实现的virtio-blk设备的组成结构如下图所示:

从图中可见,virtio-blk设备“内嵌”在一块PCI设备板(即virtio-blk-pci设备)上,其内部通过一条virtio总线连接PCI接口和virtio-blk设备。为何要将virtio-blk设备设计成这样呢?

qemu模拟的所有设备都通过总线相连,总线下可挂接若干设备,桥接设备又可生成子总线;整个PC只有一条根总线(即Main System Bus,对应前端总线FSB)。因此,qemu内模拟的所有设备构成一棵总线与设备交替衍生的树。virito-blk是一种什么样的设备?又该连接在什么总线上呢?虽然virtio-blk仅在虚拟化环境下存在,但如果完全凭空创造一种新的设备类型,那前端驱动开发将是一个很大的挑战。PCI设备是PC中最为常见的一种设备类别,且有较为完善的规范说明,因此可将virtio-blk设备模拟成一种PCI设备,这样可复用虚拟机内部已有的PCI驱动。

virtio-blk设备从功能上来看,核心功能就是实现虚拟机内外的事件通知和数据传递:虚拟机内部的前端驱动准备好待处理的IO请求和数据存放空间并通知后端;虚拟机外部的后端程序获取待处理的请求并交给真正的IO子系统处理,完成后将处理结果通知前端。实际上,除了虚拟磁盘,虚拟网卡也完全可以复用这套机制,从而实现半模拟的网络前后端(virtio-net)。如果将virtio-blk或virtio-net设计成不同类型的PCI设备,那么前端驱动中会存在大量关于事件通知和数据传递的重复代码。

综上分析,virtio-blk首先是PCI设备;其次为了复用半模拟中通用的事件通知和数据传递机制,抽象出一类virtio-pci设备,其内部通过virtio总线连接不同的virtio设备。这样virtio-blk设备就通过virtio总线连接到virtio-blk-pci设备的PCI接口上,virtio-net也通过virtio总线连接到virtio-net-pci设备的PCI接口上。可能有的人会问,为何通过设备的抽象就能复用前端驱动的代码?在virtio-blk-pci或virtio-net-pci前端驱动加载时,最初识别到的都是virtio-pci设备,这样都可调用virtio-pci驱动进行事件通知和数据传递的初始化,后续也可使用virtio-pci中相关函数进行事件通知和数据传递。

因此virtio-blk完全是基于通用的virtio框架实现的磁盘前后端,virtio框架中最为核心的就是事件通知和数据传递机制。

virtio-blk简介[转]的更多相关文章

  1. rust-vmm 学习

    V0.1.0 feature base knowledge: Architecture of the Kernel-based Virtual Machine (KVM) 用rust-vmm打造未来的 ...

  2. virtio 简介

    我的微信公众号 aCloudDeveloper 专注于云计算技术,互联网技术,生活感悟,打造干货分享平台,每周至少一更,欢迎小伙伴们多多关注! 什么是 virtio virtio 是一种 I/O 半虚 ...

  3. linux进程管理和系统状态查看命令简介

    1 进程管理简介 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础 2 常用命令 2.1 pstree 2.1.1 功能描 ...

  4. vhost:一种 virtio 高性能的后端驱动实现

    什么是 vhost vhost 是 virtio 的一种后端实现方案,在 virtio 简介中,我们已经提到 virtio 是一种半虚拟化的实现方案,需要虚拟机端和主机端都提供驱动才能完成通信,通常, ...

  5. 【嵌入式开发】 Linux Kernel 下载 配置 编译 安装 及 驱动简介

    作者 : 韩曙亮 转载请出名出处 : http://blog.csdn.net/shulianghan/article/details/38636827 一. Linux 内核简介 1. 内核功能简介 ...

  6. linux进程管理和系统状态常用命令简介

    1 进程管理简介 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础 2 常用命令 2.1 pstree 2.1.1 功能描 ...

  7. Linux 内核引导选项简介

    Linux 内核引导选项简介 作者:金步国 连接地址:http://www.jinbuguo.com/kernel/boot_parameters.html 参考参数:https://www.cnbl ...

  8. KVM虚拟化技术(一)虚拟化简介

    一 .虚拟化 虚拟化是指计算机元件在虚拟的基础上而不是真实的基础上运行.虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程.CPU的虚拟化技术可以单CPU模 拟多CPU并行,允许一个平台同时运行多个 ...

  9. Blktrace原理简介及使用

    Blktrace简介 Blktrace是一个用户态的工具,用来收集磁盘IO信息中当IO进行到块设备层(block层,所以叫blk trace)时的详细信息(如IO请求提交,入队,合并,完成等等一些列的 ...

  10. spice在桌面虚拟化中的应用系列之一(spice简介,性能优化等)

    1.spice介绍 1.1 spice简介 spice是由Qumranet开发的开源网络协议,2008年红帽收购了Qumranet获得了这个协议.SPICE是红帽在虚拟化领域除了KVM的又一“新兴技术 ...

随机推荐

  1. 摆花(2012Noip普及组第3题)

    摆花 (flower.cpp/c/pas) [问题描述] 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 m 盆.通过调查顾客的喜好,小明列出了顾客最喜欢的 n 种花,从 1 到 n ...

  2. adb catlog>d:\log.txt日志级别

    W,警告 I,通知 D,调试 E,错误 V, 到最细的日志 功能测试可以看W和E,性能测试I比较有用

  3. CSS的三种引入方式

    1.标签 <style>定义样式         <link> 资源的引用(某些css的样式) 2.属性 rel=”stylessheet” 外部样式表  (rel为定义当前文 ...

  4. Best Coder Round#25 1003 树的非递归访问

    虽然官方解释是这题目里的树看作无向无环图,从答案来看还是在“以1作为根节点”这一前提下进行的,这棵树搭建好以后,从叶节点开始访问,一直推到根节点即可——很像动态规划的“自底向上”. 但这棵树的搭建堪忧 ...

  5. Gear VR开发

    下载安装Unity开发工具,要求Unity 5.3.0 或更高版本         下载Oculus签名,做Gear VR交互功能模块.关于输入交互,可以下载VR Samples(地址:https:/ ...

  6. PS与TOP详解

    一:ps  ps -l 查看属于自己这次登录的PID与相关信息列出来(只与自己的bash有关) F:代表这个进程标志(process flags),说明这个进程的权限,常见号码有: 若为4表示此进程的 ...

  7. PLS-00306错误

    ORA-06550: line 1, column 7:PLS-00306: wrong number or types of arguments in call to 'P'ORA-06550: l ...

  8. linux学习笔记2-linux的常用命令

    第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装linux操作系统,以及一些基本的设置修改. 本篇博客主要介绍linux中的一些常用的终端命令 ======== ...

  9. android 中theme和style的语法相关

    1.theme和style都是一组属性的集合,用于定义文本.颜色.大小等显示风格.他们都是资源,可以用android系统级别的一些默认的风格和主题资源,你也可以自定义你自己的主题和风格资源. 2.自定 ...

  10. 【转】JavaScript获取节点类型、节点名称和节点值

    DOM节点信息包括节点类型(nodeType).节点名称(nodeName)和节点值(nodeValue). 节点类型 DOM节点中,每个节点都拥有不同的类型.W3C规范中常用的 DOM节点类型有以下 ...