利用QMP和QEMU虚拟机交互的几种方式
QMP是一种基于JSON格式的传输协议,我们能利用它与一个QEMU虚拟机实例进行交互,例如查询,更改虚拟机的状态,获取设备信息等等。下面是几种创建QMP的方法以及对其它的一些基本命令的使用:
1、基于Telnet创建QMP
首先利用如下命令启动一个QEMU虚拟机实例
qemu-system-x86_64 linux-0.2.img -qmp tcp:localhost:4444,server --monitor stdio
然后启动Telnet连接localhost的4444端口
telnet localhost 4444
这时会在Telnet所在的目录下显示如下内容:
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. {"QMP": {"version": {"qemu": {"micro": 0, "minor": 0, "major": 2}, "package": " (Debian 2.0.0+dfsg-2ubuntu1.21)"}, "capabilities": []}}
2、基于UNIX socket 创建QMP
依然先启动一个QEMU虚拟机实例
qemu-system-x86_64 linux-0.2.img -qmp unix:qmp-sock,server
其中qmp-sock文件会在命令执行之后自动在本地目录创建,当然也可以指定一个sock文件
然后在qmp-sock所在目录下,利用如下命令与QMP建立连接
nc -U qmp-sock
3、QMP基本命令
(1)在创建了QMP之后,在输入其他命令之前,首先要输入如下命令:
{ "execute": "qmp_capabilities" }
只有在返回下面的指令之后,我们才能使用其他命令:
{ "return": {}}
(2)查询虚拟机状态:
{ "execute": "query-status" }
当虚拟机正常运行时,会返回如下指令:
{"return": {"status": "running", "singlestep": false, "running": true}}
当虚拟机处于热迁移的监听状态时,返回如下指令:
{"return": {"status": "inmigrate", "singlestep": false, "running": false}}
其他指令利用类似于上述的方式交互即可。