staging.inyokaproject.org

NUT

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:


Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

./nut_logo.png NUT 🇬🇧 steht für Network UPS Tools und ist ein Client/Server-Framework zur Ansteuerung und Verwaltung einer USV (unterbrechungsfreie Stromversorgung, englisch: UPS). Unterstützt werden über 100 verschiedene Hersteller und Modelle 🇬🇧. Die Kernprogrammkomponenten arbeiten als Systemdienst (Daemon), d.h. diese werden automatisch beim Einschalten des Rechners gestartet und arbeiten im Hintergrund. NUT kann dabei beim heimischen PC ebenso eingesetzt werden, wie bei einzelnen Servern oder bis zu umfangreichen Konstellationen, welche aus mehreren Servern und mehreren USVs bestehen.

Zunächst sollte geklärt werden, ob man ein zur USV passendes (serielles oder USB-) Kabel hat. Bauanleitungen für evtl. fehlende Kabel findet man auf der Projektseite 🇬🇧.

Das Konfigurieren und Testen der USV sollte anfangs nur passiv geschehen. Das heißt, dass die USV nur über das Datenkabel angeschlossen ist. Diese Anleitung behandelt beispielhaft eine Konstellation mit zwei Servern, die durch eine USV geschützt werden sollen.

NUT besteht aus diesen Kernprogrammen:

Vorüberlegungen

Die Struktur der USV-Absicherung sollte überlegt sein. In einer solchen Struktur gibt es vier Arten von Geräten / Rechnern:

(A) – Die Stromversorgung es Rechners ist durch die USV abgesichert (zumindests solange der Akku durchhält).

(B) – Der Rechner ist durch die USV abgesichert – wie (A) – ist aber gleichzeitig kommunikationstechnisch (z.B. per USB) direkt mit der USV (oder in komplexeren Strukturen vielleicht sogar mit mehreren) verbunden.

(C) – Der Rechner ist weder durch die USV geschützt noch mit ihr verbunden.

(D) – Die Stromversorgung des Rechners ist unabhängig von der USV. Er ist aber kommunikationstechnisch mit ihr verbunden. Ein sehr ungewöhnlicher Fall.

Das einfachste Szenario ist: Es gibt einen einzigen Rechner, der mit der USV abgesichtert werden sollt. Dieser Rechner fällt in Kategorie B.

Ein typisches Szenario ist: Es gibt ein B und viele A und möglicherweise noch C-Geräte.

Für komplexere Strukturen gibt es ausführliche Anleitungen und Beispiele auf der Projektseite. In so einem Fall sollte man sich zunächst einen Plan machen.

Folgendes muss bzw. kann nun auf diesen Geräten installiert, bzw. konfiguriert werden:

(A) – upsmon, optional: upssched

(B) – upsd, upsmon, optional: upssched

(C) – optional: upsmon, upssched

(D) – upsd, optional: upsmon

Installation

Folgendes Paket wird für die Installation in allen Fällen verwendet [1]:

  • nut

Befehl zum Installieren der Pakete:

sudo apt-get install nut 

Oder mit apturl installieren, Link: apt://nut

Optional können weitere Zusatzpakete installiert werden:

  • nut-cgi (Weboberfläche, siehe unten)

  • nut-snmp (SNMP-Überwachung)

  • nut-xml (universe, für spezielle Modelle von Eaton oder MGE)

  • nut-ipmi (universe, für IPMI, ab Ubuntu 14.04)

Befehl zum Installieren der Pakete:

sudo apt-get install nut-cgi nut-snmp nut-xml nut-ipmi 

Oder mit apturl installieren, Link: apt://nut-cgi,nut-snmp,nut-xml,nut-ipmi

Üblicherweise befinden sich dann die Konfigurationsdateien im Ordner /etc/nut:

  • nut.conf

  • ups.conf

  • upsd.conf

  • upsd.users

  • upsmon.conf

  • upssched.conf

Diese Dateien beinhalten sinnvolle Voreinstellungen und Erklärungen.

