qemu モニターを使用して実行中の qemu インスタンスに接続する

qemu モニターを使用して実行中の qemu インスタンスに接続する

qemu端末を開かずにWindows 7でインスタンスを実行しています。今、私は次のコンピュータをシャットダウンしたいと思います。マイコンピュータ名またはUSBデバイスを追加してください。スクリプト可能なソリューションが必要です。 Libvirtは私のシステムに他の欠点があるため、ソリューションではありません。

私は次の魔法の行を探しています。

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

どうすればいいですか?

答え1

私が好む方法は、UNIXソケットを介してQEMU "Monitor"に接続することです。この方法は正しく文書化されていませんが、うまく機能します。

QEMUを開始するときに、以下-monitorのパラメーターを追加します。

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

qemu-monitor-socketこれはキーワードではなく、ディスク上のソケットを表すホストパスとファイル名を選択することです。 QEMUが起動すると、このファイルが生成されていることがわかります。

このオプションはserver,nowaitQEMUに接続を受信しますが、接続を待たずに仮想マシンを起動するように指示します。

あなたはそれを使用することができますソカットユーティリティ(すべての良いリポジトリで利用可能)はソケットに接続し、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これらの2つのオプションは、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をすぐにシャットダウンすることです。

いくつかの注意:

  • -qmpQEMUを使用すると、代わりにJSONベースのインターフェースを提供できます。-monitorこれはプログラム制御にもっと強力ですが、私は試したことがありません。

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

答え2

誰かがTTYで正しいコマンドを使用してこれを実行できますが、その間にネットワーキングに関連するソリューションを公開します。

QEMUモニターをリダイレクトするには、いくつかのオプションがあります。 1つの方法は、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

関連情報