VMware ESX bei Stromausfall herunterfahren
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.