Sollten ein oder mehrere Dateien nicht vorhanden sein, kann man die Beispieldateien aus /usr/share/doc/nut/examples/ nach /etc/nut/ kopieren. Damit die Dateien auch genutzt werden können, müssen sie nur noch umbenannt werden: .sample im Dateinamen löschen. Das Konfigurationsbeispiel von upsmon muss gegebenenfalls noch entpackt [2] werden. Dies geschieht z.B. mit [3]:

gzip -d upsmon.conf.sample.gz  

Damit ist die Installation abgeschlossen und es kann mit der Konfiguration begonnen werden.

upsd Server (Typ B oder D)

Der Serverdienst wird an einem Rechner Typ B oder D installiert.

Modus konfigurieren

Dazu editiert [4] man /etc/nut/nut.conf wie folgt:

MODE=netserver

Anschluss an USV konfigurieren

Dazu editiert man die /etc/nut/ups.conf:

[ups1]
  driver = "apcsmart"		# Treiber der verwendet werden soll
  port = "/dev/ttyS0"		# Port, an dem die USV angeschlossen ist (hier COM1)
  desc = "Meine USV"		# Beschreibung der USV

Es gibt noch weitere Parameter, die man hier angeben kann. Diese kann man in der man-Page von ups.conf nachlesen. Eine Liste unterstützter USVs und Infos zu den Treibern findet man unter Hardware compatibility list 🇬🇧. (Bei manchen Treibern,z.B. blazer_usb, kann der Port auf "auto" gestellt werden, in diesem Fall, weil USB hier Standard ist).

Serverdienst upsd konfigurieren

Dazu editiert man die /etc/nut/upsd.conf.

Mit der Option LISTEN konfiguriert man, auf welchen IP-Adressbereich der Server hört. In der aktuellen Version von NUT darf hier nur noch ein LISTEN-Eintrag gemacht werden. Im Grunde gibt es zwei Szenarien:

  • Es gibt nur einen Rechner vom Typ B und sonst keine. Auf dem Rechner laufen dann alle Dienste von NUT und upsd muss nur auf den „local host“ hören:

LISTEN 127.0.0.1

  • Es gibt neben dem Rechner vom Typ B auch Rechner vom Typ A oder C (auf denen upsmon laufen soll)

LISTEN 0.0.0.0

Benutzer einrichten

Dazu editiert man /etc/nut/upsd.users. Es bietet sich hier an, drei Benutzer anzulegen, und zwar einen upsmaster (der auf dem Server die Überwachung übernimmt), einen upsslave (der von den Clients die Überwachung übernimmt) und einen upsadmin (der Verwaltungsaufgaben übernehmen darf).

[upsmaster]				# Benutzername
  password = upsmasterpw    		# Passwort für den Benutzer
  upsmon master		         	# Art des Zugriffs*

[upsslave]
  password = upsslavepw
  upsmon slave

[upsadmin]
  password = upsadminpw
  actions = SET
  instcmds = ALL

Alternativ lassen sich "master" und "admin" auch kombinieren zu:

[upsmaster]
  password = upsmasterpw
  actions = SET
  instcmds = ALL
  upsmon master

[upsslave]
  password = upsslavepw
  upsmon slave

Hinweis:

Die Benutzer in dieser Datei haben nichts mit den Linux-Benutzern zu tun. Sie regeln nur die Zugriffsrechte von upsmon auf upsd.

Art des Zugriffs - master oder slave: Müssen die Rechner gezielt heruntergefahren werden, so werden alle upsmon-Instanzen benachrichtigt. Der master wartet zunächst ab, dass alle slave-Rechner das Herunterfahren eingeleitet haben, bevor er selbst damit beginnt. Darum ist typischerweise der Rechner vom Typ B der master und alle Rechner vom Typ A oder C laufen als slave.

(Diese Bezeichnungen gelten nach heutigem Stand als politisch inkorrekt, sind in NUT aber so programmiert)

upsmon einrichten

Im Fall (B) richten wir auch den Client ein. Im seltenen Fall (D) ist dies optional. Dazu editiert man die /etc/nut/upsmon.conf:

RUN_AS_USER nut

Hier wird eingestellt unter welchem User weitere Aktionen ausgeführt werden.

