VMware ESX bei Stromausfall herunterfahren

Aus Laub-Home Wiki

Wer kennt das nicht, die USV hält ca 10-15 Minuten bei einem Stromausfall durch, was normalerweise auch reicht, aber was wenn der Stromausfall mal länger dauert??? Deshalb sollte der ESX samt Gast VMs heruntergefahren werden und natürlich auch wieder nach dem der Strom wieder da ist hochfahren.

Voraussetzungen

  • ESX / ESXi 4.1 (kann USB Geräte durch reichen)
  • ESXi Lizenz die es erlaubt den Server von Extern herunterzufahren (kostenlose Lizenz geht nicht!)
  • USV (APCUPSD kompatibel, via USB Kabel mit dem ESX verbunden)
  • Linux VM (hier Debian Linux)
  • VMWare VI Perltoolkit
  • ghettoShutdown.pl Link

BIOS richtig konfigurieren

Im BIOS sollte der USB Controller aktiviert werden und bei den Power Optionen muss eingestellt werden, das der Server automatisch angeht, wenn der Strom zurück ist. Hier darf nicht LAST STATE gewählt werden, da wir den Server sauber herunterfahren.

Power On Power Failure = On

Konfiguration des ESX Servers

  • Unter ESX Host --> Configuration --> Virtual Machine Startup/Shutdown
  • VMs automatisch hochfahren
  • VMs automatisch herunterfahren... nicht einfach ausschalten (Guest Shutdown)
  • Zeit für das Herunterfahren auf 5s stellen um nicht unnötig Zeit beim herunterfahren des ESX zu verlieren.
  • Alle Einstellungen siehe Screenshot:

Fazit:

Mit diesen Einstellungen sollte der ESX Server nun alle VMs (zumindest alle in denen die VMWare Tools installiert sind) sauber herunterfahren und sich dann erst ausschalten bzw. rebooten. Beim Start des Servers fährt er im Abstand von 30s oder bis sich die VMWare Tools melden eine Maschine nach der anderen hoch.

Konfiguration der Linux VM

Installation APCUPSD

Die Installation unter Debian erweist sich als sehr einfach:

aptitude install apcupsd

Konfiguration APCUPSD

Zuerst muss der APC Dienst zum starten bereit gemacht werden:
/etc/default/apcupsd

# Defaults for apcupsd initscript

# Apcupsd-devel internal configuration
APCACCESS=/sbin/apcaccess
ISCONFIGURED=yes

nun in der /etc/apcupsd/apcupsd.conf folgendes ändern:

# USV Konfiguration
UPSCABLE usb
UPSTYPE usb
DEVICE

# Herunterfahren auslösen
BATTERYLEVEL 25
MINUTES 4

# Zeit nachdem herunterfahren, bis die USV ausgeschaltet wird
KILLDELAY 260

# Anschlaten der USV wenn xx Prozent Ladung vorhanden sind
# dadurch wird der Server wieder angeschaltet
RETURNCHARGE 40

WAKEUP 0

nun kann das ganze gestartet und getestet werden:

/etc/init.d/apcupsd start
apcaccess

folgende Ausgabe sollte dann erscheinen:

APC      : 001,038,0942
DATE     : Mon Aug 02 15:14:14 CEST 2010
HOSTNAME : laub-monitor
RELEASE  : 3.14.4
VERSION  : 3.14.4 (18 May 2008) debian
UPSNAME  : laub-monitor
CABLE    : USB Cable
MODEL    : Back-UPS RS 550GI
UPSMODE  : Stand Alone
STARTTIME: Mon Aug 02 15:14:00 CEST 2010
STATUS   : ONLINE
LINEV    : 225.0 Volts
LOADPCT  :  35.0 Percent Load Capacity
BCHARGE  : 100.0 Percent
TIMELEFT :  14.2 Minutes
MBATTCHG : 5 Percent
MINTIMEL : 3 Minutes
MAXTIME  : 0 Seconds
SENSE    : Medium
LOTRANS  : 176.0 Volts
HITRANS  : 282.0 Volts
ALARMDEL : Always
BATTV    : 13.6 Volts
LASTXFER : Low line voltage
NUMXFERS : 0
TONBATT  : 0 seconds
CUMONBATT: 0 seconds
XOFFBATT : N/A
SELFTEST : NO
STATFLAG : 0x07000008 Status Flag
MANDATE  : 2010-02-26
SERIALNO : 3B1009X54057
BATTDATE : 2001-09-25
NOMINV   : 100 Volts
NOMBATTV :  12.0 Volts
NOMPOWER : 330 Watts
FIRMWARE : 857.L1 .I USB FW:L1
APCMODEL : Back-UPS RS 550GI
END APC  : Mon Aug 02 15:14:18 CEST 2010

