1. QMP介绍

qmp全称是qemu monitor protocol,qemu对外提供了一个socket接口,称为qemu monitor,通过该接口,可以对虚拟机实例的进行管理。

2. QMP语法

# 不带参数的指令
{ "execute" : "XXX" }# 带参数的指令
{ "execute" : "XXX", "arguments" : { ... } }

3. 单独使用qemu,启用QMP

启动qemu虚拟机

# qemu monitor采用tcp方式,监听在127.0.0.1上,端口为4444
> /usr/libexec/qemu-kvm -qmp tcp:127.0.0.1:4444,server,nowait# qemu monitor采用unix socket,socket文件生成于/opt/qmp.socket
> /usr/libexec/qemu-kvm -qmp unix:/opt/qmp.socket,server,nowait

连接qemu monitor

# tcp可以通过telnet进行连接,方法如下
> telnet 127.0.0.1 4444
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
{"QMP": {"version": {"qemu": {"micro": 0, "minor": 12, "major": 2}, "package": "qemu-kvm-ev-2.12.0-18.el7_6.1.1"}, "capabilities": []}}# unix socket可以通过nc -U进行连接,方法如下
? nc -U qmp.socket
{"QMP": {"version": {"qemu": {"micro": 0, "minor": 12, "major": 2}, "package": "qemu-kvm-ev-2.12.0-18.el7_6.1.1"}, "capabilities": []}}

按照上面执行完命令后,不会退出而是继续等待输入,但这个时候还无法使用,接着,需要输入一条qmp指令才可以

{ "execute" : "qmp_capabilities" }

此时屏幕会输出以下内容,表示从"capabilities negotiation模式"进入了"command"模式

{"return": {}}

接下来,就可以执行qmp的指令了,qmp指令非常多,由于篇幅有限,这里仅举几个例子(更多内容请参考官方文档,本文最后附上网址)

# 查看支持哪些qmp指令
{ "execute": "query-commands" }# 虚拟机状态
{ "execute": "query-status" }# 虚拟机暂停
{ "execute": "stop" }# 磁盘查看
{ "execute": "query-block" }# 磁盘在线插入
{ "execute": "blockdev-add", "arguments": { "driver": "qcow2", "node-name": "drive-virtio-disk1", "file": { "driver": "file", "filename": "/opt/data.qcow2" } } }
{ "execute": "device_add", "arguments": { "driver": "virtio-blk-pci", "drive": "drive-virtio-disk1" } }# 磁盘完整备份
{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-virtio-disk0" , "sync" : "full" , "target" : "/opt/backuptest/fullbackup.img" } }

除了使用telnet、nc从外部连接,还可以在qemu启动时候进入一个交互的cli界面,直接输入指令,只不过这个时候输入的是hmp(human monitor protocol),而不是qmp。hmp简化了qmp的使用,但实际在底层依然是转化为qmp进行操作的,配置方法如下

/usr/libexec/qemu-kvm -qmp tcp:127.0.0.1:4444,server,nowait -monitor stdio

此时会出现交互界面,输入help,就可以看到hmp支持的所有命令

(qemu) help

示例

# 直接输入info回车,可以看到所有查询类的指令使用方法
(qemu) info# 查看块设备
(qemu) info block# 在线增加磁盘
(qemu) drive_add 0 file=/opt/data.qcow2,format=qcow2,id=drive-virtio-disk1,if=none
(qemu) device_add virtio-blk-pci,scsi=off,drive=drive-virtio-disk1

4. 通过libvirt启动qemu,启用QMP

方法1:
xml里不做任何额外配置,默认就会启用QMP,但通过这种方法启用的QMP,只能通过libvirt接口(比如virsh命令或libvirt api)来进行QMP指令的输入,而不能通过telnet、nc之类的,因为默认启用的QMP,只会生成unix socket(位于/var/lib/libvirt/qemu/domain-xx-DOMAIN/monitor.sock),而该socket被libvirtd始终连接占用着。此时通过ps aux命令可以看到qemu进程参数,和之前有点不太一样,不是-qmp,而是如下:

-chardev socket,id=charmonitor,fd=36,server,nowait \
-mon chardev=charmonitor,id=monitor,mode=control

通过virsh发送命令

virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "query-block" }'

