前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >​[qemu][http]qemu的网络类型disk技术分析

​[qemu][http]qemu的网络类型disk技术分析

作者头像
皮振伟
发布2018-04-09 11:27:07
2.2K0
发布2018-04-09 11:27:07
举报
文章被收录于专栏:皮振伟的专栏皮振伟的专栏

前言: qemu的disk设备后端存储支持了多种类型。 本文简单简单列举几种,对比一下其中的特点。再重点分析http类型。 分析: 1,disk types qemu支持的disk类型,以及使用方法,参考libvirt的官方文档http://localhost/formatdomain.html#elementsDisks,其中常用的类型: file,就是文件类型,一般常用raw格式和qcow2格式。qemu-img info xxx.img可以查看具体类型和一些参数。对于file类型的数据,读写都需要经过host的本地的vfs。数据的io栈:qemu→vfs→file system->block device/network。这里的network一般nfs或者samba。 block,即块设备。块设备就是裸数据,只能是raw格式。数据的io栈:qemu→vfs→block device/network。这里的network一般是iscsi target。相比于file类型,block使用的方式更加原始,缺少了file system的映射管理,就缺少了很多高级特性。一个文件,可以使用truncate改变大小,还可以使用不同的格式,但是裸数据的大小只能通过修改磁盘分区来改变大小,修改起来非常不方便,动态增大卷的大小,也是云计算的一个基础特性;而且,在裸数据上,没有办法使用qcow2类型。 network,网络类型,数据在远端。那么,以什么协议,怎样的方式去访问,就是一个值得探讨的问题。iscsi协议是一个常用的协议,qemu的block driver提供了iscsi支持,使用libiscsi库。qemu的block driver也支持http/https协议,使用libcurl库。其他网络协议不在本文讨论。 2,io on nfs

qemu进程读写文件系统上的文件,陷入到内核态;进入vfs,kernel中对不同的文件系统,重载了各自的操作方法, vfs找到具体的文件系统---net file system;net file system根据操作类型,把读写转换成nfs协议的数据报文,和后端进行通信;IO完成。 尽管数据在远端,但是在本地,对于qemu进程来说,看到的卷是在本地的一个文件,是file类型的。 3,io on iscsi target

使用iscsi target之后,在本地执行lsscsi,可以看到virtual disk sdx设备。远端的存储在本地被抽象成了本地块设备。 qemu进程读写块设备,会陷入到内核态;进入vfs,因为是裸块,就不会再经过具体的文件系统,而是直接把请求给块层处理;块层重载了不同类型的块设备处理方法,进入到target framework中,使用iscsi tcp处理;数据报文经过网络,和后端通信;完成io。 qemu进程处理的工程中,看到的始终是本地的/dev/sdx块设备。 4,io on http

qemu直接使用libcurl,读取远端的文件。libcurl支持获取文件大小,就满足了或者卷设备的size了;libcurl可以读取文件特定位置的一段数据,就满足了卷的随机存储能力。 从存储的栈上来看,调用路径是短了一些。但是http情况下,是只读的,只能支持cdrom类型。没有了vfs,就意味着不能使用kernel的page cache。从抽象层次来看,nfs和iscsi target都是可以使用write/read,操作上符合“一切皆文件”,但是http类型则不行。 那么,为什么还使用http类型呢? linux上,进程有一种uninterruptable sleep状态,即ps aux看到的D状态。处于D状态的进程,不能执行,也不能kill。网络文件系统nfs/samba,或者iscsi target在网络异常的情况下,就可能让访问数据的进程陷入D状态。 相比之下,http是纯用户态基于socket实现,则不会出现D状态,哪怕是等待远端的数据,也是处于interruptable sleep状态(ps aux看到的S状态),虽然不能正确访问数据,但是处于S状态的进程可以处理信号,也就可以被正常kill掉。 在应用场景上,作者认为,最适合的就是使用iso来安装虚拟机的操作系统。 5,qemu http的使用 在libvirt的xml中,disk的配置如下: <disk type='network' device='cdrom'> <driver name='qemu' type='raw'/> <source protocol='http' name='/REST/cn_windows_7_professional_with_sp1_vl_build_x64_dvd_u_677816.iso'> <host name='192.168.1.10' port='80'/> </source> <target dev='hdd' bus='ide'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='1'/> </disk> 6,qemu http的实现 在qemu-2.8/block/curl.c中,

实现了block driver的http协议,并注册给qemu block driver list。 从函数命名上来看,driver的操作都是基于libcurl的,虚拟机访问卷的过程,就是qemu使用libcurl访问http的过程。 同时,这里也没有实现bdrv_aio_writev函数,也再一次证明了http卷设备是只读的。

另外需要注意的是,如果想使用http block driver,那么在本地必须先安装libcurl-dev包,在执行configure的时候,增加--enable-curl选项。编译完成后,执行ldd x86_64-softmmu/qemu-system-x86_64 | grep libcurl,能看到libcurl,qemu就已经支持了http了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-10-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AlwaysGeek 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档