Как я могу приостановить виртуальную машину Hyper-V с машины Linux? - PullRequest
0 голосов
/ 12 июля 2011

Я установил систему NMS на машине с Ubuntu, которая реагирует на различные события UPS, вызывая скрипт Perl, чтобы пройти через все наши хосты VMWare и приостановить все виртуальные машины. VMWare была умна и предоставила набор модулей Perl, которые сделали это относительно легко. Однако у нас также есть три хоста Hyper-V, и я не могу найти способ управлять ими, который не специфичен для какой-либо технологии Microsoft (например, сценария PowerShell).

Я надеюсь, что кто-нибудь мог бы предложить способ управления хостами Hyper-V из коробки linux. Я бы предпочел, чтобы это не было связано с использованием Wine, но я готов пойти по этому пути, если больше ничего не будет работать.

Ответы [ 2 ]

0 голосов
/ 23 августа 2016

Hyper-V может управляться удаленно с помощью интерфейсов WMI. Существует клиент WMI для Linux, который должен позволять вам делать соответствующие вызовы API для управления Hyper-V. Я не должен был делать это сам, но конкретные вызовы WMI доступны в Microsoft: https://msdn.microsoft.com/en-us/library/hh850319%28v=vs.85%29.aspx

0 голосов
/ 19 июля 2011

Я нашел уродливый способ сделать это, но по крайней мере для этого не требуется ничего устанавливать или настраивать на хосте 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, содержащие информацию для входа учетной записи администратора для целевого хоста виртуальной машины. Это также требует, чтобы вы use IPC::Run.

...