使用 qemu 監視器連接到正在執行的 qemu 實例
我有一個
qemu
在 Windows 7 上執行的實例,在沒有打開終端的情況下執行。現在我想關閉名稱為MyMachineName的機器或向其添加 USB 設備。我需要一個可編寫腳本的解決方案。Libvirt 不是解決方案,因為它對我的系統還有其他缺點。我正在尋找一條神奇的線,例如:
qemu-monitor -connect=MyMachineName command="shutdown"
我該怎麼做?
有人可能會使用正確的命令來在 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
我首選的方法是通過 UNIX 套接字連接到 QEMU “監視器”。它運作良好,儘管該方法的文件記錄非常差。
啟動QEMU時,添加
-monitor
如下參數:$ qemu-system-i386 [..other params..] -monitor unix:qemu-monitor-socket,server,nowait
qemu-monitor-socket
這裡不是關鍵字,而是您選擇的主機路徑和文件名來表示磁碟上的套接字。當 QEMU 啟動時,你會看到這個文件被創建。這些選項
server,nowait
告訴 QEMU 監聽連接,但不等待連接就啟動 VM。您可以使用socat實用程序(可從所有優秀的儲存庫中獲得)連接到套接字以在 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 $ _
要根據需要關閉 VM,有用的監視器命令是
system_powerdown
,它按下虛擬機器的開/關按鈕,以便它可以正常關閉,或者quit
,它立即退出 QEMU。幾點注意事項:
- QEMU 還允許
-qmp
代替-monitor
,提供基於 JSON 的介面;這對於程序控制可能更強大,但我從未嘗試過。- 磁碟上的套接字文件始終為空。它不儲存數據;它只是程序打開通信的任意句柄。