来自:mjsws > 馆藏分类
配色: 字号:
基于QMP实现对qemu虚拟机进行交互
2019-01-15 | 阅:  转:  |  分享 
  
基于QMP实现对qemu虚拟机进行交互本文详解QMP,包含qmp、hmp、qemu-guest-agent的介绍、工作原理、配置方法、范例目
录?QMP介绍?QMP语法?单独使用qemu,启用QMP?通过libvirt启动qemu,启用QMP?qemu-gues
t-agent(qemu-ga)?官方参考文档QMP介绍qemu对外提供了一个socket接口,称为qemumonitor,通
过该接口,可以对虚拟机实例的整个生命周期进行管理,主要有如下功能?状态查看、变更?设备查看、变更?性能查看、限制?在线迁移
?数据备份?访问内部操作系统通过该socket接口传递交互的协议是qmp,全称是qemumonitorprotocol,这
是基于json格式的协议在继续往下讲之前,需要先了解qemu、kvm、libvirt之间的区别(因为有很多童鞋对这三者的理解是混乱
的)?qemu:虚拟机仿真器。通过软件模拟出cpu、内存、磁盘、主板、网卡等设备www.gw638.cn?kvm:高性能的c
pu仿真器。由于软件模拟的cpu性能很差,因此出现了kvm,这是通过硬件与内核的支持实现接近native性能的cpu仿真器,可以理
解为虚拟机里的cpu任务直接交给物理机cpu完成。?libvirt:虚拟机管理平台。能纳管qemu、lxc、esx等虚拟化软件,
通过编写xml实现对虚拟机、存储、网络等进行配置和管理上面只描述最核心的功能,另有一些高级功能,以及互相重叠的功能在这里不做描述,
否则容易混淆QMP语法#不带参数的指令{"execute":"XXX"}#带参数的指令{"execute":"X
XX","arguments":{...}}单独使用qemu,启用QMP启动qemu虚拟机#qemumonitor
采用tcp方式,监听在127.0.0.1上,端口为4444/usr/libexec/qemu-kvm-qmptcp:127.0
.0.1:4444,server,nowait#qemumonitor采用unixsocket,socket文件生成于/op
t/qmp.socket/usr/libexec/qemu-kvm-qmpunix:/opt/qmp.socket,serve
r,nowait连接qemumonitor#tcp可以通过telnet进行连接,方法如下>telnet127.0.0.1
4444Trying127.0.0.1...Connectedto127.0.0.1.Escapecharacteris
''^]''.{"QMP":{"version":{"qemu":{"micro":0,"minor":12,"maj
or":2},"package":"qemu-kvm-ev-2.12.0-18.el7_6.1.1"},"capabili
ties":[]}}#unixsocket可以通过nc-U进行连接,方法如下>nc-Uqmp.socket{"QMP
":{"version":{"qemu":{"micro":0,"minor":12,"major":2},"p
ackage":"qemu-kvm-ev-2.12.0-18.el7_6.1.1"},"capabilities":[]}}
按照上面执行完命令后,不会退出而是继续等待输入,但这个时候还无法使用,接着,需要输入一条qmp指令才可以{"execute":
"qmp_capabilities"}此时屏幕会输出以下内容,表示从"capabilitiesnegotiation模式"进
入了"command"模式{"return":{}}接下来,就可以执行qmp的指令了,qmp指令非常多,由于篇幅有限,这里仅举几
个例子(更多内容请参考官方文档,本文最后附上网址)#查看支持哪些qmp指令{"execute":"query-command
s"}#虚拟机状态{"execute":"query-status"}#虚拟机暂停{"execute":"stop
"}#磁盘查看{"execute":"query-block"}#磁盘在线插入{"execute":"blockd
ev-add","arguments":{"driver":"qcow2","node-name":"drive-vi
rtio-disk1","file":{"driver":"file","filename":"/opt/data.q
cow2"}}}{"execute":"device_add","arguments":{"driver":"v
irtio-blk-pci","drive":"drive-virtio-disk1"}}#磁盘完整备份{"execu
te":"drive-backup","arguments":{"device":"drive-virtio-d
isk0","sync":"full","target":"/opt/backuptest/fullbackup.
img"}}除了使用telnet、nc从外部连接,还可以在qemu启动时候进入一个交互的cli界面,直接输入指令,只不过这个时
候输入的是hmp(humanmonitorprotocol),而不是qmp。hmp简化了qmp的使用,但实际在底层依然是转化为
qmp进行操作的,配置方法如下/usr/libexec/qemu-kvm-qmptcp:127.0.0.1:4444,serv
er,nowait-monitorstdio此时会出现交互界面,输入help,就可以看到hmp支持的所有命令(qemu)he
lp使用hmp不需要输入类似qmp的{"execute":"qmp_capabilities"}这里列出几个范例#直接输
入info回车,可以看到所有查询类的指令使用方法(qemu)info#查看块设备www.f-1.cc(qemu)infob
lock#在线增加磁盘(qemu)drive_add0file=/opt/data.qcow2,format=qcow2,
id=drive-virtio-disk1,if=none(qemu)device_addvirtio-blk-pci,scs
i=off,drive=drive-virtio-disk1通过libvirt启动qemu,启用QMP有2种方法:1.xml里不
做任何额外配置,默认就会启用QMP,但通过这种方法启用的QMP,只能通过libvirt接口(比如virsh命令或libvirta
pi)来进行QMP指令的输入,而不能通过telnet、nc之类的,因为默认启用的QMP,只会生成unixsocket(位于/va
r/lib/libvirt/qemu/domain-xx-DOMAIN/monitor.sock),而该socket被libvir
td始终连接占用着。此时通过psaux命令可以看到qemu进程参数,和之前有点不太一样,不是-qmp,而是如下-chardev
socket,id=charmonitor,fd=36,server,nowait\-monchardev=charmonit
or,id=monitor,mode=controlqemu命令参数支持2种方法配置qmp,即-qmp和-mon这里通过virsh
做个简单示范virshqemu-monitor-commandDOMAIN--pretty''{"execute":"q
uery-block"}''使用--pretty是为了让json的输出具有换行缩进的格式化效果,而不是打印在一行里不需要在执行其他
指令前执行{"execute":"qmp_capabilities"}2.在xml里额外增加2段配置,注意看下面这个xm
l的第一行,需要增加一个xmlns:qemu,另外在里增加kvm''xmlns:qemu=''http://libvirt.org/schemas/domain/qemu/1.0''>...
...p''/>commandline>
接着通过libvirt启动qemu(比如virshstartxxx),就创建了2个q
mp通道,一个是libvirt默认创建的,可以依然使用libvirt接口来执行QMP指令,另一个就是自定义的qmp,可以通过上面提
到的nc来使用nc-U/tmp/qmp-socklibvirt也支持hmp:virshqemu-monitor-comman
dDOMAIN--hmp''infoblock''qemu-guest-agent(qemu-ga)通过qmp还可以对虚拟机内
的操作系统进行RPC操作,其原理是:1.先在xml里配置channel段,然后启动虚拟机,会在宿主机上生成一个unixsock
et,同时在vm里生成一个字符设备,生成的unixsocket和字符设备可以理解为一个channel隧道的两端2.虚拟机里要启
动qemu-guest-agent守护进程,该守护进程会监听字符设备3.然后可以在宿主机上将虚拟机里的qemu-guest-ag
ent所支持的RPC指令经过channel发送到虚拟机里,虚拟机里的qemu-guest-agent从字符设备收到数据后,执行指令
,比如读写文件、修改密码等等若要使用qemu-guest-agent需要满足以下条件1.xml里配置channel,范例:maintype=''kvm''>......mode=''bind''path=''/tmp/channel.sock''/>=''org.qemu.guest_agent.0''/>注意,path
可以自定义,但name需要保持org.qemu.guest_agent.0,因为这会影响虚拟机里字符设备的文件名,而虚拟机里的qe
mu-guest-agent服务默认读取的是对应org.qemu.guest_agent.0的字符设备,如果改了name,那么qe
mu-guest-agent的配置文件也要跟着改,改成对应name的路径2.虚拟机内的操作系统内核需要支持(linux、wind
ows均支持)3.虚拟机里要安装并启动qemu-ga的服务(比如centos可以yuminstallqemu-ga&&s
ystemctlstartqemu-guest-agent,windows通过导入virtio-win的iso,该iso里包含
有qemu-ga程序)当按照上述配置好后,可以在宿主机上进行RPC操作#测试虚拟机里的qemu-guest-agent是否可用v
irshqemu-agent-commandDOMAIN--pretty''{"execute":"guest-ping
"}''#查看支持的qemu-guest-agent指令www.letaoqpyx.comvirshqemu-agent-c
ommandDOMAIN--pretty''{"execute":"guest-info"}''#获得网卡信息virsh
qemu-agent-commandDOMAIN--pretty''{"execute":"guest-network-
get-interfaces"}''#执行命令,这是异步的,第一步会返回一个pid,假设为797,在第二步需要带上这个pidvirshqemu-agent-commandDOMAIN--pretty''{"execute":"guest-exec","arguments":{"path":"ip","arg":["addr","list"],"capture-output":true}}''virshqemu-agent-commandDOMAIN--pretty''{"execute":"guest-exec-status","arguments":{"pid":797}}''qemu-guest-agent不支持hmp调用
献花(0)
+1
(本文系mjsws首藏)