2011-07-12 32 views
0

我在運行Ubuntu的機器上建立了一個NMS系統,它通過調用一個Perl腳本來遍歷我們所有的VMWare主機並掛起所有的VM來響應各種UPS事件。 VMWare非常聰明,並提供了一套Perl模塊,使它變得相對容易。但是,我們也有三臺Hyper-V主機,而且似乎找不到某種Microsoft技術特有的控制方法(例如PowerShell腳本)。如何從Linux機器暫停Hyper-V虛擬機?

我希望有人可以建議一種方法來控制從Linux機箱的Hyper-V主機。我寧願它不涉及使用葡萄酒,但我願意走這條路,如果沒有其他的東西可以工作。

+1

我認爲在開發中有一個針對libvirt的Hyper-V驅動程序。不知道該項目是否完成,但它可能值得一看。 –

回答

0

我發現了一個難看的方法來完成它,但至少它不需要在VM主機上安裝或配置任何東西。

首先,我得到了一個名爲winexe的實用程序,它可以讓您打開與Windows機器的終端連接。

然後我寫了一個很長的醜的Perl腳本管一些PowerShell代碼到本機暫停所有正在運行的機器:

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 
} 

您可能必須惹這一點得到它的工作。我不得不破解一些特定於實現的東西,但是我留下了部分輸出捕獲代碼。這需要全局變量$ win_user和$ win_pass包含目標VM主機的管理員帳戶登錄信息。它也需要你use IPC::Run