Ein Gateway das Ihre Internetverbindungen hält, Ihre Mails buffert, Ihren Newsserver hostet und viele andere mehr oder weniger wichtige Dinge für Sie erledigt, sollte vor den Auswirkungen eines Stromausfalls geschützt werden.
Nun setze ich für mein Gateway (siehe auch Kapitel eingesetzte Hardware) einen stromsparenden PC/104 SBC (single board computer) ein, der inklusive Stromversorgung, Zyxel Modem und NT eine Stromaufnahme von ca. 10 Watt (gemessen auf der 220 V Seite) hat.
Ich habe daher nach einer sehr kleine und vorallem billigen USV gesucht, die wenn möglich auch von Linux unterstützt wird. Ein kurzes Einlesen in das Linux UPS-HOWTO fand ich schnell heraus, daß der Linux Support von USVs mehrfach gelöst wurde und sehr einfache Wege existieren die USV zu überwachen.
Also suchte ich nach einer möglichst schwachen USV (ich muß ja nur 10 Watt am Leben erhalten), die auch eine Schnittstelle zur Überwachung besitzt. Die Wahl viel dann auf die BESTPOWER PATRIOT 250. Dieses Teil kostete ca. 1.500,- ATS und lag mit seinen ca. 170 Watt Ausgangsleistung weit über meinen Bedürfnissen.
Die technischen Daten weisen darauf hin, daß bei Halblast (ca. 80 Watt) der Akku ca. 14 Minuten überbrücken kann. Das heißt, daß bei meinen 10 Watt die USV auch längere Gewitter im Sommer überbrücken sollte. Zu klären war nun nur noch wie man die USV von Linux aus überwachen kann. Das möchte ich hier dokumentieren.
Die Treiber für die PATRIOT USVs bekommt man bei www.bestpower.com : checkups.tar
Kopieren Sie das tarfile in ein Directory Ihrer Wahl und packen Sie es aus mit:
tar xvf checkups.tar
Starten Sie nun das Script:
./unixinst
und wählen Sie b für basic Installation und danach l für Linux. Nach wenigen
Sekunden ist checkups im Directory /etc/best/checkups
installiert.
Im File checkups.c habe ich die Zeile 174 geändert von
#define D(x)
in
#define D(x) usleep(10000);
damit bei jedem Debugoutput ein bischen gewartet wird. Es scheint mit
dem Timing des Programms ein kleines Problem zu geben. Es wird die
Steuerleitung eingeschaltet und aufgrund der pullup Widerstände dürfte
einige Zeit vergehen bis der Pegel eingelesen werden kann. Diese Zeit
lasse ich mit dem usleep bewußt vergehen. Schön ist das nicht - aber
es funktioniert :-((
Danach checkups mit make compilieren. Wenn Sie bei den ersten Gehversuchen Debug-Output von checkups sehen wollen, dann können Sie in Zeile 171 folgendes einfügen
#define DEBUG 1
das können Sie nachher dann auch wieder wie folgt abschalten:
//#define DEBUG 1
Das Startupscript /sbin/init.d/ups
für die Patriot Überwachung sieht
bei mir wie folgt aus:
#! /bin/sh
#
# Original template:
# Copyright (c) 1995-1998 SuSE GmbH Nuernberg, Germany.
#
# CheckUPS-Startup:
# Copyright (c) 2000 Heimo Schön - heimo.schoen@gmx.at
#
# Author: Heimo Schön
# Date : 5. Okt. 2000
#
# /sbin/init.d/ups
#
# and symbolic its link
#
# /sbin/rcups
#
. /etc/rc.config
# Determine the base and follow a runlevel link name.
base=${0##*/}
link=${base#*[SK][0-9][0-9]}
# Force execution if not called by a runlevel directory.
test $link = $base && START_FOO=yes
#test "$START_FOO" = yes || exit 0
# The echo return value for success (defined in /etc/rc.config).
return=$rc_done
case "$1" in
start)
echo -n "Starting service checkups"
## Start daemon with startproc(8). If this fails
## the echo return value is set appropriate.
killall -q checkups
# /etc/best/checkups/checkups -s1 -c20 -p5 -i5 -x1000 -o /dev/ttyS1 || return=$rc_failed
/etc/best/checkups/checkups -s1 -c20 -p5 -i5 -x1000 -o /dev/ttyS1
echo -e "$return"
;;
stop)
echo -n "Shutting down service checkups"
## Stop daemon with killproc(8) and if this fails
## set echo the echo return value.
killall -q checkups
echo -e "$return"
;;
restart)
## If first returns OK call the second, if first or
## second command fails, set echo return value.
##$0 stop && $0 start || return=$rc_failed
$0 start || return=$rc_failed
;;
reload)
## Choose ONE of the following two cases:
## First possibility: A few services accepts a signal
## to reread the (changed) configuration.
#echo -n "Reload service foo"
#killproc -HUP /usr/sbin/foo || return=$rc_failed
#echo -e "$return"
## Exclusive possibility: Some services must be stopped
## and started to force a new load of the configuration.
##$0 stop && $0 start || return=$rc_failed
$0 start || return=$rc_failed
;;
status)
echo -n "Checking for service checkups: *not implemented*"
## Check status with checkproc(8), if process is running
## checkproc will return with exit status 0.
#checkproc /usr/sbin/foo && echo OK || echo No process
;;
probe)
echo -n "Probeing for service checkups: *not implemented*"
## Optional: Probe for the necessity of a reload,
## give out the argument which is required for a reload.
#test /etc/foo.conf -nt /var/run/foo.pid && echo reload
;;
*)
echo "Usage: $0 {start|stop|status|restart|reload[|probe]}"
exit 1
;;
esac
# Inform the caller not only verbosely and set an exit status.
test "$return" = "$rc_done" || exit 1
exit 0
Damit checkups auch wirklich beim Boot gestartet wird, müssen Sie in
/sbin/init.d/rc/rc2.d
und /sbin/init.d/rc/rc3.d
noch folgende Links erzeugen:
ln -s ../ups S98ups
ln -s ../ups K98ups
Anmerkung: Vergessen Sie nicht das : chmod a+x ups
checkups wird mit folgenden Parametern gestartet:
/etc/best/checkups/checkups -s1 -c20 -p5 -i5 -x1000 -o /dev/ttyS1
-s1 .......... Startupdelay 1 Second
-c20 ......... shutdown der Maschine 20 Minuten nach Stromausfall
-p5 .......... polling (Abfrage der seriellen Schnittstelle) alle 5 Sekunden
-i5 .......... Warnung senden alle 5 Sekunden
-x1000 ....... bis zu 1000 Zeilen im Logfile aufzeichnen
-o ........... Abschalten der USV nachdem der Rechner gestoppt wurde
/dev/ttyS1 ... Device an dem Sie die USV angeschlossen haben (hier COM2 = /dev/ttyS1)
Folgende Files werden von checkups verwendet:
/etc/best/checkups/checkups ..... die Applikation selbst
/etc/best/checkups/upsdown ...... dieses Script wird gestartet um den shutdown auszuführen
/etc/best/checkups/upsmsg ....... dieses Script wird zur Ausgabe von Meldungen gestartet
/etc/best/checkups/ups_log.txt .. Logfile
Mit einer Auskreuzbox mit LEDs und einem Voltmeter bewaffnet habe ich begonnen heruaszufinden was checkups an der seriellen Schnittstelle "so treibt".
Dabei habe ich herausgefunden, daß manchmal Daten gesendet werden und manchmal Pegel "aufblitzen". Anhand dieser Informationen und der im Patriot Handbuch beschriebenen Belegung des 9 poligen Steckers auf der Rückseite der USV, ergab sich folgende Pinbelegung