Bents Blog

 

Ein IT Blog mit Themen aus dem Windows Server Umfeld.

USV-Verbindung an einem Windows Server 2008 R2 Server überwachen

Um einen Ausfall-sicheren Betrieb eines Servers gewährleisten zu können, benötigt man – abhängig von den Anforderungen – eine unterbrechungsfreie Stromversorgung (USV oder auch UPS). Dabei existieren verschiedene Arten unterschiedlichster Hersteller, die entweder über ein serielles Kabel (aktuell USB), oder über das Netzwerk mit dem zu schützenden System zu kommunizieren. Dazu kommt noch eine Agenten-Software auf dem Server selbst, welche bestimmte Reaktionen bei den möglichen Zuständen definiert und auslöst. Doch es geht auch einfacher.

Für ein aktuelles Kundenprojekt sollte ein einzelner Server über eine eigene (kleinere) USV von Hewlett Packard geschützt werden. Der Server (Windows Server 2008 R2) selbst dient als iSCSI Storage-Server und wird mit der Storagevirtualisierungslösung SANsymphony-Vvon DataCore betrieben.

Native USV-Unterstützung unter Windows Server 2008 R2

Die Software SANsymphony erfordert den Einsatz einer USV, da der Hauptspeicher des Servers (in unserem Fall 18 GByte!) als Cache verwendet wird – bei einem Stromausfall wäre der Inhalt ohne eine USV somit verloren. Die Software überwacht dabei den Zustand der USV (Netz- oder Batteriebetrieb) und ändert dementsprechend den verwendeten Cache-Mechanismus von Write Back in Write Through. Dafür muss die USV aber nativ über das Betriebssystem verwaltet werden – ohne Agenten- bzw. Treiber-Software des Herstellers.

Seit Windows Server 2008 werden keine seriellen Verbindungen mehr unterstützt. Die folgende Beschreibung gilt deshalb nur für via USB angeschlossene Geräte.

Unter Windows Server 2008 R2 erkennt man die native Unterstützung an dem Power-Symbol in der Taskleiste:

Dabei lässt sich im Menü der erweiterten Einstellungen für die Energieoptionen relativ granular einstellen, welche Serverkomponente sich bei einer Betriebsänderung (Netz- oder Batteriebetrieb) wie verhalten soll. Im folgenden Bild ist die Aktion für den kritischen Batterie-Zustand zu sehen:

Wie zu erkennen, ist auch der Schwellwert der verbleibenden Batterie-Kapazität frei definierbar, bei der der Server herunterfahren soll.

Problem

Für den Einsatzzweck des Servers als Storage (welches von VMware als DataStore genutzt wird), steht ein ausfallsicherer Betrieb des Systems natürlich im Vordergrund. Und damit kommen wir zu einer Situation, die weder vom Betriebssystem noch von der Storagevirtualisierungslösung ausgewertet bzw. behandelt wird: die Verbindungsunterbrechung zwischen Server und USV. Leider schreibt Windows Server 2008 R2 weder die Zustandsänderung der USV, noch andere damit verbundene Ereignisse in ein Protokoll – meiner Meinung nach ein echter Mangel!

Lösung

Da ich den oben beschriebenen Fall natürlich abfangen will und muss, habe ich kurzerhand ein kleines VBS-Skript ups.vbs geschrieben, dass den Verbindungszustand überwacht. Selbiges wurde auf dem Server gespeichert, im Aufgabenplaner (Task Scheduler) innerhalb einer neue Aufgabe als Aktion hinterlegt und wird minütlich ausgeführt. Das Skript selbst ist relativ kompakt:

'* VBS Script für USV Kabel-Verbindungsverlust
'* Script für Windows Server 2008 R2
'* (c) 2011 Bent Schrader
'* Version 1.0

Dim WSHShell
Dim USV
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set WSHShell = WScript.CreateObject("WScript.Shell")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Battery",,48) 

USV = 0

Function WarningMessage(strMessage)
	strCommand = "eventcreate /t Warning /id 101 /l System /so UPS-Check /d " & Chr(34) & strMessage & Chr(34)
	WSHShell.Run strcommand,0,TRUE
End Function

Function ErrorMessage(strMessage)
	strCommand = "eventcreate /t Error /id 111 /l System /so UPS-Check /d " & Chr(34) & strMessage & Chr(34)
	WSHShell.Run strcommand,0,TRUE
	WScript.Quit(1)
End Function

For Each objItem in colItems
	If len(objItem.Name) > 0 Then
		USV = 1
		If (objItem.BatteryStatus = 1) Then
			WarningMessage("USV [" & objItem.Name & "] mit Status [" & objItem.Status & "] befindet sich im Batteriebetrieb." & vbCrLf &  "Füllstand: " &  objItem.EstimatedChargeRemaining & "%")
		End If
	End If
