Server-Notstrom

Posted on Do 03 Juni 2021 in Computer & Electronics

Wenn Ihr meinen Blog schon länger lest, habt Ihr sicher mitgekriegt, dass ich einen kleinen Heimserver habe, der mir v.a. als Fileserver/NAS und Backup-System für die Laptops dient. Daneben habe ich meinen Home-Assistant darauf laufen und denke gerade darüber nach, auch noch ein Dokumenten-Management-System hinzuzufügen.

Insofern ist normalerweise nicht viel Last auf der Maschine, aber sie ist für mich schon recht wichtig. Und so habe ich beschlossen, dem Serverchen mal eine Unterbrechungsfreie Stromversorgung zu spendieren, damit es im Falle eines Stromausfalls eine Chance hat, sauber herunter zu fahren. Und so habe ich mich ein wenig umgesehen und mich letztlich für dieses Exemplar entschieden (Bild von der Seite des Herstellers):

Das ist eine Eaton Ellipse Pro 850. Die kostet nicht die Welt und sollte mehr als genug Kapazität haben, um meinen kleinen Server ca. 20-30 Minuten zu Versorgen, bevor er dann doch ein Shutdown fällig wird. Eine Nummer kleiner (650) hätte es sicher auch getan, aber der Preisunterschied war so gering, dass ich mir dachte, ein wenig überdimensioniert schadet auch nicht – so bleibt der Akku länger brauchbar, auch wenn er irgendwann langsam an Wums verliert.

Außer dem Server habe ich nichts dran hängen – Fritzbox, Switch etc. brauchen keinen Notstrom.

Das Maschinchen ist erfreulich klein und so passt es im Netzwerkschrank problemlos neben den Server.

Eaton kannte ich bisher noch nicht, aber das Gerät hatte online gute Rezensionen und ich muss sagen, es fühlt sich gut verarbeitet an und der Formfaktor ist perfekt für meine Zwecke. Und wie Ihr gleich sehen werdet, wird das Ding perfekt von LINUX unterstützt.

Software

Solang der Strom nur ein paar Minuten ausfällt ist die Welt in Ordnung: die UPS läuft dann im Akku-Betrieb und der Server bekommt garnichts mit, außer, dass das Netzwerk nicht mehr geht. Und genau da liegt der Hase im Pfeffer: Der Server kriegt garnichts mit! Und wenn der Stromausfall länger dauert, ist das ein echtes Problem, denn dann soll der Server ja herunterfahren, bevor der Batterie die Elektronen ausgehen.

Und deswegen brauchen wir eine Software auf dem Server, die mit der UPS reden kann und mitbekommt, wenn der Akku zur Neige geht und es an der Zeit ist, die Sitze hoch zu klappen und das Licht auszuschalten. Oder so ähnlich.

Für diesen Zweck hat eine UPS eine Schnittstelle, über die man mit ihr reden kann. Früher typischerweise RS232, heute eher USB. Für Windows gibt's eigentlich immer eine Software vom Hersteller, unter LINUX sieht die Sache oft anders aus: da sehen wir uns nach open-source Lösungen um. Erfreulicherweise sind aber viele Hersteller daran interessiert, dass ihre Geräte mit LINUX funktionieren und unterstützen entsprechende Projekte durch Specs, Code oder Hardware.

Also erstmal das USB-Kabel rein in die UPS und das andere Ende in den Server. Und schon können wir nachsehen, ob und was erkannt wird:

$ lsusb
[...]
Bus 003 Device 002: ID 0463:ffff MGE UPS Systems UPS

Aha – das sieht doch garnicht schlecht aus – immerhin weiß LINUX, was wir da vor uns haben. Bleibt die Frage, was für Software wir brauchen. Aber die Frage ist schnell beantwortet. Eine kurze Recherche ergab, dass es da das Network UPS Tools project (kurz NUT) gibt. Debian und andere gängige Distributionen haben das eh im Lieferumfang und so ist es schnell installiert:

apt install nut

Das System beschert uns Treiber, einen Server-Prozess (usbd), der permanent über den Zustand der UPS informiert ist, sowie diverse Tools, um mit dem System zu interagieren. Verwirrenderweise fangen diese Befehle keineswegs mit nut an, sondern mit ups. Aber das seht ihr gleich.

Konfiguration

Damit das alles funktioniert müssen wir nun ein bisschen Konfigurations-Arbeit leisten. Alle config Files finden sich in /etc/nut/. Als erstes erklären wir dem System mal, was für ein Gerät wir haben, damit der richtige Treiber verwendet wird – und dazu fügen wir dies in ups.conf ein:

[Eaton]
    driver = usbhid-ups
    port = auto
    vendorid = 0463
    pollfreq = 30

Außerdem sollten wir mal einen Blick in nut.conf werfen – dort sollte dies stehen:

MODE=standalone

Denn wir haben ja nur einen Server mit einer UPS – NUT kann nämlich auch viel komplexere Installationen managen, bei der mehrere Rechner von einer UPS, oder mehreren versorgt werden und ein Computer mit der UPS redet und im Falle eines Stromausfalls seine Kollegen warnt, so dass auch diese Clients bescheid wissen. Aber das brauchen wir heute nicht, also standalone.

