1、基于JSON(http://www.ietf.org/rfc/rfc4627.txt)的协议,便于其他应用控制QEMU
2、QMP本质上是一种unix socket本地通信机制,通信内容基于JSON格式,当其他的应用成功连接qemu的QMP监听服务后,会得到一个欢迎消息(表明连接成功),具体的消息如下:
{ "QMP": {"version": json-object, "capabilities": json-array } }
其中,json-object是一个JSON的对象,json-array是一个JSON对象的数组,一个JSON对象一般表现为一个字典。JSON格式是一种键值对的格式,键值version指定QEMU的版本号,键值capabilities指定QEMU的QMP机制提供全部功能。
3、发送命令格式
{"execute": json-string, "arguments": json-object,"id": json-value }
键值execute指定要执行的命令;键值arguments指定命令执行时候需要的参数,是可选的一个键值;键值id是该执行命令的一个标识,是可选的,如果发送命令中包括这个键值,那么返回的响应中也会有同样的键值。
4、响应格式
(1)成功响应
{"return": json-object, "id": json-value }
键值return返回命令执行后的结果数据,如果命令执行完毕没有返回数据,则该键值对应的内容为空;键值id返回对应的发送命令中的键值id对应的值。
(2)错误响应
{"error": { "class": json-string, "desc":json-string }, "id": json-value }
键值class指定错误的类型;键值desc指定人类可读的错误描述;键值id意思同上。
5、异步事件
由于状态改变,QEMU可以单方面向应用发送消息,被称之为异步事件。格式如下:
{
"event": json-string, "data": json-object,
"timestamp": { "seconds": json-number,"microseconds": json-number }
}
键值event包括事件的名字;键值data指定事件关联的数据,可选的;键值timestamp指定了事件发生的具体时间。
对于发生的事件可以参考qmp-event.txt。
6、QMP样例
6.1. QEMU的欢迎消息
{
"QMP": {
"version": {
"qemu": {
"micro": 50, "minor": 6,"major": 1
},
"package": ""
},
"capabilities": []
}
}
6.2. 执行stop命令
C: { "execute": "stop" }
S: {"return": {} }
C代表client,即其他应用;S代表server,即QEMU。
6.3. 查询KVM信息
C: { "execute": "query-kvm","id": "example" }
S: { "return": {"enabled": true, "present": true }, "id":"example"}
6.4. 错误返回
C: { "execute": }
S: { "error":{ "class": "GenericError", "desc": "InvalidJSON syntax" } }
6.5. 掉电事件
S: { "timestamp": { "seconds":1258551470, "microseconds": 802384 }, "event":"POWERDOWN" }
7、Capabilities Negotiation模式
当一个应用连接到QEMU后,QEMU将会处于Capabilities Negotiation模式,在该模式下,只有qmp_capabilities命令可以被使用,当应用发送qmp_capabilities命令并且QEMU成功执行该命令后,QEMU将会处于Command模式,此时,除了qmp_capabilities之外的其他命令便可以使用了。
8、使用QAPI框架编写QMP接口
8.1. 一般步骤:
(1)在文件qapi-schema.json中写命令的类型声明;
(2)编写QMP命令本身,这是一个常规的C函数。 优选地,该命令应该由一些QEMU子系统导出。 但它也可以直接添加到qmp.c文件中。
(3)到此为止,这个QMP命令可以在QMP协议下被测试。
(4)