我有一个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