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

这里列出几个范例

# 直接输入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 通过libvirt启动qemu,启用QMP

有2种方法:

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

qemu命令参数支持2种方法配置qmp,即-qmp和-mon

这里通过virsh做个简单示范

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

使用--pretty是为了让json的输出具有换行缩进的格式化效果,而不是打印在一行里
不需要在执行其他指令前执行{ "execute" : "qmp_capabilities" }

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

<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' 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的路径

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

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

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

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