web-dev-qa-db-ja.com

qemuモニターで実行中のqemuインスタンスに接続する

Windows 7でqemuのインスタンスを実行していますが、開いているターミナルなしで実行しています。次に、MyMachineNameという名前のマシンをシャットダウンするか、USBデバイスを追加します。スクリプト可能なソリューションが必要です。 Libvirtは私のシステムにとって他の欠点があるため、ソリューションではありません。

私は次のような魔法の行を探しています:

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

どうすればできますか?

6
Cutton Eye

誰かがTTYを操作するための適切なコマンドを使用して侵入することができるかもしれませんが、その間はネットワークに関する解決策を投稿します。

QEMUモニターをリダイレクトするには、いくつかのオプションがあります。 1つの方法は、QEMUにtelnet経由でモニターへのアクセスを提供させることです。

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

次に、コマンドをtelnetにパイプすることでQEMUをスクリプト化できます。これは、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

6
user277591

これを行うための私の好ましい方法は、UNIXソケットを介してQEMUの「モニター」に接続することです。メソッドは十分に文書化されていませんが、うまく機能します。

QEMUを起動するときに、次のように_-monitor_パラメーターを追加します。

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

_qemu-monitor-socket_ここはキーワードではなく、ディスク上のソケットを表すために選択したホストパスとファイル名です。 QEMUの起動時に作成されたこのファイルが表示されます。

オプション_server,nowait_は、接続をリッスンするようにQEMUに指示しますが、接続を待機している間はブロックしません。

socatユーティリティ(すべての適切なリポジトリから入手可能)を使用してソケットに接続し、QEMUモニタープロンプトへのコマンドを入力できます。

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

Socatが行うことは、2つの任意のストリーム/ソケットを接続することです。最初のパラメーター_-_は、stdioの同義語です。つまり、コンソールのキーボードと出力です。いくつかのオプション_echo=0,icanon=0_は、入力されたコマンドの再エコーを防止し、 Tab 履歴の補完と矢印キー。最後のパラメータは、前に作成したソケットファイルに接続することを示しています。

モニターにワンショットコマンドを発行するには、コマンドをechosocatに送信し、UNIXソケットを介してQEMUにパイプします。

_$ 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ベースのインターフェースを提供します。それはプログラムによる制御に対してはより堅牢かもしれませんが、私は試したことはありません。

  • ディスク上のソケットファイルは常に空です。データは保存されません。これは、プログラムが通信を確立するための任意のハンドルです。

8
Boann