基于QMP实现对QEMU虚拟机进行交互

小慢哥的原创文章,欢迎转载

目录

▪ QMP介绍
▪ QMP语法
▪ 单独使用qemu,启用QMP
▪ 通过libvirt启动qemu,启用QMP
▪ qemu-guest-agent(qemu-ga)
▪ 官方参考文档

QMP介绍

qemu对外提供了一个socket接口,称为qemu monitor,通过该接口,可以对虚拟机实例的整个生命周期进行管理,主要有如下功能

▷ 状态查看、变更
▷ 设备查看、变更
▷ 性能查看、限制
▷ 在线迁移
▷ 数据备份
▷ 访问内部操作系统

通过该socket接口传递交互的协议是qmp,全称是qemu monitor protocol,这是基于json格式的协议

在继续往下讲之前,需要先了解qemu、kvm、libvirt之间的区别(因为有很多童鞋对这三者的理解是混乱的)

▷ qemu:虚拟机仿真器。通过软件模拟出cpu、内存、磁盘、主板、网卡等设备
▷ kvm:高性能的cpu仿真器。由于软件模拟的cpu性能很差,因此出现了kvm,这是通过硬件与内核的支持实现接近native性能的cpu仿真器,可以理解为虚拟机里的cpu任务直接交给物理机cpu完成。
▷ libvirt:虚拟机管理平台。能纳管qemu、lxc、esx等虚拟化软件,通过编写xml实现对虚拟机、存储、网络等进行配置和管理

上面只描述最核心的功能,另有一些高级功能,以及互相重叠的功能在这里不做描述,否则容易混淆

QMP语法 # 不带参数的指令 { "execute" : "XXX" } # 带参数的指令 { "execute" : "XXX", "arguments" : { ... } } 单独使用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

使用hmp不需要输入类似qmp的{ "execute" : "qmp_capabilities" }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/68aec4c0a415ffcc376d614e0d5d8c3c.html