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
