Qemu的存储栈

  在KVM虚拟化环境中,当客户机的内核存储系统像在物理机上一样通过页缓存、文件系统、通用块设备层运行到实际设备驱动时,这时驱动对设备寄存器的访问会触发CPU从客户机代码切换到物理机内的KVM内核模块,进而这个I/O请求会被分发到对应的Qemu模拟的磁盘设备的代码(下面将会介绍的vhost-scsi除外)。在引入virtio-scsi之前,SCSI设备的模拟并不成熟,所以Qemu支持的磁盘接口类型主要包括IDE和Virtio[1]。

Virtio是一个通用的I/O虚拟化框架[2], 它可以有效地简化设备逻辑,从而大大减少虚拟机退出(VMEXit)次数,并且通过使用虚拟机和物理机共享的分散聚合(scatter gather)缓冲区,提高了数据传输效率。当然这需要运行在客户机内核中的前端驱动和运行在物理机中后端设备代码协作完成。在Linux上,Virtio的磁盘驱动是在通用块设备框架下实现的,当它接收到来自上层的I/O请求后,会把该请求加上Virtio块设备请求的描述信息,一起加入缓冲区,然后触发VMExit来通知后端服务代码。Qemu中的Virtio块设备的服务代码会解析缓冲区中的数据,得到块设备的操作指令和对象数据,然后调用Qemu中的块设备代码,进一步完成这个I/O请求。也就是说,Qemu中暴露给虚拟机的设备只负责处理设备逻辑,和客户机里对应的驱动共同把数据从客户机传输到物理机。

  Qemu的块设备层会和后端存储交互,完成最终的I/O操作。后端存储也就是实际存储虚拟磁盘内容的地方。Qemu中支持的后端存储包括:

  • 主机支持的文件系统上的文件,包括本地文件系统和网络文件系统
  • 块设备,包括本地磁盘,SAN磁盘,iSCSI磁盘和LVM等
  • 远端存储,包括nbd, iSCSI以及Glusterfs, Sheepdog, Ceph等分布式存储。

​  前端设备和后端存储的分离,可以从Qemu的命令行中看出:

-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x9,drive=drive-virtio-disk1,id=virtio-disk1

-drive file=/var/lib/libvirt/images/vm1.img,if=none,id=drive-virtio-disk2,format=qcow2

  可以看到, 选项 '-device' 指定了前端的设备类型,而 '-drive' 选项定义了后端存储,并且通过设备的'drive'属性把设备和存储关联起来,就好像把盘片插入控制器。这样的设计,使得Qemu更容易利用到外部存储服务提供的高级特性,比如镜像和条带化I/O等。

  后端存储的'format'选项表明该磁盘镜像使用的格式。Qemu支持的磁盘格式包括raw, qcow2, vdi, vmdk等。实际上,对于格式不是raw的磁盘镜像,Qemu的块设备层会先进入对应的格式驱动,这样才能实现它们所提供的高级特性,比如写时分配,快照等。

Virtio SCSI

  virtio-blk设备提供了很好的性能,但仍然有一定的局限性:

  1. 可扩展性差:每个virtio-blk设备也是一个pci设备,也就是说每个虚拟磁盘就要占用一个pci设备,这样一个虚拟机的磁盘个数就要受限于PCI设备的个数。
  2. 支持的特性受限:仅管virtio实现了SCSI透传的功能,这一点可以从上面的'-device'选项中的'scsi'属性可以看出,但是这个支持是有限的,因为它并不是在SCSI的框架下实现的,在客户机看来也不是一个真的SCSI设备,当然也不支持多路径和SCSI隔离这样的特性。
  3. 设备名字和现有物理设备不兼容:virtio-blk出现在客户机上的设备文件是/dev/vda这样的名字,会给一些工具造成麻烦。

Virtio SCSI的引入,很好的解决了上述问题。SCSI的initiator和Target之间可以使用多种传输协议中作为信道来传SCSI指令和应答数据。Virtio SCSI就是把virtio作为一种传输通道来传送SCSI指令。这样既可以保持virtio-blk设备具有的高性能,也解决了virtio-blk存在的局限性:

  1. 更丰富的特性,它支持的特性不取决于它本身,而是它的target,因为它已经借助SCSI的框架完整实现了SCSI initiator的功能。
  2. 每个virtio-scsi设备对应一个PCI设备,而一个virtio-scsi设备可以连接上千个磁盘。
  3. 每个virtio-scsi设备就是一个SCSI Host,这样为在客户机里实现多路径创造了条件。
  4. 在客户机看来,virtio-scsi设备相当于一个基于virtio的HBA卡

