qmp的简单使用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

qmp的简单使⽤
QMP是⼀种基于JSON格式的传输协议,可使⽤QMP与⼀个QEMU虚拟机实例进⾏交互,例如查询虚拟机的相关状态等,以下就QMP的使⽤进⾏简单介绍。

可以通过libvirt向⼀个运⾏的虚拟机发送qmp命令,也可以使⽤qemu命令启动⼀个虚拟机,之后发送qmp命令。

上述两种⽅式各有优点,第⼀种⽅式可⽤于相关⼯具的开发及使⽤,第⼆种⽅式由于可以看到qemu中的相关输出,因此可⽤于开发阶段的调试。

补充:之前以为通过libvirt的⽅式(即virsh命令)发送qmp命令看不到qemu端的输出,实际上其输出存放在/var/log/libvirt/qemu/⽂件夹下的⽇志⽂件中,其中log⽂件名与虚拟机名字关联。

因此该种⽅式也可以⽤于开发阶段。

(⼀)简单使⽤
可通过如下命令开启虚拟机并使⽤qmp,其中/usr/local/bin/qemu-system-x86_64-libvmi 为虚拟机使⽤的qemu,/home/cmj/sourcecode/test.img为虚拟机镜像,使⽤端⼝号4444进⾏通信。

因为qmp本质上是⼀种Unix socket的本地通信机制,通信内容基于json格式。

/usr/local/bin/qemu-system-x86_64-libvmi --enable-kvm -m 1024 /home/cmj/sourcecode/test.img -chardev socket,id=qmp,port=4444,host=localhost,server -mon chardev=qmp,mode=control,pretty=on 运⾏上述命令后输出如下:
使⽤ telnet localhost 4444连接qemu,如下:
输⼊使能qmp命令:
{"execute":"qmp_capabilities"}
查询kvm信息:
{"execute":"query-kvm"}
execute指定要执⾏的命令,return返回命令执⾏后的结果,若没有返回数据则为空。

(⼆)添加新的qmp命令
可以通过修改qemu添加⾃定义的qmp命令⽤于交互,具体如下:
(1)在qapi-schema.json的尾部指定⼀个新的qmp命令,编译的过程中会⾃动⽣成该命令的json格式的解析参数:
command为发送的命令格式,为get_testdata;data为传⼊的参数,此处传⼊两个参数,均为整型;返回值为testdata,testdata为⾃定义的数据类型,如上图第⼀⾏,该数据类型包含两个int型的变量。

(2)在qmp.c中添加该命令的具体实现:
testdata *qmp_get_testdata( int64_t index_value,int64_t count_value, Error **errp )
{
printf("qmp test get data\n");
testdata *data;
data = g_malloc0(sizeof(*data));
data->index = index_value;
data->count = count_value;
printf("index:%d count:%d\n",data->index,data->count);
return data;
}
命令必须以qmp开头,testdata *表⽰返回该类型的指针,参数errp⽤于返回错误信息。

不需要添加该函数的声明,因为qapi可⾃动化实现函数声明的任务。

(3)在⽂件qmp-commands.hx中添加以下内容:
在该⽂件中,注释内容放在SQMP和EQMP之间。

name为命令名称;args_type为参数及类型,i表⽰int型。

(4)make 编译修改后的qemu
注意若修改的qemu与虚拟机之前使⽤的qemu不是同⼀个时,需要将虚拟机使⽤的qemu改为刚刚修改的qemu,修改虚拟机的xml⽂件为修改后的qemu:
修改后使⽤virsh define text.xml 重新定义
(5)开启虚拟机进⾏新的qmp命令测试
a. 使⽤qemu命令开启虚拟机,使⽤Telnet连接,输⼊{"execute":"qmp_capabilities"} 使能命令后,输⼊新定义的qmp命令:arguments为定义的参数
执⾏完毕后,return中返回index及count,qemu端的输出如下:
b. 向运⾏的虚拟机发送qmp命令
virsh start test开启虚拟机之后,发送qmp命令如下:
virsh -c qemu:///system qemu-monitor-command test "{ \"execute\": \"get_testdata\", \"arguments\": { \"index_value\": 1, \"count_value\": 101} }"
其中test为虚拟机名称,arguments为参数。

执⾏结果如下:
以上则为qmp命令的简单使⽤。

相关文档
最新文档