linux - 如何从 Linux 计算机挂起 Hyper-V VM?

标签 linux perl virtual-machine hyper-v

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

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

最佳答案

我发现了一种丑陋的方法来做到这一点,但至少它不需要在虚拟机主机上安装或配置任何东西。

首先我得到了一个名为 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 主机的管理员帐户登录信息。它还要求您使用 IPC::Run

关于linux - 如何从 Linux 计算机挂起 Hyper-V VM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6666441/

相关文章:

mysql - Vagrant SSH - 设置并连接到 MySQL

python-2.7 - 需要 python 接口(interface)将机器移动到另一个文件夹

linux - 在 CentOS 上编译 Cilkplus-GCC

c++ - 是否有任何库或工具可以计算 Linux 下 C/C++ 中不同进程的 cpu 使用率和其他一些参数?

Perl 使用变量来引用模块会弄乱传递参数

string - 如何将两个字符串转换为 perl 中的散列?

perl - switch 语句和 if 语句之间的差异

linux - Globus Toolkit 虚拟机

linux - 如何从Linux系统中删除echo命令?

node.js - 我运行了一个 npm run build,将它放在 nodejs express.static 上,pm2 启动应用程序但无法获取 '/'