Als nächstes konfiguriert man die Verbindung zum upsd:

MONITOR ups1@localhost 1 upsmaster upsmasterpw master

Dies sagt dem upsmon, dass die USV "ups1" am lokalen Rechner (Typ B) mit den Benutzer "upsmaster" und dem Passwort "upsmasterpw" an upsd angemeldet wird.

MINSUPPLIES 1

Gibt an, wie viele USVs mindestens verfügbar sein müssen. In den meisten Fällen 1.

SHUTDOWNCMD “/sbin/shutdown -h +0“

Der Befehl zum Herunterfahren des Systems.

NOTIFYCMD /sbin/upssched

Gibt an welches Programm gestartet werden soll, wenn ein bestimmtes Ereignis eintritt. Hier kann ein eigenes Skript eingestellt werden oder (wie im Beispiel) upssched. Zu upssched später mehr.

POLLFREQ 5

Ist das Intervall in Sekunden, in dem der Monitor die USV abfragt.

POLLFREQALERT 5

Ist das Intervall in Sekunden, in dem der Monitor die USV abfragt, wenn die USV auf Alarm steht (bspw. die USV auf Batterie läuft).

HOSTSYNC 15

Ist die Zeit, die der Server wartet, dass die Clients ihre Verbindung trennen können, wenn FSD gesetzt worden ist (FSD wird gesetzt wenn z.B. die Batterie fast leer ist).

DEADTIME 15

Die Zeit die gewartet wird, wenn die USV nicht erreichbar ist (bevor sie als nicht verfügbar gilt). Sollte das 3-fache von POLLFREQ und POLLFREQALERT sein.

POWERDOWNFLAG /etc/killpower

Diese Datei wird vom Monitor erstellt, wenn der Rechner herunterfahren soll.

NOTIFYMSG ONLINE "USV-ONLINE"
NOTIFYMSG ONBATT "USV-AUF-BATTERIE"
# und so weiter ...

Hier werden die Nachrichtentexte für bestimmte Ereignisse deklariert. Ereignisse können sein:

  • ONLINE - USV bekommt wieder externen Strom

  • ONBATT - USV läuft auf Batteriebetrieb

  • LOWBATT - USV hat niedrigen Batteriestand erreicht

  • FSD - Herunterfahren eingeleitet (Forced Shutdown)

  • COMMOK - Kommunikation mit USV aufgebaut

  • COMMBAD - Kommunikation mit USV verloren

  • SHUTDOWN - Das System wird heruntergefahren

  • REPLBATT - USV-Batterie muss getauscht werden

  • NOCOMM - USV ist nicht erreichbar

  • NOPARENT - upsmon Elternprozess beendet, Herunterfahren unmöglich

NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
# und so weiter ...

Dies sind die Aktionen, die durchgeführt werden, wenn ein Ereignis eintritt. SYSLOG gibt an, das das Ereignis ins Systemprotokoll geschrieben wird. WALL sendet Nachrichten an alle angemeldeten Benutzer am lokalen PC (siehe auch wall). EXEC gibt den Status an das Programm von NOTIFYCMD weiter. Wenn z.B. nur Nachrichten gesendet werden sollen, reicht WALL aus. Hier werden die selben Ereignisse verwendet wie bei NOTIFYMSG.

RBWARNTIME 43200

Ist die Zeit in Sekunden bevor die Meldung für den Batteriewechsel kommt.

NOCOMMWARNTIME 300

Ist die Zeit in Sekunden bis die Meldung kommt, dass die USV nicht erreichbar ist. Diese Meldung wiederholt sich so lange bis die USV wieder erreichbar ist.

FINALDELAY 5

Ist die Zeit die gewartet wird, nachdem der SHUTDOWNCMD aufgerufen wird bevor er ausgeführt wird.

upssched verwenden

Dazu editiert man die Datei /etc/nut/upssched.conf oder legt sie neu an.

CMDSCRIPT /etc/nut/upssched/upsscript

Ist der Pfad zu dem Skript, was ausgeführt werden soll, wenn die Trigger (Schalter) gesetzt werden.

PIPEFN /etc/nut/upssched/upssched.pipe
LOCKFN /etc/nut/upssched/upssched.lock