ESX Server und seine VMs herunterfahren/supenden

Zuerst wird ein Skript benötigt welches, mittels VMWare Perltoolkit, die VMs supenden oder herunterfahren kann und dann via ghettoShutdown.pl den ESX Server auschaltet.
VMware Perltoolkit Installation ist hier dokumentiert:

Das GhettoShutdownSkript gibts hier:

Dieses bitte auch unter /etc/apcupsd/ ablegen. /etc/apcupsd/shutdown-esx.sh

#!/bin/bash
# ESX Shutdown Skript
# by A. Laub andreas[-at-]laub-home.de

# Login credentials
ESXSERVERIP="192.168.1.250"
USERNAME="user"
PASSWORD="password"

# These VMs will be supsended
SUSPENDVM="VM1 VM2"

# These VMs will be shutdown
SHUTDOWNVM="VM4 VM5 VM6"

# Name of the virtual machine where the apcupsd is running (It should be this machine)
UPSVM="APC-VMNAME"

###################Don't edit######################################################################################
# First we suspend some VMs
if [ -z "$SUSPENDVM" ] ; then
        echo "No Virtual Machine to suspend"
else
        for i in $SUSPENDVM ; do
                /usr/lib/vmware-viperl/apps/vm/vmcontrol.pl --server $ESXSERVERIP --username $USERNAME --password $PASSWORD --vmname $i --operation suspend
        done
fi

# Now we shutdown some VMs
if [ -z "$SHUTDOWNVM" ] ; then
        echo "No Virtual Machine to shutdown"
else
        for i in $SHUTDOWNVM ; do
                /usr/lib/vmware-viperl/apps/vm/vmcontrol.pl --server $ESXSERVERIP --username $USERNAME --password $PASSWORD --vmname $i --operation shutdown
        done
fi

# USV shutdown
/etc/init.d/ups-monitor poweroff

# And last we shutdown the ESX Host
/etc/apcupsd/ghettoShutdown.pl --server $ESXSERVERIP --username $USERNAME  --password $PASSWORD --ups_vm $UPSVM --sleep 2

Nun tragen wir diese Skript als apcupsd shutdown Operation ein:
Hierzu einfach den shutdown Befehl auskommentieren und das shutdown-esx.sh Skript einfügen.
/etc/apcupsd/apccontrol

    doshutdown)
        echo "UPS ${2} initiated Shutdown Sequence" | ${WALL}
        echo "apcshutdown `date`" >> /tmp/apcshutdown.log
        /etc/apcupsd/shutdown-esx.sh
        ${SHUTDOWN} -h now "apcupsd UPS ${2} initiated shutdown"
    ;;

Fertig!!! Nun sollte, wenn die USV Alarmschlägt und eigentlich einfach nur den eigenen Host herunterfahren will, das Skript ausgeführt werden und somit der gesamte ESX Server heruntergefahren werden.

Fazit

Mit diesen Einstellungen und Skripten, fährt der ESX Server, im Falle eines Stromausfalles, sauber herunter, geht bei ausreichende Ladung wieder an und fährt alle VMs hoch.

Ablauf: Als erstes greift die Einstellung der apcupsd.conf. Apcupsd löst den shutdown nach eingestellter Zeit (BATTERYLEVEL 25, MINUTES 4) aus. Das Skript apccontrol wird dadurch mit dem doshutdown Befehl angestoßen und führt, durch unsere Änderung, das shutdown-esx.sh Skript aus bevor der Rechner heruntergefahren wird. Durch das shutdown-esx.sh werden Maschinen suspended oder heruntergefahren (wer dies nicht möchte, braucht hier keine VMs eintragen). Danach wird der killpower Befehl an die USV geschickt. Dieser sorgt dafür, dass die USV nach dem herunterfahren des Servers ausgeschaltet wird (KILLDELAY in der apcupsd.conf). Zu guter Letzt startet das shutdown-esx.sh Skript das ghettoShutdown.pl Skript, welches den ESX Server und die Apcupsd VM, also der Host auf dem die USV Überwachung läuft, herunter.
Wenn der Strom nun wieder da ist und die USV einen bestimmten Ladezustand erreicht hat (RETURNCHARGE 40), schaltet Sie die Stromzufuhr wieder an und der ESX Server fährt durch die BIOS Einstellung Power On Power Failure = On hoch. Ist der ESX gebootet startet er nach einander die VMs.

Quellen