Virtio SCSI设备介绍
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设备提供了很好的性能,但仍然有一定的局限性:
- 可扩展性差:每个virtio-blk设备也是一个pci设备,也就是说每个虚拟磁盘就要占用一个pci设备,这样一个虚拟机的磁盘个数就要受限于PCI设备的个数。
- 支持的特性受限:仅管virtio实现了SCSI透传的功能,这一点可以从上面的'-device'选项中的'scsi'属性可以看出,但是这个支持是有限的,因为它并不是在SCSI的框架下实现的,在客户机看来也不是一个真的SCSI设备,当然也不支持多路径和SCSI隔离这样的特性。
- 设备名字和现有物理设备不兼容:virtio-blk出现在客户机上的设备文件是/dev/vda这样的名字,会给一些工具造成麻烦。
Virtio SCSI的引入,很好的解决了上述问题。SCSI的initiator和Target之间可以使用多种传输协议中作为信道来传SCSI指令和应答数据。Virtio SCSI就是把virtio作为一种传输通道来传送SCSI指令。这样既可以保持virtio-blk设备具有的高性能,也解决了virtio-blk存在的局限性:
- 更丰富的特性,它支持的特性不取决于它本身,而是它的target,因为它已经借助SCSI的框架完整实现了SCSI initiator的功能。
- 每个virtio-scsi设备对应一个PCI设备,而一个virtio-scsi设备可以连接上千个磁盘。
- 每个virtio-scsi设备就是一个SCSI Host,这样为在客户机里实现多路径创造了条件。
- 在客户机看来,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 targetclitargetcli shell version 2.1.fb30Copyright 2011-2013 by Datera, Inc and others.For help on commands, type 'help'./> lso- / ......................................................................................................................... [...]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 100MCreated ramdisk scsi-ramdisk1.img with size 100M./backstores/ramdisk> cd ../../vhost/vhost> createCreated target naa.50014058a9474085.Created TPG 1./vhost> cd naa.50014058a9474085/tpg1/luns/vhost/naa.50...085/tpg1/luns> lso- luns .................................................................................................................. [LUNs: 0]/vhost/naa.50...085/tpg1/luns> create /backstores/ramdisk/scsi-ramdisk1.imgCreated 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
新增加的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
[5] http://linux-iscsi.org/wiki/Target
[6] http://linux-iscsi.org/wiki/Targetcli
Virtio SCSI设备介绍的更多相关文章
- CentOS学习笔记--SCSI 设备热插拔
CentOS学习笔记--SCSI 设备热插拔 处于运行中的服务器,因业务要求也许不允许重启机器,而新添加的SCSI设备(主要是硬盘)如何实现热插拔呢? 首先需要查看一下设备: #cat /proc/s ...
- linux /dev 常见特殊设备介绍与应用[loop,null,zero,full,random]
linux是文件型系统,所有硬件如软件都会在对于的目录下面有相应的文件表示.对于dev这个目录,我们知道它下面的文件,表示的是linux的设备.在windows系统中,设备大家很好理解,象硬盘,磁盘指 ...
- Catalyst9K设备介绍
Catalyst9K系列的里面包含了多款交换机,以及无线控制器,甚至包含了无线AP,如下将简单的介绍这几款产品的情况: 首先,这是一种总体的对应关系: 1.Catalyst9200 Series 主要 ...
- 一些有意思的VR设备介绍
1.计算机(Computers) 不久以前,一个VR系统需要百万美元的超级计算机:而如今顶级的VR系统正在使用桌面便携式计算机簇,极大的降低了价格和维护成本. 2.跟踪器(Tracking) 为了能与 ...
- Linux中三种SCSI target的介绍之各个target的优劣
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/scaleqiao/article/deta ...
- Linux中三种SCSI target的介绍之LIO
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/scaleqiao/article/deta ...
- Linux中三种SCSI target的介绍之SCST
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/scaleqiao/article/deta ...
- IDE、SATA、SCSI、SAS、FC、SSD硬盘类型介绍[zz]
目前所能见到的硬盘接口类型主要有IDE.SATA.SCSI.SAS.FC等等. IDE是俗称的并口,SATA是俗称的串口,这两种硬盘是个人电脑和低端服务器常见的硬盘.SCSI是"小型计算机系 ...
- [镜像]loop设备及losetup命令介绍
最近需要对一个镜像文件进行修改,可以些方式是通过losetup和kpartx, mount完成,于是分享下面这篇 转自:http://blog.csdn.net/ustc_dylan/article/ ...
随机推荐
- Introduction to Mathematical Thinking - Week 4
否定的逻辑 应该思考符号背后表示的逻辑,而不是像操作算术运算符一样操作逻辑符号. 比如 对于任意的 x,x属于自然数,那么 x 是偶数或者奇数:这是对的 如果使用“乘法分配律”拆分,变成“对于任意的x ...
- iOS KVO详解
一.KVO 是什么? KVO 是 Objective-C 对观察者设计模式的一种实现.[另外一种是:通知机制(notification),详情参考:iOS 趣谈设计模式——通知]: KVO 提供一种机 ...
- 用户画像 销量预测 微观 宏观 bi
w 目前我们没有自己的平台 第三方平台又不会给任何我们想要的数据 没有用户的注册信息 全天候的行为信息 用户画像没法做 针对我们业务的bi做的思路是什么呢 数据中心怎么做销量预测呢 ...
- 网络安装CentOS6.4
第一步:所需工具安装包下载地址: http://115.com/file/antbtamu#网络安装CentOS.rar(或者下载NetbootM.exe和hfs.exe) 第二步:将CentOS6. ...
- 前端基础 DOM & BOM
推荐阅读:http://www.cnblogs.com/yuanchenqi/articles/6893904.html#_label3 BOM对象 window 对象 所有浏览器都支持 window ...
- Python3.6全栈开发实例[003]
3.检查传入列表的长度,如果大于2,将列表的前两项内容返回给调用者. li = [11,22,33,44,55,66,77,88,99,000,111,222] def func3(lst): if ...
- 怎样解决Please ensure that adb is correctly located at......
昨天下午搭建了Android开发环境,但是天公不作美--执行新建的Android项目总是提演示样例如以下问题: [2014-10-30 15:41:47 - ] The connection to a ...
- mac安装yarn , MAC升级Nodejs
Npm i -g yarn 第一步,先查看本机node.js版本: `$ node -v` 第二步,清除node.js的cache: `$ sudo npm cache clean -f` 第三步,安 ...
- spring boot 如何将没有注解的类@Autowired
等于将类交给spring管理,也就是IOC. 注解@Autowired是自动装配,也就是spring帮你创建对象,当然前提是这个@Autowired的类已经配置成Bean了,spring配置bean文 ...
- Springboot入门2-配置druid
Druid是Java语言中最好的数据库连接池,在连接池之外,还提供了非常优秀的监控功能. 下面来说明如何在 Spring Boot 中配置使用Druid 1.添加Maven依赖 (或jar包) < ...