QAPI是qemu-guest-agent实现的核心,它在QMP的基础上进行拓展,通过虚拟机内的qemu-guest-agent进程和与virtio串口设备(默认为virtio-serial,也可以使用isaserial或者UNIX套接字)共同完成虚拟化服务代理与虚拟机内部的系统级别交互,如图4-8。
图4-8 qemu-guest-agent实现简图
1.使用方法
QAPI的使用方法也比较简单,首先需要在启动虚拟机时添加qga设备,形如“-chardev socket,path=/tmp/qga.sock,server,nowait,id=qga0-device virtio-serialdevice virtserialport,chardev=qga0,name=org.qemu.guest_agent.0”。然后,我们需要虚拟机操作系统内安装并启动qemu-guest-agent服务。服务启动后,通过虚拟化服务组件(比如OpenStack的Nova、oVirt的vdsm、CloudStack的cloudagent等)就可以与虚拟机进行系统文件级别的通信了,包括读写虚拟机内的某个文件、执行命令等,目前社区版提供的所有命令及返回值均可在QEMU源码目录中的qga/qapischem a.json查看。
接下来我们在CentOS 7中启动一台W indows 7虚拟机,介绍qga的具体使用方法。
首先使用VirtManager(将在后面章节具体介绍)创建虚拟机,并添加qga设备,暴露于服务器上的UNIX套接字路径为/var/lib/libvirt/qemu/channel/target/domain-win7/org.qemu.guest_agent.0,添加对应的virtio驱动,如图4-9所示。
图4-9 安装virtio Serial驱动
然后安装提前下载或者编译的qemu-ga.msi,并启动服务(命令等同于“qemu-ga.exe–p\\.\Global\org.qemu.ga.0”。注意qemu-ga的默认服务参数中可能会有命令黑名单),即可在虚拟机中看到如图4-10的状态(QEMU Guest Agent VSSProvider服务可用于某些支持Windows VSS的应用程序进行备份操作)。
图4-10 启动QEMU Guest Agent服务
下载地址与编译方法如下(需要在Fedora发行版中编译Windows版本的qemu-ga,笔者使用的版本为Fedora 23)。
(www.xing528.com)
启动完成之后,可以在服务器上使用socat命令作为客户端与其进行交互。以在C:\a.txt中写入“hello world!”为例。
使用qemu-ga时需要注意的问题
对于Windows虚拟机,qapi-schema.json中列举的命令并非全部可用;如果使用了其他串口设备作为代理设备,注意修改/etc/sysconfig/qemu-ga(Linux)为对应的设备路径;当系统中的qemu-ga服务启动时,有时会出现客户端连接失败的情况,请注意相关权限、启动顺序设置,并做好相应的容错机制(libvirt中已经提供)。
2.扩展开发示例
QAPI的扩展也比较简单,我们只需要修改QEMU源码中的三个文件即可,分别是qga/qapi-schema.json、qga/commands-win32.c、qga/commands-posix.c。另外,习惯Python的读者现在也可以使用Python实现的qemu-guest-agent(可访问https://negotiator.readthedocs.org获取详细信息)。
接下来向qemu-ga中添加Windows下的touch命令,用以作为开发示例。修改qga/qapi-schema.json,添加如下代码。
然后在qga/commands-win32.c中添加如下代码。
添加完成后重新编译qemu-ga.exe拷贝至虚拟机中启动。
然后再使用socat连接,输入“{“execute”:”guest-file-create”,”arguments”:{“path”:”c:\\test.txt”}}”,得到返回值为0,就可以在虚拟机中的C:\看到刚刚创建test.txt文件了。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。