设为首页 收藏本站
查看: 1474|回复: 0

[经验分享] KVM-QEMU vdagent实现机制分析(一)

[复制链接]

尚未签到

发表于 2016-1-8 12:11:39 | 显示全部楼层 |阅读模式
Ubuntu12.10下搭建基于KVM-QEMU的虚拟机环境(十八)中我们实验了通过在虚拟机里面安装vdagentSpiceAgent)程序来自动适应屏幕分辨率的功能,这个vdagent是运行在虚拟机里面的,而分辨率的信息来自spice client,这中间隔着spice serverqemu等模块,中间的过程还是比较复杂的。通过分析这个流程,有助于帮助我们理解更多KVM-QEMU虚拟化的机制。
DSC0000.jpg
Spice agent运行在客户机(虚拟机)操作系统中。Spice serverSpice client利用spiceagent来执行一些需要在虚拟机里执行的任务,如配置分辨率,另外还有通过剪贴板来拷贝文件等。从上图可以看出,Spice clientserverSpice Agent的通信需要借助一些其他的软件模块,如在客户机里面,SpiceAgent需要通过VDIPort Driver与主机上 QEMUVDIPort Device进行交互,他们的交互通过一种叫做输入/输出的环进行。SpiceClientServer产生的消息被写入到设备的输出环中,由VDI Port Driver读取;而Spice Agent发出的消息则通过VDI Port Driver先写入到VDIPort Device输入环中,QEMU读入到Spice server的缓冲区中,然后再根据消息决定由Spice Server直接处理,还是被发往SpiceClient中。
在技术上KVM-QMEU架构采用了一种叫virtio-serial的技术,这种技术处理主机用户空间和客户机用户空间的数据传输。它主要包含两个部分:1.Qemu中模拟一个叫virtio-pci的设备,这个设备提供给客户机使用;2.客户机上安装一个字符设备驱动访问virtio-pci设备。
在实现上,大致需要以下一些工作:
1. 在用libvirt定义虚拟机的时候需要包含添加virtio-serial的控制器设备:
  <controller type='virtio-serial' index='0'>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
  </controller>




该设备挂载在PCI总线0的第5个槽位上。这个设备就是QEMU中模拟的,提供给客户及访问的virtio-pci设备;

2. 在用libvirt定义虚拟机的时候需要包含一个叫“com.redhat.spice.0”的客户机接口,它是”channel”类型,其他的客户机接口类型还有parallelport, serial port, console等,它们从本质上来说都是一种提供给客户机访问的字符设备。
  <channel type='spicevmc'>
  <target type='virtio' name='com.redhat.spice.0'/>
  <address type='virtio-serial' controller='0' bus='0' port='1'/>
  </channel>






Channel还可以分为”spicevmc””unix”, “pty”等类型,具体可以参考libvirt的说明文档:http://www.libvirt.org/formatdomain.html
注意上面的”address”,它指定了这个字符设备是挂载到了我们在前面定义的virtio-serial控制器上,这样这两者就关联起来了。

3. 在虚拟机里面安装vdagent(参考Ubuntu12.10下搭建基于KVM-QEMU的虚拟机环境(十八))。
4. 上述工作都做了以后,启动虚拟机,然后打开设备管理器(注意,需要右击设备管理器->查看->显示隐藏设备),如下图:
DSC0001.jpg
由上图,可以看到在虚拟机设备管理器里有两个跟这个virtio-serial机制相关的设备:
VirtIO-Serial DrivervportOp1,那么这两个设备分别代表什么呢,再分别双击这两个设备,打开它们的属性看看:
1)VirtIO-Serial Driver的属性如下:
DSC0002.jpg
从上图中很明显的看到这个设备是位于PCI总线0上的设备5,是不是能回想起什么来?
对了,它就是我们在前面libvirt定义中定义的virtio-serial控制器设备,槽位号正是5。这说明QEMU已经把它模拟出来,并已经提供给虚拟机里的虚拟串口驱动访问了。
2)vportOp1的属性如下:
DSC0003.jpg
从上图可以看出,这个设备正是我们在前面libvirt里定义里定义的“'com.redhat.spice.0”字符设备,它的位置1与我们定义的port=’1’一致,如果要实验可以改一下port=’2’看看,虚拟机里面的位置也会随之改成2
5. 有了上述条件之后,vdagent程序就可以通过对这个vportOp1字符设备的读写来与主机上的qemu进程交互了,也就是虚拟机与主机的通信通道已经通了。
之后我们通过分析代码来看看实现上是怎么做到的。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-161857-1-1.html 上篇帖子: redhat linux KVM虚拟机桥接 下篇帖子: kvm虚拟化学习笔记(十)之kvm虚拟机快照备份
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表