Freitag, 9. Oktober 2009

vmware suspend

Jetzt bin ich schon wieder seit zwei Stunden am Rumbosseln.
Es geht darum, dass VMware Server 2 keine Möglichkeit eingebaut hat, beim Runterfahren die laufenden Clients in den Suspend-Zustand zu versetzen. Dadurch gibt es Lock-Files, die ein neues Starten der Clients verhindern.

Also rasch ein Script geklaut und wieder mal nachlesen müssen, wie man eigentlich ein Programm beim Shutdown starten lassen kann.
Ok, nach /etc/init.d kopieren und dann chkconfig -a vmsuspend laufen lassen.
Dann muss man noch nach rc5.d/ schauen (weiß man doch, oder?), ob dort die Datei K##vmsuspend mit einer kleineren Zahl als K##vmware vorhanden ist. Nicht gerade intuitiv, aber naja.

Da steht dann aber
lrwxrwxrwx 1 root root 9 8. Okt 15:17 K15vmware -> ../vmware
lrwxrwxrwx 1 root root 17 8. Okt 15:17 K16vmware-suspend -> ../vmware-suspend


Toll - das bedeutet: mein vmware-suspend Script wird aufgerufen, nachdem vmware beendet ist. So kann das natürlich nicht funktionieren, da mein Script ja noch vmware-Funktionen benutzen will.

Also wieder stundenlang nachgelesen, was LSB-Header sind und wie man damit die Reihenfolge steuern kann. Um es kurz zu machen: es klappt wieder mal nicht so, wie beschrieben. Es ist eine elende Rumprobiererei, weil das Konzept einfach von Fricklern ausgedacht wurde.

Warum ist das unter Windows eigentlich gar kein Thema?
Weil alle Dienste einfach die benötigten Dienste anfordern, so dass automatisch alle in der richtigen Reihenfolge geladen werden. So einfach kann es gehen.

Aber da ich nicht locker lasse ;-) habe ich es doch hinbekommen. Hier die Lösung:

#!/usr/bin/bash
# /etc/init.d/vmware-suspend
#
# chkconfig: 0356 19 07
# description: Stopping this service will suspend all running vmware guests
# (chkconfig vmware = 235 19 08)

### BEGIN INIT INFO
# Provides: vmsuspend
# Required-Start: $network VMware
# Should-Start:
# Required-Stop: VMware
# Should-Stop:
# Default-Start: 2 3 5
# Default-Stop: 0 6
# Short-Description: Suspends running vmware guests
# Description: Stopping this service will suspend all running vmware guests
### END INIT INFO

########################### syslog

SYSLOG=1
VERBOSE=0
LOGGER="/bin/logger"
FACILITY=`basename $0 | cut -d '.' -f1`

LOG() {
PRIORITY="`echo $* | cut -d ':' -f1`"
LOGMESSAGE="`echo $* | cut -d ':' -f2-`"
LOGMESSAGE="[$$]:$LOGMESSAGE"
if [ $VERBOSE ]; then
echo "`date '+%b %e %H:%M:%S'`: $LOGMESSAGE"
[ "$SYSLOG" = 1 ] && $LOGGER -t $FACILITY $LOGMESSAGE
else
[ "$SYSLOG" = 1 ] && $LOGGER -t $FACILITY $LOGMESSAGE
fi
}
########################### eof syslog

VMRUN_BIN=/usr/bin/vmrun

VM_TYPE=server
HOST="https://localhost:8333/sdk"

# vmx=$(echo ${VMX} | sed 's/ /\\ /g')
# vmx="${VMX// /\\ }"

# read username=.., password=..
. /root/.auth/vmware-auth


test -x $VMRUN_BIN || {
echo "$VMRUN_BIN not installed";
if [ "$1" = "stop" ]; then exit 0;
else exit 5; fi
}

. /etc/rc.status
rc_reset


case "$1" in
start)
echo -n "Starting vmsuspend (nothing to do) "
rc_status -v
;;

stop)
echo -n "vmsuspend: suspending vmware guests..."
# LOG LIST=$($VMRUN_BIN -T $VM_TYPE -h "$HOST" -u """$username""" -p """$password""" list 2>>/dev/null | grep "\.vmx")
for VMX in """$($VMRUN_BIN -T $VM_TYPE -h """$HOST""" -u """$username""" -p """$password""" list 2>>/dev/null | grep "\.vmx")"""
do
if [ -n "$VMX" ]
then
$VMRUN_BIN -T $VM_TYPE -h """$HOST""" -u """$username""" -p """$password""" suspend """$VMX"""
LOG "suspend $VMX (ExitCode=$?)"
fi
done
rc_status -v
;;

*)
echo "Usage: $0 {start|stop|}"
exit 1
;;

esac
rc_exit

Diese Datei (vmware-suspend) nach /etc/init.d schreiben und..
cd /etc/init.d
insserv -r
vmware-suspend
insserv -r vmware
insserv vmware
insserv
vmware-suspend
um die Aufruf-Reihenfolge festzulegen.

Das Script liest die Datei /root/.auth/vmware-auth ein. Diese sollte enthalten:
username=..
password=..

Nun werden beim Reboot/Shutdown des Host-Rechners alle laufenden VMs in den Suspend-Status gebracht.
Wenn man das unterlässt, bleiben evtl. .lck-Dateien übrig, die einen neuerlichen Start der VM verhindern.

Keine Kommentare:

Kommentar veröffentlichen