2011-07-12 7 views
0

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

私は誰かがLinuxボックスからHyper-Vホストを制御する方法を提案できると考えています。ワインを使うのではなく、むしろそれ以外のことがなければそのルートに行きたいと思っています。

+1

開発にlibvirt用のHyper-Vドライバがあったと思います。プロジェクトが終了したかどうかはわかりませんが、一見価値があるかもしれません。 –

答えて

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が必要です。

0

Hyper-Vは、WMIインターフェイスを使用してリモート管理できます。 Linux用のWMIクライアントがあり、Hyper-Vを管理するために関連するAPI呼び出しを行うことができます。私はこれを自分で行う必要はありませんでしたが、特定のWMI呼び出しはマイクロソフトで入手できます。https://msdn.microsoft.com/en-us/library/hh850319%28v=vs.85%29.aspx

関連する問題