qmp的简单使⽤
QMP是⼀种基于JSON格式的传输协议,可使⽤QMP与⼀个QEMU虚拟机实例进⾏交互,例如查询虚拟机的相关状态等,以下就QMP的使⽤进⾏简单介绍。
游戏xml文件修改可以通过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 -charde
v 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 l 重新定义
(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命令的简单使⽤。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。