经常使用VMware的同学都知道有VMware-tools这个工具。这个安装在虚拟机内部的工具可以实现宿主机与虚拟机的通讯,大大增强了虚拟机的性能与功能。如VMware现在的Unity Mode下可以让应用程序无缝地与宿主机交互,更不用提直接复制粘帖文件及内容的小功能了。

对于KVM而言,其实也有一款这样的工具,叫做 Qemu Guest Agent。它是一个运行在虚拟机内部的普通后台应用程序,其可执行文件名称默认为qemu-ga(Linux)和qemu-ga.exe(Windows)。其目的是实现一种宿主机和虚拟机进行交互的方式,这种方式不依赖于网络,而是依赖于virtio-serial或者isa-serial,而QEMU则提供了串口设备的模拟及数据交换的通道,最终呈现出来的是一个unix socket文件(宿主机上)和一个串口设备(虚拟机内部)。

二、原理浅析

qga通过读写串口设备与宿主机上的socket通道进行交互,宿主机上可以使用普通的unix socket读写方式对socket文件进行读写,最终实现与qga的交互,交互的协议与qmp(QEMU Monitor Protocol)相同(简单来说就是使用JSON格式进行数据交换)。串口设备的速率通常都较低,所以比较适合小数据量的交换。

QGA技术原理与应用实践

我们可以通过虚拟机的xml文件来配置这个串口设备,在对应的xml中增加如下数据:

<channel type='unix'>

    <source mode='bind' path='/var/lib/libvirt/qemu/test.agent'/>

    <target type='virtio' name='org.qemu.guest_agent.1'/>

    <address type='virtio-serial' controller='0' bus='0' port='1'/>

</channel>

以Linux系统为例,上述xml数据对应的效果如下:

(1)在宿主机上生成一个unix socket文件,路径为:/var/lib/libvirt/qemu/test.agent

(2)在虚拟机内部生成一个serial设备,名字为org.qemu.guest_agent.1,映射出来的路径为:/dev/virtio-ports/org.qemu.guest_agent.1

此时我们对/var/lib/libvirt/qemu/test.agent socket文件进行读写操作,就能与对应的虚拟机中qga进行数据交互。

三、简单测试

1、在宿主机端使用socat来进行快速连接:socat unix-connect:test.agent readline

2、socat连上后就可以收发命令:}

3、如成功则会收到:{"return": 123456}

QGA技术原理与应用实践

四、华云数据对qga的应用

华云数据充分利用qga,在其原有架构基础上进行二次开发,添加额外的定制功能。同时华云数据深度挖掘qga潜在能力,把qga组件与其他的组件模块结合,完美添加到业务流程中,使qga成为一套专门针对云计算平台中的所有虚拟机进行统一高效便捷管控的完善系统。

华云数据Qga虚拟机管控系统主要包括四大模块:Web前端模块、Nova Qga模块、Qga Proxy模块以及提供具体服务的Qga后台进程。

• Web前端模块:用户操作界面,Javacript、Php、DIV、CSS等技术相结合。

• Nova Qga模块:Nova为OpenStack中的计算组织控制器,对其代码进行二次开发,添加额外功能。

• Qga Proxy模块:自主研发的功能模块,相当于一个数据收发中转站。

• Qga后台进程:提供具体的qga服务,把相关的程序制作进模板,并在虚拟机中后台运行。

QGA技术原理与应用实践

qga的几个功能:

(1)监控虚拟机内部的cpu、memory、磁盘空间、进程状态等相关信息;

(2)配置虚拟机内部网络环境。

五、总结

qga是一个QEMU社区中的项目,其代码位于QEMU代码根目录下的qga目录,因为其代码设计框架简单易懂,故对其进行二次开发较为简单。在Linux系统下只需要修改两个文件,qga目录下的qapi-schema.json以及commands-posix.c,在qapi-schema.json下定义qga命令的名字以及入参、出参,在commands-posix.c里面定义实现函数即可。且qga由于是c语言写的,Linux下实现的很多功能可以直接拷贝到Windows下使用。


原文发布时间为:2016年6月29日