Diese Dateien werden genutzt, um mit den Prozessen zu agieren. Sie werden automatisch erzeugt und gelöscht.

AT ONBATT * START-TIMER onbatt 90
AT ONLINE * CANCEL-TIMER onbatt
AT LOWBATT * EXEC battleer

In diesem Fall wird ein Timer gestartet, wenn die USV auf Batterie umschaltet. Dieser wartet 90 Sekunden, bevor er den Parameter onbatt an das CMDSCRIPT weiter gibt. Schaltet die USV wieder ONLINE, so wird der Timer abgebrochen. Wenn die USV Batterie niedrig ist, wird sofort das Skript mit dem Parameter battleer ausgeführt.

Beispiel-Skript für upssched

Das Skript ist ein einfaches Beispiel für die Konfiguration:

1
2
3
4
5
6
7
8
9
#!/bin/sh
case $1 in
  onbatt)
    /sbin/shutdown -h +0;;
  battleer)
    /sbin/upssched fsd;;
  *)
    echo "Falscher Parameter";;
esac

Rechte ändern

Da die Dateien wichtige Konfigurationen und Passwörter enthalten müssen sie gut durch Einschränkung von Rechten geschützt werden. Im Ordner /etc/nut sollten alle Dateien root gehören und die Gruppe nut Leserechte [5] haben. Dies geschieht mit