Nun ist es an der Zeit, den Daemon zu starten:

$ upsdrvctl start

Network UPS Tools - UPS driver controller 2.7.4
Network UPS Tools - Generic HID driver 0.41 (2.7.4)
USB communication driver 0.33
Using subdriver: MGE HID 1.39

Als nächstes prüfen wir mal, ob unsere UPS nun erkannt wurde und ansprechbar ist:

$ upsc -l 
Eaton

Da ist sie ja! Gleich mal nachfragen, was die UPS so zu erzählen hat:

$ upsc Eaton
battery.charge: 100
battery.charge.low: 20
battery.runtime: 3328
battery.type: PbAc
device.mfr: EATON
device.model: Ellipse PRO 850 
device.serial: P358M01BMG
device.type: ups
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
[...]

Cool – jede Menge Variablen, die uns Information über die UPS geben. Und die kann man auch gezielt abfragen.

$ upsc Eaton battery.charge
100

Also 100% Akkuladung. Oder

$ upsc Eaton ups.load
9

Also 9% der Maximal-Last. Und wenn wir wissen wollen, wie lange die UPS den Server mit Akku-Power maximal über Wasser halten kann:

$ upsc Eaton battery.runtime
3328

3328s = 55.5 Minuten. Nicht übel, aber ausreizen solle man das sicher nicht...

Automatische Überwachung

Das ist ja alles schön und gut, aber was noch fehlt ist das wichtigste: Der automatische Shutdown. Um den kümmert sich das tool upsmon. Dazu müssen wir erstmal einen user anlegen – also diesen Eintrag in upsd.users hinzufügen:

[upsmon]
    password = GarbleGrr980234-=234
    actions = SET
    instcmds = ALL

Nun werfen wir noch einen Blick inupsmon.conf. In der Version, die bei meinem Debian mitkam war schon vieles richtig vorkonfiguriert, aber v.a. das MONITOR statement muss man selbst anpassen/erstellen.

MONITOR Eaton@localhost 1 upsmon GarbleGrr980234-=234 slave
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h +0"
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5

Nun ist ein guter Zeitpunkt, den daemon neu zu starten, damit er unsere config auch verwendet:

systemctl restart nut-server.service
systemctl restart nut-monitor.service

Fine tuning

Damit ist das Ganze im Grunde einsatzbereit. Aber wie läuft das nun ab, wenn der Strom ausfällt? Und wann fährt der Server dann runter?

Die ausführliche Antwort ist hier zu finden – aber die Kurzfassung sieht so aus:

  1. Alles normal (ups.status: OL)
  2. Strom fällt aus
  3. UPS schaltet auf Batteriebetrieb (ups.status: OB)
  4. Irgendwann wird der Akku leer (ups.status: OB LB)
  5. upsmon leitet den shutdown ein
  6. Die UPS dreht den Strom ab und fährt sich auch selbst runter
  7. Irgendwann kommt der Strom wieder und die UPS und Server starten wieder

Wann genau Battery low erreicht wird sieht man hier:

$ upsc Eaton battery.charge.low
20

Also bei 20%. Aber was, wenn ich feige bin, oder der Server hundert Jahre für den Shutdown braucht? Dann will ich vielleicht schon bei 30% den shutdown. Kein Problem – dann stellen wir das in der UPS so ein:

$ upsrw -s battery.charge.low=30 -u upsmon -p GarbleGrr980234-=234 Eaton
OK

$  upsc Eaton battery.charge.low
30

Hat geklappt – sehr schön.

Stunde der Wahrheit

Zeit das alles auszuprobieren!

Stecker an der UPS ziehen. Sofort springt der Lüfter an und sie fängt an zu piepsen. Der Server läuft brav weiter und wir können auch am Status sehen, dass wir nun auf Battery-Power laufen:

$ upsc eaton ups.status
OB

Zudem bekommen eingeloggte user auf ihrem Terminal diese Message:

Broadcast message from nut@hal (somewhere) (Thu Jun  3 16:31:16 2021):

UPS Eaton@localhost on battery

Das Piepsen nervt, also stellen wir das mal ab:

upscmd -u upsmon -p GarbleGrr980234-=234 eaton beeper.mute

Besser!

Als nächstes schauen wir mal, wie es um die Batterie steht und was der Battery-Low level ist:

root@hal:~# upsc eaton battery.charge
48
root@hal:~# upsc eaton battery.charge.low
30

Also haben wir noch 48% Batterie und bei 30% geht's in den shutdown. Um das zu beschleunigen, setzen wir den Battery-Low Cutoff mal höher:

upsrw -s battery.charge.low=45 -u upsmon -p GarbleGrr980234-=234 eaton

Und schon geht das System zum Shutdown über:

Broadcast message from nut@hal (somewhere) (Thu Jun  3 16:38:01 2021):

UPS Eaton@localhost battery is low

Broadcast message from nut@hal (somewhere) (Thu Jun  3 16:38:21 2021):

Auto logout and shutdown proceeding

Connection to hal closed by remote host.
Connection to hal closed.

Cool – ich glaube, das war ein guter Kauf.