方法2:
在xml里额外增加2段配置,注意看下面这个xml的第一行,需要增加一个xmlns:qemu,另外在里增加qemu:command

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>...<devices>...</devices><qemu:commandline><qemu:arg value='-qmp'/><qemu:arg value='unix:/tmp/qmp-sock,server,nowait'/></qemu:commandline>
</domain>

接着通过libvirt启动qemu(比如virsh start xxx),就创建了2个qmp通道,一个是libvirt默认创建的,可以依然使用libvirt接口来执行QMP指令,另一个就是自定义的qmp,可以通过上面提到的nc来使用

nc -U /tmp/qmp-sock

libvirt也支持hmp:

virsh qemu-monitor-command DOMAIN --hmp 'info block'

5. qemu-guest-agent(qemu-ga)

通过qmp还可以对虚拟机内的操作系统进行RPC操作,其原理是:

  1. 先在xml里配置channel段,然后启动虚拟机,会在宿主机上生成一个unix socket,同时在vm里生成一个字符设备,生成的unix socket和字符设备可以理解为一个channel隧道的两端
  2. 虚拟机里要启动qemu-guest-agent守护进程,该守护进程会监听字符设备
  3. 然后可以在宿主机上将虚拟机里的qemu-guest-agent所支持的RPC指令经过channel发送到虚拟机里,虚拟机里的qemu-guest-agent从字符设备收到数据后,执行指令,比如读写文件、修改密码等等

若要使用qemu-guest-agent需要满足以下条件:

  1. xml里配置channel,范例
<domain type='kvm'>...<devices>...<channel type='unix'><source mode='bind' path='/tmp/channel.sock'/><target type='virtio' name='org.qemu.guest_agent.0'/></channel></devices>
</domain>

注意,path可以自定义,但name需要保持org.qemu.guest_agent.0,因为这会影响虚拟机里字符设备的文件名,而虚拟机里的qemu-guest-agent服务默认读取的是对应org.qemu.guest_agent.0的字符设备,如果改了name,那么qemu-guest-agent的配置文件也要跟着改,改成对应name的路径

  1. 虚拟机内的操作系统内核需要支持(linux、windows均支持)

  2. 虚拟机里要安装并启动qemu-ga的服务(比如centos可以yum install qemu-ga && systemctl start qemu-guest-agent,windows通过导入virtio-win的iso,该iso里包含有qemu-ga程序)

当按照上述配置好后,可以在宿主机上进行RPC操作

# 测试虚拟机里的qemu-guest-agent是否可用
virsh qemu-agent-command DOMAIN --pretty '{ "execute": "guest-ping" }'# 查看支持的qemu-guest-agent指令
virsh qemu-agent-command DOMAIN --pretty '{ "execute": "guest-info" }'# 获得网卡信息
virsh qemu-agent-command DOMAIN --pretty '{ "execute": "guest-network-get-interfaces" }'# 执行命令,这是异步的,第一步会返回一个pid,假设为797,在第二步需要带上这个pid
virsh qemu-agent-command DOMAIN --pretty '{ "execute": "guest-exec", "arguments": { "path": "ip", "arg": [ "addr", "list" ], "capture-output": true } }'
virsh qemu-agent-command DOMAIN --pretty '{ "execute": "guest-exec-status", "arguments": { "pid": 797 } }'

qemu-guest-agent不支持hmp调用

虚拟机里的/etc/sysconfig/qemu-ga内容中的BLACKLIST_RPC参数可以配置禁止哪些指令

参考:
基于QMP实现对qemu虚拟机进行交互
https://qemu.weilnetz.de/doc/qemu-doc.html
https://qemu.weilnetz.de/doc/qemu-qmp-ref.html
https://qemu.weilnetz.de/doc/qemu-ga-ref.html

