Qemu

使用 qemu 監視器連接到正在執行的 qemu 實例

  • July 12, 2020

我有一個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 的介面;這對於程序控制可能更強大,但我從未嘗試過。
  • 磁碟上的套接字文件始終為空。它不儲存數據;它只是程序打開通信的任意句柄。

引用自:https://unix.stackexchange.com/questions/426652