0

我在运行 Ubuntu 的机器上设置了一个 NMS 系统,它通过调用 Perl 脚本来响应各种 UPS 事件,以遍历我们所有的 VMWare 主机并暂停所有 VM。VMWare 很聪明,它提供了一组 Perl 模块,使这变得相对容易。但是,我们也有三台 Hyper-V 主机,我似乎无法找到一种方法来控制它们,而这些方法并非特定于某些 Microsoft 技术(例如 PowerShell 脚本)。

我希望有人可以建议一种从 linux 机器控制 Hyper-V 主机的方法。我宁愿它不涉及使用 Wine,但如果没有其他方法可行,我愿意走那条路。

4

2 回答 2

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.

于 2011-07-18T22:17:06.957 回答
0

Hyper-V can be managed remotely using the WMI interfaces. There is a WMI Client for Linux, which should allow you to make the relevant API calls to manage Hyper-V. I have not had to do this myself, but the specific WMI calls are available at Microsoft: https://msdn.microsoft.com/en-us/library/hh850319%28v=vs.85%29.aspx

于 2016-08-23T15:49:10.183 回答