0

Ubuntuを実行しているマシンにNMSシステムをセットアップしました。これは、Perlスクリプトを呼び出してすべてのVMWareホストを調べ、すべてのVMを一時停止することでさまざまなUPSイベントに応答します。VMWareはスマートで、これを比較的簡単にする一連のPerlモジュールを提供しました。ただし、Hyper-Vホストも3つありますが、一部のMicrosoftテクノロジ(PowerShellスクリプトなど)に固有ではない、それらを制御する方法が見つからないようです。

誰かがLinuxボックスからHyper-Vホストを制御する方法を提案してくれることを期待しています。Wineを使わないほうがいいのですが、他にうまくいくものがなければ、そのルートを進んで行きます。

4

2 に答える 2

0

見苦しい方法を見つけましたが、少なくとも VM ホストに何もインストールまたは構成する必要はありません。

最初にwinexeというユーティリティを入手しました。このユーティリティを使用すると、Windows マシンへのターミナル接続を開くことができます。

次に、いくつかの PowerShell コードをマシンにパイプして実行中のマシンを一時停止する、長く醜い Perl スクリプトを作成しました。

sub hv_suspend_host {
    my $host = $_[0];
    my $code = <<'END';
        echo '===BEGIN'
        $query = "SELECT * FROM Msvm_ComputerSystem WHERE EnabledState != 3 AND EnabledState != 32769" #Exclude off and saved VMs
        $VMs = get-wmiobject -query $query -namespace "root\virtualization" -computername "."
        foreach ($VM in $VMs) {
            if ($VM.name -ne $VM.ElementName) { # Exclude the host itself
                if ($VM.RequestStateChange(32769).ReturnValue -eq 4096) { # Put the VM in a saved state
                    # It worked, log success
                } else {
                    # It didn't, log failure
                }
            }
        }
        echo '===END'

        exit

END
    my $recv;
    run(["winexe", '-U', "DOMAIN/$win_user%$win_pass", '--interactive=0', "//$host", 'powershell -command -'], \$code, \$recv);
    $recv =~ tr/\r//d;      # Convert to UNIX line endings
    $recv =~ /===BEGIN\n(.+)===END/s;   # Now recv contains anything you logged
}

これを機能させるには、これを少しいじる必要があるかもしれません。実装固有のものをいくつかハックする必要がありましたが、出力キャプチャ コードの一部を残しました。これには、ターゲット VM ホストの管理者アカウント ログイン情報を含む $win_user および $win_pass という名前のグローバル変数が必要です。また、use IPC::Run.

于 2011-07-18T22:17:06.957 に答える