Seite 1 von 1

VM POWER OP MODE und RDP Sessions

Verfasst: 17.10.2007, 16:56
von kiko67
Hallo an alle,
ich habe auf unserem Linux Server 9.2 den GSX Server am laufen. Da sind Windows XP VMs eingerichtet.
Diese VMs werden mit einem perl script (VMPerl) an einem bestimmten Tag und Uhrzeit gestoppt, die werden gesichert und dann mit einem script (VMPerl) wieder gestartet.

Ich habe den Modus VM_POWER_OP_MODE_TRYSOFT ausgewählt. Nur wenn jemand eine RDP Session getrennt hat, kann die VM nicht gestoppt werden. Aufs Desktop der XP VM erscheint dann die Meldung dass wenn ich diese Aktion durchführen möchte niemand in der Lage ist sich mit der Arbeitsstation zu verbinden.

VMPerl gibt erst eine Fehlermeldung aus wenn es dabei ist die VMs wieder nacheinander zu starten :Could not power on VM <pfad zu der VM> Error:0

Ich möchte nicht unbedingt die VM_POWER_OP_HARD nehmen.

Das script welches die VMs stoppt ist folgendes:

Code: Alles auswählen

#!/usr/bin/perl -w

use strict;
use warnings;
use VMware::VmPerl::VM;
use VMware::VmPerl::ConnectParams;
use VMware::VmPerl::Server;
use Mail::SendEasy;

my $back;
my $now_string;
my $Actual_path;
my $vmdir = "/vmware/";
my $logdir = "/var/log/vmware";
my $infofile = "/$logdir/backup.log";
my $liste = "$logdir/backuplist.txt";
my $connect_params = VMware::VmPerl::ConnectParams::new();
my $state_string_map = {};
my $state_string;
my $cur_state;
my $server;
my $constant_str;

my @state_strings = (
   "VM_EXECUTION_STATE_ON",
   "VM_EXECUTION_STATE_OFF",
   "VM_EXECUTION_STATE_SUSPENDED",
   "VM_EXECUTION_STATE_STUCK",
   "VM_EXECUTION_STATE_UNKNOWN"
    );
my @Files;
my @list;

#Funktionen
#####################################################################
#Senden einer Email bei Fehler
sub notification {
my $Inhalt = shift;
my $status = Mail::SendEasy::send(
        smtp => 'mailserver' ,
    from    => 'gsxserver@mydomain' ,
        from_title => 'VM Backup' ,
        to      => 'myemail@mydomain' ,
        subject => "VM Fehler" ,
        msg     => "$Inhalt\nBitte logfile /var/log/vmware/backup.log uerberpruefen!"  ,
) ;
if (!$status) { Mail::SendEasy::error ;}
}
# Retrieves a pre-defined constant value. Noetig fuer die Statusausgabe
sub vm_constant {
        $constant_str = shift;
        return VMware::VmPerl::constant($constant_str, 0);
}
####################################################################

#Logfile vorbereiten
$now_string = localtime;

#open files
open(VMFILE, ">> $liste"); #Liste der VMs die laufen
open(BACKUP, ">> $infofile");
printf BACKUP "########################################";
printf BACKUP "\n$now_string\nvmstop.pl wird ausgefuert\n\n";
#Konstante vorbereiten
foreach $state_string (@state_strings) {
   $state_string_map->{vm_constant($state_string)} = $state_string;
                                                                                }

#Verbindung mit dem Server mit Fehlerausgabe
close(STDERR);
open(STDERR, ">>$infofile") or die $!;
$server = VMware::VmPerl::Server::new();
if (!$server->connect($connect_params)) {
        my ($error_number, $error_string) = $server->get_last_error();
        notification("Could not connect to server: Error $error_number: $error_string\n");
        die "Could not connect to server: Error $error_number: $error_string\n";
}

#Registrierte VMs
print BACKUP "\nFolgende VMs sind registriert\n";

@list = $server->registered_vm_names();
if (!defined($list[0])) {
        my ($error_number, $error_string) = $server->get_last_error();
        notification("Could not get list of VMs from server: Error $error_number: ");
        die "Could not get list of VMs from server: Error $error_number: ".
                "$error_string\n";
}

print BACKUP "$_\n" foreach (@list);

#Schleife fuer alle VMs
foreach $Actual_path (@list) {
        chomp($Actual_path);
        #VMs - Verbinden mit Fehlerausgabe
        print BACKUP "\nVerbunden mit $Actual_path.\n";
        my $vm = VMware::VmPerl::VM::new();
        if (!$vm->connect($connect_params, $Actual_path)) {
        my ($error_number, $error_string) = $vm->get_last_error();
        notification("Could not connect to vm: Error $error_number: $error_string\n");
        die "Could not connect to vm: Error $error_number: $error_string\n";
                                                                                                        }               
        #VMs - Status zurueckgeben
        $cur_state = $vm->get_execution_state();
        print BACKUP "The execution state of $Actual_path is: $state_string_map->{$cur_state}\n";
        #VM stopen
        if ($cur_state == 1) {
                printf VMFILE "$Actual_path\n";
                $vm->stop(vm_constant("VM_POWEROP_MODE_TRYSOFT"));
                print BACKUP "$Actual_path gestoppt\n\n";
        undef $vm;
        }
}
printf BACKUP "\n$now_string\nvmstop.pl ENDE\n";

#close files
close(VMFILE);
close(BACKUP);
close(STDERR);


Kann mir jemand helfen damit die XP VMs gestoppt werden können?

Danke im Voraus
kiko67

Verfasst: 17.10.2007, 17:00
von continuum
Ich habe keine Ahnung von dem perl-zeug 8)

Ich wuerde aber versuchen - die batchs die in der VM laufen zu erweitern.
Vielleicht kannst du da einen shutdown forcieren - mit shutdown.exe vielleicht ... ?

Verfasst: 17.10.2007, 19:18
von al!ve
Was auf dem Linux-Host nicht ganz so einfach ist.

Den Zusammenhang zwischen RDP und dem Trysoft-Modus muss mir aber mal erklären. Ich dachte bisher, dass hierbei die Windows-Fernsteherung verwendet wird, für die der Windows-RPC-Dienst notwendig ist -- und über den läuft meines Wissens nach auch shutdown.exe übers Netz. Nachdem jedoch explizit von getrennten RDP-Sessions die Rede war, scheint der Trysoft-Modus hier Dinge zu versuchen, die mir bis momentan unbekannt sind. Evtl. hilft die Klärung dieser Frage bei der Lösung des Problems.

Verfasst: 18.10.2007, 10:40
von kiko67
Hi al!ve,
wenn man der Dokumentation glauben schenkt, müsste der TRYSOFT Modus, es am Anfang auf der "sanften" Art und Weise versuchen die VM zu stoppen und wenn das nicht klappt, dann verwendet er den HARD Modus. Unter HARD steht ja

Stop, reset or suspend — Immediately and unconditionally powers off,
resets, or suspends the virtual machine.


Das heißt für mich stoppen ohne wenn und aber. Die Dokumentation mit der ich mich befasst habe ist die "VMware Scripting API User’s Manual".
Deswegen mein Posting hier, da man als Anwender nicht so tief in der Software hineinblicken kann was da abläuft. Würdest du mir auch andere Dokumentation empfehlen? Könnte ein Sniffer in diesem Fall helfen?

Gruß
kiko67