cd /etc/nut
chown -R root:nut /etc/nut/*
chmod -R 640 /etc/nut/* 

Sollte man ein eigenes Skript erstellt und in /etc/nut gespeichert haben, muss dies zusätzlich ausführbar gemacht werden:

chmod -R 750 /etc/nut/myscript.sh 

Testen der Einstellungen

Wenn man alles nach seinen Wünschen eingestellt hat, kann man nun den Rechner neu starten. Dann kann man mit

upsc ups1 

den Status seiner USV auslesen. Als nächstes zieht man die Stromversorgung der USV ab, um zu sehen ob alles so funktioniert wie gewünscht. Wenn alles funktioniert, kann man nun die USV richtig an den Rechner anschließen.

Konfiguration reiner Client-Betrieb

Auf allen Rechnern vom Typ A wird nur der Client upsmon aktiviert. Es gibt auch Anwendungsfälle dies auf Rechnern vom Typ C zu installieren, wenn diese einfach Statusinformationen verarbeiten sollen, z.B. Statusdaten der USV sammeln und graphisch darstellen oder Mails bei kritischem Status versenden oder einfach eine Benachrichtigung auf dem Arbeits-PC. Das könnte natürlich auch auf den anderen Rechnern (Typ A oder B) erledigt werden.

Modus einrichten

Dazu editiert man die /etc/nut/nut.conf:

MODE=netclient

upsmon konfigurieren

Im Prinzip genau wie oben beim Server-Betrieb, nur dass die Zeile von Monitor anders lautet.

# MONITOR upsname@adress_of_upsd_pc 1 ups_user password master/slave
MONITOR ups1@192.168.156.54 1 upsslave upsslavepw slave

Dabei ist die IP-Adresse Anstatt der IP-Adresse kann hier auch der Hostname angegeben werden, falls er aufgelöst werden kann.

upssched oder Skripte einrichten

Kann hier genau so genutzt werden wie beim Server.

Testen der Einstellungen

Rechner neu starten und mit:

upsc ups1@192.168.156.54  

testen, ob die Daten ausgelesen werden können.

Firewall

Zu beachten ist, dass die Kommunikation zwischen upsd und upsmon standardmäßig über Port 3493 läuft. Dies lässt sich auch in den Konfigurationsdateien ändern, indem bei den LISTEN- und MONITOR-Anweisungen jeweils der Port ergänzt wird:

# upsd.conf:
LISTEN 0.0.0.0 1508
# upsmon.conf:
MONITOR ups1@192.168.156.54:1508 1 upsslave upsslavepw slave

Wichtig ist jedoch, dass diese Kommunikation auf Port 3493 (oder dem selbstgewählten Port) zwischen verschiedenen Rechnern auch durch die Firewall beider Rechner erlaubt ist. Im Fall eines Proxmox-Servers mit aktivierter Firewall, muss der Eingang und Ausgang für den Port ausdrücklich freigegeben werden. Ebenso wenn z.B. die Ubuntu-Standardfirewall ufw aktiviert wurde oder wird.

Beispiel-Skript

Dieses Beispiel gilt für einen Rechner vom Typ C. Ich verwende es auf meinem Laptop. Dieser ist von der USV und durch den Akku auch vom Strom unabhängig. Die USV versorgt zwei Server (Typ A als slave und B als master). Ich möchte aber gerne eine schnelle Meldung bekommen, wenn etwas passiert und ich am Laptop sitzen sollte. Installiert ist also nur der Monitorbetrieb upsmon als weiterer slave.

nut.conf:

MODE=netclient

upsmon.conf:

RUN_AS_USER nut
MONITOR ups1@192.168.156.54 1 upsslave upsslavepw slave
MINSUPPLIES 1
NOTIFYCMD /etc/nut/notify.sh
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower
NOTIFYMSG ONLINE        "UPS %s back on line power"
NOTIFYMSG ONBATT        "UPS %s is on battery"
NOTIFYMSG LOWBATT       "UPS %s battery is low"
NOTIFYMSG FSD           "UPS %s: forced shutdown in progress"
NOTIFYMSG COMMOK        "Communications with UPS %s established"
NOTIFYMSG COMMBAD       "Communications with UPS %s lost"
NOTIFYMSG SHUTDOWN      "Auto logout and shutdown proceeding"
NOTIFYMSG REPLBATT      "UPS %s battery needs to be replaced"
NOTIFYMSG NOCOMM        "UPS %s is unavailable"
NOTIFYMSG NOPARENT      "upsmon parent process died - shutdown impossible"
NOTIFYFLAG ONLINE       WALL+EXEC
NOTIFYFLAG ONBATT       WALL+EXEC
NOTIFYFLAG LOWBATT      WALL+EXEC
NOTIFYFLAG FSD          WALL+EXEC
NOTIFYFLAG COMMOK       WALL+EXEC
NOTIFYFLAG COMMBAD      WALL+EXEC
NOTIFYFLAG SHUTDOWN     WALL+EXEC
NOTIFYFLAG REPLBATT     WALL+EXEC
NOTIFYFLAG NOCOMM       WALL+EXEC
NOTIFYFLAG NOPARENT     WALL+EXEC
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5

Wichtig:

  • Der SHUTDOWNCMD ist entfernt, weil das Laptop nicht automatisch mit heruntergefahren werden soll.

  • notify.sh muss wie folgt in /etc/nut erstellt und mit den Rechten 750 (siehe oben) ausgestattet werden.

  • Zenity muss installiert sein (eigentlich Standard in Ubuntu)

notify.sh:

1
2
3
!bin/bash
# send a message to user screen
zenity --info --title "Meldung von der USV" --text "$1"

Andere Aktionen, die ein Server ausführen könnte, wäre die Benachrichtigung des Admins über eine Email. Dazu findet sich unten ein Link.

Administrative Werkzeuge

Man kann eine Web-Oberfläche für Nut installieren, um diese von einen beliebigen Ort im Netzwerk zu kontrollieren und Testläufe zu starten. Voraussetzung ist ein laufender Webserver.

Folgendes Paket wird für die Installation benötigt:

  • nut-cgi

Befehl zum Installieren der Pakete:

sudo apt-get install nut-cgi 

Oder mit apturl installieren, Link: apt://nut-cgi

Ist dies installiert, so kann man mit einem Webbrowser auf die gerade erstellte Seite von NUT zugreifen. Zum Beispiel:

http://localhost/nut

Für die Anmeldung gelten die Benutzernamen, die in ups.users eingerichtet wurden.

Hinweis:

Der Webserver sollte so eingerichtet werden, dass der Zugriff auf die Web-Oberfläche nur vom lokalen Netz erlaubt ist.

Diese Revision wurde am 25. Februar 2021 07:29 von Heinrich_Schwietering erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Netzwerk, Server, Sicherheit