qemu vm のシャットダウン (QMP を使用して telnet 経由で開始) が完了したことを知る

qemu vm のシャットダウン (QMP を使用して telnet 経由で開始) が完了したことを知る

qemu(Windows Server 2003)仮想マシンを起動すると、

-qmp tcp:127.0.0.1:4444,server,nowait

次のスクリプトでシャットダウンできます

#!/bin/bash
telnet 127.0.0.1 4444 <<JSON 
{ "execute": "qmp_capabilities" } 
{ "execute": "system_powerdown" } 

JSON

しかし、2つの問題があります。

  1. スクリプトは $? = 1 で終了し、「外部ホストによって接続が閉じられました」と表示されます。これをクリーンな方法で終了させることはできますか?

  2. シャットダウン プロセスは非同期で実行されます。したがって、スクリプトは、VM がシャットダウンを完了するのを待たずに、すぐに戻ります。いつ完了したかを知るにはどうすればよいですか (qemu の ps を grep したり、これに類するものを使用せずに)?

背景としては、Linux ホスト上の VM 内に Windows Server 2003 インストールをホストし、UPS を使用したいと考えています。停電が発生した場合は、VM をシャットダウンしてからホストをシャットダウンします。もちろん、VM が完了するまでホストはシャットダウンを開始しません。

答え1

expect を使用すると可能です。vm が終了すると、「SHUTDOWN」というイベントが発行されます。次のスクリプトはシャットダウンを開始し、完了するまで待機します。

#!/usr/bin/expect

set timeout -1

spawn telnet 127.0.0.1 4444

expect "QMP"
send "{ 'execute': 'qmp_capabilities' }\n"

expect "return"
send "{ 'execute': 'system_powerdown' }\n"

expect "SHUTDOWN"

私の質問にはすでに反対票が集まっており、特に次の発言を考慮すると

上記のようなことを行っている場合、他のすべてはおそらく完全に混乱しており、かろうじて機能しているだけであり、間違った見方をすると壊れてしまいます。

もう 1 つ言わなければなりません。このようなことを行うと、特に VM 自体が「おそらく大混乱」になる理由がまったくわかりません。libvirt 経由で起動すると、シェル スクリプトで実行した場合とまったく同じことが行われます。なぜ「ほとんど機能しない」のでしょうか。さらに、QMP は、telnet などを通じて「このようなこと」をこのように実行できるように設計され、利用できるようになっています。そうではありませんか。

また、libvirt は、複数の仮想化ソリューションのインターフェースへのラッパーにすぎず、異なるハイパーバイザーで実行される複数の VM インストールを同じ方法で処理できるのではないでしょうか。では、1 つのハイパーバイザーで 1 つの VM のみを実行する場合、なぜ libvirt を使用する必要があるのでしょうか。

おそらく私は完全に間違っていると思いますが、少なくとも、これは (bash) スクリプトを使用して qemu 仮想マシンをシャットダウンし、libvirt を使用せずに適切な方法でシャットダウンが完了したことを知る方法です。

答え2

libvirtd なしで VM をシャットダウンしようとして、これに遭遇しました。理由は、スワップ デバイスの障害により libvirtd が起動しないためです。VM をクリーンにシャットダウンしたかったのですが、libvirt を使用してディスクに保存できませんでした。上記の方法で、次のことを思いつきました。

/var/lib/libvirt/qemu 内

for sock in $(find | grep monitor); do printf "{ 'execute': 'qmp_capabilities' }\n{ 'execute': 'system_powerdown' }\n" | socat - UNIX-CONNECT:$sock; 完了

これは UBUNTU 用です。全体的には、通常は libvirt を使用しますが、これはシャットダウンするための他のコマンドへのインターフェイスであることはわかっていました。libvirt が実際に何をしているかを知っていたため、VM を正常にシャットダウンできました。

関連情報