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これはプログラム制御にもっと強力ですが、私は試したことがありません。

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

おすすめ記事