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  /home/cmj/sourcecode/test.img -chardev socket,id=qmp,port=,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命令的简单使用。

参考:https://blog.csdn.net/wangwei222/article/details/80055615

https://www.cnblogs.com/YaoDD/p/5328088.html

qmp的简单使用的更多相关文章

  1. 基于QMP实现对qemu虚拟机进行交互

    本文详解QMP,包含qmp.hmp.qemu-guest-agent的介绍.工作原理.配置方法.范例 小慢哥的原创文章,欢迎转载 目录 ▪ QMP介绍 ▪ QMP语法 ▪ 单独使用qemu,启用QMP ...

  2. 【造轮子】打造一个简单的万能Excel读写工具

    大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...

  3. Fabio 安装和简单使用

    Fabio(Go 语言):https://github.com/eBay/fabio Fabio 是一个快速.现代.zero-conf 负载均衡 HTTP(S) 路由器,用于部署 Consul 管理的 ...

  4. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  5. 哪种缓存效果高?开源一个简单的缓存组件j2cache

    背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...

  6. 在Openfire上弄一个简单的推送系统

    推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...

  7. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  8. 使用 Nodejs 搭建简单的Web服务器

    使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块. ...

  9. ASP.NET Aries 入门开发教程2:配置出一个简单的列表页面

    前言: 朋友们都期待我稳定地工作,但创业公司若要躺下,也非意念可控. 若人生注定了风雨飘摇,那就雨中前行了. 最机开始看聊新的工作机会,欢迎推荐,创业公司也可! 同时,趁着自由时间,抓紧把这系列教程给 ...

随机推荐

  1. 开源一个CSV解析器(附设计过程 )

    在ExcelReport支持csv的开发过程中,需要一个NETStandard的csv解析器.在nuget上找了几个试用,但都不太适合. 于是,便有了:AxinLib.IO.CSV. 先看看怎么用: ...

  2. 抓包神器 tcpdump 使用介绍

    tcpdump 命令使用简介 简单介绍 tcpdump 是一款强大的网络抓包工具,运行在 linux 平台上.熟悉 tcpdump 的使用能够帮助你分析.调试网络数据. 要想使用很好地掌握 tcpdu ...

  3. MySQL查询库和表占用的硬盘空间大小

    在mysql中有一个默认的数据表information_schema,information_schema这张数据表保存了MySQL服务器所有数据库的信息.如数据库名,数据库的表,表栏的数据类型与访问 ...

  4. [elk]bin/elasticsearch-sql-cli使用

    在探sql groupby语句 这个长久不用竟然忘记 part name age dep1 ara 22 dep1 arb 22 dep1 arc 22 dep2 ema 10 dep2 emc 11 ...

  5. python(61):str 和 bytes 转换

    str 和 bytes 转换 b = b"example" # str object s = "example" # str to bytes bytes(s, ...

  6. vultr搭建ss

    我在Ubuntu1604上运行的sslocal,但是发现firefox无法链接ss代理,后来用的chromium才成功连接上, ---------------------------- 下面是正文 - ...

  7. IDEA设置换行符为Unix编码格式,设置编码统一为UTF-8,自动生成serialVersionUID

    设置换行符为Unix编码格式 设置编码统一为UTF-8 自动生成serialVersionUID.勾选"Serializable class without serialVersionUID ...

  8. Android多种格式的异步解压/压缩解决方案

    前言 最近由于项目需要,需要我谅解一下关于在移动平台的解压功能,在移动平台解压,我个人感觉是没有太大必要的,毕竟手机的性能有限.但是,不口否认,移动端的解压功能又是必备的,因为如果对于一些资源管理器类 ...

  9. 一个自定义python分布式专用爬虫框架。支持断点爬取和确保消息100%不丢失,哪怕是在爬取进行中随意关停和随意对电脑断电。

    0.此框架只能用于爬虫,由框架来调度url请求,必须按照此方式开发,没有做到类似celery的通用分布式功能,也不方便测试.可以使用另外一个,基于函数式编程的,调度一切函数的分布式框架,做到了兼容任何 ...

  10. golang 多个worker正常关闭的示例

    代码如下,如有问题请联系 baibaibai_000@163.com package work_test import ( "math/rand" "runtime&qu ...