通过QMP/QGA与虚拟机进行交互相关推荐

  1. 配置华为设备ssh登录实现网络设备与VMWare虚拟机信息交互

    华为路由器配置ssh登录 前言 前提条件 配置步骤 1. 进入系统编辑视图 2. 创建本地RSA密钥对 3. 配置vty界面支持的登录协议 4. 创建SSH用户xxx 5. 在AAA视图下创建同名的l ...

  2. Xcode iOS 虚拟机,交互效果特别慢

    快捷键: command+T https://blog.csdn.net/yu_m_k/article/details/81226390

  3. Qemu Guest Agent方式实现libvirt与虚机交互

    一.qga简介 1.qga工具 qemu guest agent,简称qga,是一个运行在虚拟机内部的普通应用程序,可实现宿主机libvirt和虚拟机的通信,宿主机可通过向虚机中的qga发送命令控制虚 ...

  4. kvm虚拟机_通过QEMU-GuestAgent实现从外部注入写文件到KVM虚拟机内部

    本文将以宿主上直接写文件到VM内部为例讲解为何要注入以及如何实现 tag: qemu-ga, qemu guest agent, kvm, guest-file-write, inject 小慢哥的原 ...

  5. 通过QEMU-GuestAgent实现从外部注入写文件到KVM虚拟机内部

    本文将以宿主上直接写文件到VM内部为例讲解为何要注入以及如何实现 目录 ▪ 为什么要"注入"到VM内部 ▪ 如何实现"注入" ▪ Step1. 为VM配置cha ...

  6. Qemu-guest-agent(QGA)原理介绍及接口扩展

    Qemu-guest-agent(QGA)原理介绍及接口扩展 1. 原理介绍 qga是一个运行在虚拟机内部的普通应用程序(可执行文件名称默认为qemu-ga,服务名称默认为qemu-guest-age ...

  7. VM虚拟机链接克隆及linux eth0网卡的快速设置方法

    对于后台开发者来说,在学习过程中必然接触众多中间件,在自己的虚拟机进行操作甚至搭建cluster是很常见的事情. 我在初学者时摸索出一套快速的克隆虚拟机方法.分享给大家. 产品VMware® Work ...

  8. 使用Hyper-V Server创建Linux虚拟机

    通过 Hyper-V 及 Windows Azure 供应 Linux,这是微软改善对开源软件支持情况的一大举措.作为该倡议的一部分,微软的 Linux 集成服务(LIS)团队持续开发着先进的 Lin ...

  9. VMWARE VICLIENT实现虚拟机独立管理

    1.使用管理员账号登陆vi 2.新建一个角色,让这个角色只拥有对虚拟机的交互权限      点击管理-添加角色,添加一个只有对虚拟机有交互权限,没有更改虚拟机配置权限的角色,名称叫做test 3.新建 ...

最新文章

  1. 一键fxxk,代码修复神器拯救你
  2. 解决sublime3 中文乱码问题
  3. Hadoop常见错误解析
  4. sklearn自学指南(part11)--Elastic-Net及多任务Elastic-Net
  5. 一,数据库基础,MySQL安装,配置文件,语法
  6. 递归下降分析法的基本思想。_语法分析 | 递归下降分析算法
  7. 为什么基于接口而非实现编程?
  8. 20款开源搜索引擎介绍与比较
  9. TextView跑马灯的几点问题:持续动画 和 与EditText争抢焦点的问题
  10. Java太阳系行星运动模型
  11. dos盘启动计算机,u盘dos启动盘怎么制作 u盘dos启动盘制作步骤【详细介绍】
  12. NI CompactRIO嵌入式系统开发流程总结
  13. Steam上传游戏包体的三种方法
  14. highcharts向下钻取饼图
  15. word文档更新目录为什么更新不了?
  16. Python数据分析练习(一)(餐厅订单分析meal_order_detail)
  17. 5064. 删除字符串中的所有相邻重复项
  18. 基于单片机的D/A三角波发生器设计(电路+程序)
  19. 艾睿电子Arrow EDI ORDERS订单解读
  20. 《三体》与《西部世界》

热门文章

  1. BUAA_OO_第二单元
  2. MySQL 可以用localhost 连接,但不能用IP连接的问题,局域网192.168.*.* 无法连接mysql...
  3. FastRoute - 快速请求路由
  4. Facebook 的应用机器学习平台
  5. 我花了一年时间来学机器学习
  6. SQL Server SQL高级查询语句小结(转)
  7. ALV的颜色分为行的颜色、列的颜色和CELL的颜色
  8. spring配置文件加载流程
  9. G-华华对月月的忠诚
  10. Java并发编程实战笔记