Next

If USV = 0 Then
	ErrorMessage("Keine USV gefunden.")
End If

Der Status der USV wird dabei aus der WMI-Klasse Win32_Battery ausgelesen – damit werden tatsächlich auch nur USV-Statusänderungen überwacht, ohne das andere USB-Geräte das Skript beeinflussen könnten.

Im Normalbetrieb beendet sich das Skript ohne einen Protokolleintrag. Bei einem Stromausfall (Batteriebetrieb) schreibt das Skript durch Nutzung des internen Tools eventcreate einen Eintrag vom Typ Warnung in das Systemereignisprotokoll (Event ID 101):

USV [Name] mit Status [State] befindet sich im Batteriebetrieb. Füllstand: x %

Dadurch wird im Ereignisprotokoll (auch nachträglich) ersichtlich, wie schnell die Batterie entladen und wann bzw. bei welchem Füllstand der Server (automatisiert durch das Betriebssystem) heruntergefahren wurde.

Im folgenden Bild ist ein Beispiel für den Batteriebetrieb (2 Warnungen) und das anschließende Entfernen des USB-Kabels (1 Fehler) erkennbar:

Wird das USB-Kabel gezogen oder existiert ein Problem der internen USV-Steuerung so meldet das Skript einen Fehler im Systemereignisprotokoll (Event ID 111):

Keine USV gefunden.

Auf diese Meldung kann wiederum geschickt mit dem Aufgabenplaner reagiert werden – tritt das Event mit der ID 111 (die ID ist natürlich beliebig definierbar) und der Quelle UPS-Check auf, so wird in meinem Beispiel ein PowerShell-Befehl ausgeführt, der den Cache der SANsymphony-V Storagevirtualisierungssoftware ausschaltet bzw. auf Write Through setzt. Außerdem wird die IT-Administration per E-Mail über diesen kritischen Zustand informiert.

Fazit

Mir ist völlig bewusst, dass der hier dargestellte Fall ein sehr spezielles Problem behandelt und kaum für die Allgemeinheit gilt. Allerdings gibt es durchaus Konzepte und Szenarien, in denen ein Server auf Grund der Platzierung in eigenen Brandabschnitten nicht an zentralen sondern an eigenen, kleineren unterbrechungsfreien Stromversorgungen angeschlossen werden müssen. Soll außerdem auf den Einsatz der mitgelieferten Software (Treiber und Agenten) verzichtet werden, so bleibt die Unterbrechung der Kommunikationsverbindung zur USV momentan eine selbst zu lösende Aufgabe. Mit dem obigen Skript ist diese Umsetzung schnell – und ohne zusätzliche Software – realisierbar. Wie bei allen meinen Beiträgen gilt: Bei Tipps, Vorschlägen sowie Fragen oder Kritiken hinterlasst bitte einen Kommentar.

Einen Blog am Leben zu erhalten kostet Zeit und Geld. Da ich auf meiner Seite weder Werbung einbinde, noch andersweitige Zuwendungen erhalte, freue ich mich über jede kleine Spende. Einfach und unkompliziert geht das über PayPalMe. Du unterstützt damit diesen Blog. Vielen Dank.

3 Kommentare für “USV-Verbindung an einem Windows Server 2008 R2 Server überwachen”

  • kevinq

    Interesante Idee. Wie sieht es mit der Kompatieblität des Scriptes aus? Ich habe einen Home Server mit Server 2008 R2 und einer USV von APC die via USB verbunden ist. Würde das Script so funktionieren oder muss ich da noch was anpassen?

  • Christoph

    Hallo

    Sehr nettes Script. Danke dafür.

    Trotzdem habe ich eine Frage dazu. Ich hätte gerne das bei einem Batteriestand von z.B 60% der Server heruntergefahren wird.

    Leider bekomme ich das nicht hin. Ich erstelle einen neue Aufgabe –>Neuer Trigger–> Benutzderfiniert –>Neuer Ereignisfilter.

    Da wähle ich als Quelle UPS-Check. Nur wie bekomme ich es hin das erst bei z.B60% das Script ausgeführt wird?

    Würde mich über eine Antwort freuen

    Gruß Christoph

  • Martin

    Danke für das Script! Damit traue ich mich endlich die (in meinen Augen) leidige Software von APC von den 2012 Servern zu verbannen. =)

    Jetzt brauch ich nur noch ein Script, welches mich Informiert das wieder „Feststrom“ vorhanden ist.

    Gruß
    Martin

Einen Kommentar hinterlassen:

Antispam Bee hat Bent's Blog vor 410.433 Spam-Kommentaren bewahrt.