使用 qemu 监视器连接到正在运行的 qemu 实例

使用 qemu 监视器连接到正在运行的 qemu 实例

我有一个qemu在 Windows 7 上运行的实例,在没有打开终端的情况下运行。现在我想关闭名为的机器我的机器名或向其中添加 USB 设备。我需要一个可编写脚本的解决方案。 Libvirt 不是一个解决方案,因为它对我的系统还有其他缺点。

我正在寻找一条神奇的线,例如:

qemu-monitor -connect=MyMachineName command="shutdown"

我该怎么做?

答案1

我首选的方法是通过 UNIX 套接字连接到 QEMU“监视器”。尽管该方法的记录很少,但效果很好。

启动QEMU时,添加-monitor参数如下:

$ qemu-system-i386 [..other params..] -monitor unix:qemu-monitor-socket,server,nowait

qemu-monitor-socket这里不是关键字,而是您选择的表示磁盘上套接字的主机路径和文件名。您将看到 QEMU 启动时创建的此文件。

这些选项server,nowait告诉 QEMU 侦听连接,但启动虚拟机而不等待连接。

您可以使用索卡特实用程序(可从所有好的存储库中获取)连接到套接字以在 QEMU 监视器提示符下键入命令:

$ socat -,echo=0,icanon=0 unix-connect:qemu-monitor-socket
QEMU 2.8.1 monitor - type 'help' for more information
(qemu) _

socat 的作用是将两个任意流/套接字连接在一起。第一个参数-是 的同义词stdio,即控制台键盘和输出。这两个选项echo=0,icanon=0通过防止重新回显输入的命令并启用Tab历史记录的完成键和箭头键,使键盘交互变得更好。最后一个参数表示连接到之前创建的套接字文件。

要向 QEMU 发送一次性命令,回声它通过 socat 到达 UNIX 套接字:

$ echo "info status" | socat - unix-connect:qemu-monitor-socket
QEMU 2.8.1 monitor - type 'help' for more information
(qemu) info status
VM status: running
(qemu)
$ _

为了使脚本中的输出更清晰,我还添加了| tail --lines=+2 | grep -v '^(qemu)'过滤器以过滤掉第一行和(qemu)提示行:

$ echo "info status" | socat - unix-connect:qemu-monitor-socket | tail --lines=+2 | grep -v '^(qemu)'
VM status: running
$ _

要根据需要关闭虚拟机,有用的监视器命令是system_powerdown,它按下假想机器的开/关按钮,以便它可以正常关闭,或者quit,它立即退出 QEMU。

一些注意事项:

  • QEMU 还允许提供基于 JSON 的接口-qmp来代替;-monitor这对于程序控制来说可能更强大,但我从未尝试过。

  • 磁盘上的套接字文件始终为空。它不存储数据;它只是程序打开通信的任意句柄。

答案2

有人可能能够使用正确的命令来在 TTY 上进行操作,但我会同时发布一个涉及网络的解决方案。

有几个选项可用于重定向 QEMU 监视器。一种方法是让 QEMU 通过 telnet 提供对其监视器的访问:

$ qemu-system-i386 -monitor telnet:127.0.0.1:55555,server,nowait;

然后,可以通过将命令传送到 .QEMU 来编写脚本telnet。只要可以丢弃命令的输出就可以了,因为 telnet 会话可能会关闭得太快而无法获得视觉反馈:

$ echo system_powerdown |telnet 127.0.0.1 55555
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Connection closed by foreign host.
$ _  # qemu sends the guest an ACPI shutdown signal

如果需要收集在监视器上执行的命令的输出,可以使用 TCP 会话:

$ qemu-system-i386 -monitor tcp:127.0.0.1:55555,server,nowait;

netcat然后,可以通过或类似的实用程序将命令发送到监听监视器:

$ echo info\ kvm |nc -N 127.0.0.1 55555
QEMU 2.11.0 monitor - type 'help' for more information
(qemu) info kvm
kvm support: enabled
(qemu) $ echo system_powerdown |nc -N 127.0.0.1 55555
QEMU 2.11.0 monitor - type 'help' for more information
(qemu) system_powerdown
(qemu) $  # hit return
$ _  # qemu sends the guest an ACPI shutdown signal

以下是 QEMU 监控命令的部分文档的链接:https://en.wikibooks.org/wiki/QEMU/Monitor

相关内容