Virtio SCSI支持两种target,一种是在Qemu中模拟的,另外一种是在内核中模拟的。下面的Qemu命令行展示了怎样增加一个由Qemu模拟的virtio scsi设备

-device virtio-scsi-pci,id=scsi0,bus=pci.0,addr=0x8 
-drive file=/var/lib/libvirt/image/scsi-disk1.img,if=none,id=drive-scsi0-0-0-0,format=raw 
-device scsi-hd,bus=scsi0.0,channel=0,scsi-id=0,lun=0,drive=drive-scsi0-0-0-0,id=scsi0-0-0-0

对应的Libvirt XML描述如下:

<controller type='scsi' index='0' model='virtio-scsi'/>
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<source file='/var/lib/libvirt/scsi-disk1.img'/>
<target dev='sda' bus='scsi'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>

而在内核中模拟的SCSI Target则是利用了LIO[5]的框架,通过使用vhost为LIO增加了一种基于Virtio的传输机制。这样Guest的SCSI指令就可以通过Virtio直接传送到

LIO的SCSI引擎中,然后交到它的后端存储中处理。LIO支持文件,块设备,内存磁盘,透传SCSI设备等后端。在内核中实现的SCSI target有以下优点:

  • 更稳定可靠的
  • 减少了用户态和内核的切换,同时避免了Qemu中的全局锁的限制

和缺点:

  • 不支持热迁移
  • 无法使用Qemu支持的磁盘镜像格式

下面的命令行展示了如何使用tagetcli[6]创建一个SCSI target,并把它作为一个SCSI设备增加到虚拟机中:

$ sudo targetcli
targetcli shell version 2.1.fb30
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.
/> ls
o- / ......................................................................................................................... [...]
o- backstores .............................................................................................................. [...]
| o- block .................................................................................................. [Storage Objects: 0]
| o- fileio ................................................................................................. [Storage Objects: 0]
| o- pscsi .................................................................................................. [Storage Objects: 0]
| o- ramdisk ................................................................................................ [Storage Objects: 0]
o- iscsi ............................................................................................................ [Targets: 0]
o- loopback ......................................................................................................... [Targets: 0]
o- vhost ............................................................................................................ [Targets: 0]
/> cd /backstores/ramdisk 
/backstores/ramdisk> create scsi-ramdisk1.img 100M
Created ramdisk scsi-ramdisk1.img with size 100M.
/backstores/ramdisk> cd ../../vhost 
/vhost> create 
Created target naa.50014058a9474085.
Created TPG 1.
/vhost> cd naa.50014058a9474085/tpg1/luns
/vhost/naa.50...085/tpg1/luns> ls
o- luns .................................................................................................................. [LUNs: 0]
/vhost/naa.50...085/tpg1/luns> create /backstores/ramdisk/scsi-ramdisk1.img 
Created LUN 0.

sudo ./x86_64-softmmu/qemu-system-x86_64 -m 1024 -enable-kvm --device vhost-scsi-pci,id=vhost-scsi0,wwpn=naa.naa.50014058a9474085 -cdrom ~/Downloads/software/Fedora-Live-Desktop-x86_64-19-1.iso

上面的命令使用了Fedora的LiveCD作为测试,也可以直接使用虚拟机的镜像文件。在虚拟机启动后,登录进入虚拟机,就可以通过lspci和lsscsi这样的命令来检查
新增加的SCSI设备。

[1] https://github.com/rustyrussell/virtio-spec

[2] http://www.ibm.com/developerworks/cn/linux/l-virtio/

[3] http://www.linux-kvm.org/wiki/images/f/f5/2011-forum-virtio-scsi.pdf

[4] http://events.linuxfoundation.org/sites/events/files/slides/MasakiKimura_LinuxConNorthAmerica2013_1.pdf

[5] http://linux-iscsi.org/wiki/Target

[6] http://linux-iscsi.org/wiki/Targetcli

转载于:https://www.cnblogs.com/allcloud/p/5626485.html

