qmp—QEMU Machine Protocol介绍

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)等效的编写HMP命令,但这不是必须的步骤。

8.2. 测试方式:

(1)启动QEMU

#/path/to/your/source/qemu [...] -cha
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值