Virtio SCSI设备介绍相关推荐

  1. 什么叫pmt测试分析_圆偏振发光光谱仪——南方科技大学分析测试中心设备介绍第51期...

    51 南科大分析测试中心设备介绍 之 圆偏振发光光谱仪 51 设备简介 CPL-300圆偏振发光光谱仪由150W无臭氧Xe灯.两个单色仪系统(Mex和Mem).圆偏振调制单元,和PMT探测器组成.Me ...

  2. SCSI设备:SCSI接口图片说明

    Internal Industry Standard 68-pin (female) 工业标准内部68针SCSI接口(母口) 一般用于内部SCSI设备  Internal Industry Stand ...

  3. VIRTIO PCI 设备

    Virtio的代码主要分两个部分:QEMU和内核驱动程序.Virtio设备的模拟就是通过QEMU完成的,QEMU代码在虚拟机启动之前,创建虚拟设备.虚拟机启动后检测到设备,调用内核的virtio设备驱 ...

  4. 无人直播慢直播设备介绍

    参考链接1:https://linkpi.cn/archives/1791 参考链接2:https://blog.csdn.net/weixin_45326556/article/details/12 ...

  5. 什么是SCSI设备?

    今天同事问了我这样一个问题--网上搜索整理了一下答案,记录下来 :)       首先要说的就是计算机所使用的总线,也就是计算机各个设备之间通信用的数据线的类型了,关于这个我找到了下面的一篇文章:   ...

  6. linux可以识别多少lun,Linux上每个SCSI设备的最大LUN数目是多少(by quqi99)

    作者:张华  发表于:2016-04-28 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) SC ...

  7. scsi设备驱动体系架构

    1.6.2 scsi设备驱动体系架构 从这一层开始,整个文件读写的中心将由request转向scsi的命令结构scsi_cmnd.那么这个命令结构到底是怎么一回事呢,这还得从SCSI架构谈起.SCSI ...

  8. ceph存储 scsi设备驱动体系架构

    scsi设备驱动体系架构 从这一层开始,整个文件读写的中心将由request转向scsi的命令结构scsi_cmnd.那么这个命令结构到底是怎么一回事呢,这还得从SCSI架构谈起.SCSI 实现了一种 ...

  9. 什么是环境监测?基本概念及相关设备介绍

    环境的好坏关系到每一个人的健康,因此对国内每一个城市.乡村进行环境监测有十分重要的意义.如今不管是湿地.森林.草原.海洋.江河还是人类聚集的城市,都搭建了各种各样的环境监测站.什么是环境监测?通常来说 ...

  10. 隧道调频广播覆盖-天线分布式部署是隧道调频广播无线覆盖系统设备介绍

    隧道调频广播覆盖-天线分布式部署隧道调频广播无线覆盖系统设备介绍 北京海特伟业科技有限公司发布于2022年9月1日 文/任洪卓 海特伟业天线分布式部署隧道调频广播无线覆盖系统,是经由隧道管理中心铺设铠 ...

最新文章

  1. Android 在menu中同时显示Icon和Text
  2. Tomcat 中文乱码 设置UTF-8编码 问题解决办法
  3. CvBlobDetector 新目标检测算法简析
  4. 如何在Windows即服务上安装Memcached Server
  5. js打开新窗口Window.open()方法
  6. 数字隔离器件在功率计量芯片中的应用
  7. 服务器运维工程师岗位要求
  8. 多项式乘法 快速傅里叶变换
  9. 手机不能访问html文件,手机如何解决禁止访问网页
  10. 用python编译linux内核,戴子轩/RK3399上编译linux-kernel
  11. 二十一、Java8新特性——Stream API【黑马JavaSE笔记】
  12. Android 网星工具箱Beta版
  13. 甜心奶酪用英文怎么说_您组织中没有人会碰到什么奶酪,更不用说动弹了?
  14. Python中rect属性
  15. 系统的软中断CPU使用率升高,该怎么办?
  16. 华硕笔记本没有无线服务器,华硕电脑搜不到wifi怎么回事
  17. linux下如何清理缓存
  18. 计算机excel函数应用实例,几个常用函数的功能与应用范例
  19. Tableau可视化部分世界银行数据
  20. 1、Export to PDF and PNG

热门文章

  1. python读取xps文件_Python操做PDF-文本和图片提取(使用PyPDF2和PyMuPDF)
  2. active控件和java脚本_Active控件问题小结(附解决办法)
  3. 【爬虫】Python爬虫实战,Python实现中国地铁数据可视化arcmap
  4. Http状态码大全(很全面)
  5. Ubuntu 屏幕录像
  6. 2023王道C语言训练营(二叉查找树-顺序查找-折半查找)
  7. 解决 前端Failed to decode downloaded font
  8. 2019年1月份整理的Unity3D游戏完整源码
  9. 2022年低压电工题库及模拟考试
  10. cd40系列芯片_CD40系列 74系列芯片