NUT steht für Network UPS Tools, und wir werden hier einen NUT Server einrichten. Ich habe in meinem Homelab einen ESXi und eine Synology NAS am arbeiten. Es kommt zwar nicht oft vor, aber ca. zwei mal im Jahr habe ich dann doch mal einen Stromausfall, teilweise selbstverschuldet oder eben durch externe Einflüssen. Somit stand für mich fest, das eine USV her muss, denn ich wollte keinen Datenverlust riskieren. Es gibt dabei drei Varianten von USV, wovon zwei für den normalen Anwender interessant sind. Da wären die Offline-USVs und die Line Interactive-USVs. Die Offline USVs reagieren nur auf einen Stromausfall und schalten von externer Versorgung auf Batteriebetrieb um. Sie sind die einfachsten USVs. Line Interactive USVs verfügen über eine automatische Spannungsanpassung (AVR) und können somit Unter- und Überspannungen ausgleichen. Ihr Nachteil ist jedoch ein erhöhter Stromverbrauch, aufgrund der AVR Funktion.
Wer generelle Probleme mit der Stromversorgung hat, wie stark schwankende Netzspannung, sollte zu einer Line Interactive USV greifen. Ansonsten tut es auch eine Offline USV. Da unsere Stromversorgung ansonsten stabil ist und ich den größeren Mehrverbrauch nicht wollte, habe ich mich für eine Offline USV entschieden. Zur Auswahl standen dabei folgende zwei Modelle, bei denen ich mich für das Erstere entschieden habe. Das zweite Modell ist eine Line Interactive USV. Da ich nur eine Leistung von unter 100W abdecken muss, habe ich mich für ein relativ kleines Modell entschieden. Ihr müsst also auch die Leistung eurer angeschlossenen Verbraucher betrachten.
Natürlich sollte auch der ESXi und die Synology heruntergefahren werden, sobald die Batterie in der USV zuneige geht. Daher habe ich mich dafür entschieden einen NUT-Server zu installieren, da ein Client für den ESXi verfügbar ist und die Synology NUT ebenfalls unterstützt. Zusätzlich gibt es die Möglichkeit den Server in Home Assistant zu integrieren und ebenfalls in LibreNMS. Somit werden alle Systeme die ich nutze unterstützt. Ich werde hierzu jede Woche einen Artikel verfassen, also habt Geduld und freut euch auf die Beiträge.
Artikel dieser Serie:
- NUT Server einrichten
- NUT ESXi NUT Client installieren
- NUT Synology Diskstation als NUT Client
- NUT Server mittels LibreNMS überwachen (noch nicht veröffentlicht)
- NUT Server in Home Assistant einbinden (noch nicht veröffentlicht)
USV anschließen
Als erstes verbinden wir unsere USV per USB mit dem Server. Anschließend überprüfen wir ob die USV erkannt wurde. Mittel lsusb können wir die verbundenen USB Geräte anzeigen lassen. Ihr solltet dort eure USV sehen. Die USV ist verbunden und wird erkannt, somit können wir weiter machen. Ich kann hier auch nur zeigen wie ihr eine USV mittels USB ansteuert, also keine LAN/SNMP Anschaltung.
lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 004: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
NUT Server installieren
Die eigentliche Installation ist schnell erledigt, die Konfiguration bedarf jedoch etwas mehr Arbeit. In Summe ist aber alles nicht schwer. Ich installiere NUT auf einem Debian 12 System, somit sollte diese Anleitung auch für Ubuntu passen. Andere Systeme verhalten sich etwa anders. Zur Veröffentlichung dieses Artikels wird die Version 2.8.0-7 installiert.
Wir starten damit unsere Repositories upzudaten und installieren danach nut und nut-cgi. nut ist der eigentliche NUT Server und nut-cgi ist ein Webinterface für den NUT Server. Ihr könnt auch NUT ohne nut-cgi installieren, ich möchte jedoch ein Webinterface haben. Ich installiere den Server auch in einer neuen VM auf meinem Server, es gibt also keine weitere Software, außer einem minimalen System.
sudo apt update
sudo apt install nut nut-cgi
Als nächstes scannen wir nach einer unterstützen USV. Die Daten kopieren wir uns denn damit müssen wir ein Config File füttern.
sudo nut-scanner -U
Scanning USB bus.
[nutdev1]
driver = "usbhid-ups"
port = "auto"
vendorid = "051D"
productid = "0002"
bus = "002"
NUT Server einrichten
Ab der Version 2.8, nutzt der Server nicht mehr die Bezeichnungen master/slave, sondern primary/secondary. Die Einstellung ist jedoch abwärtskompatibel. Wir beginnen erst mal damit die angeschlossene USV zu konfigurieren. Dazu fügen wir die Informationen vom Scan in die Datei /etc/nut/ups.conf
. Folgendes ist die minimale Konfiguration, selbst auf das Feld desc, also die Beschreibung, kann verzichtet werden.
[USV]
driver = usbhid-ups
port = auto
desc = "APC Back-UPS BE650G2"
/etc/nut/ups.confWenn ihr mehrere USVs überwachen wollt, müssen zusätzliche Parameter angegeben werden, damit das System die USV zuordnen kann. Dazu kann eine Kombination der Parameter vendor, product, vendorid, productid und serial genutzt werden. Der Treiber muss einfach in der Lage sein, die USVen zu unterscheiden.
[USV-1]
driver = usbhid-ups
port = auto
desc = "APC Back-UPS BE650G2"
vendorid = 051d
productid = 0002
serial = 31xxxxxxx1
[USV-2]
driver = usbhid-ups
port = auto
desc = "APC Back-UPS BE650G2"
vendorid = 051d
productid = 0002
serial = 32xxxxxxx2
/etc/nut/ups.confIm nächsten Schritt kümmern wir uns um die User. Dieser werden in der Datei /etc/nut/upsd.users
konfiguriert. Der erste User ist für administrative Zwecke und hat volle Berechtigungen, dieser könnt ihr aber auch erst mal weg lassen. Die anderen Beiden sind für den eigentlichen upsmon Prozess notwendig. Clients nutzen, in diesem Beispiel, den monuser Account, in dem upsmon als secondary konfiguriert ist. Der Server, welcher auch physikalisch mit der USV verbunden ist, nutzt den upsmon primary. Die Namen könnt ihr frei vergeben. Sollte der Ladezustand kritisch sein, werden zuerst alle secondaries herunter fahren und der primary wird damit beginnen sobald die secondaries die Verbindung zum upsd getrennt haben.
[admin]
password = secret
actions = set
actions = fsd
instcmds = all
[monprimary]
password = secret
upsmon primary
[monuser]
password = secret
upsmon secondary
/etc/nut/upsd.usersAls nächstes folg die Datei /etc/nut/upsmon.conf
, hier tragen wir die zu überwachende USV ein. Wir verwenden dabei den User mit dem primary Flag.
MONITOR USV@localhost 1 monprimary secret primary
/etc/nut/upsmon.confWeiter geht es mit der Datei /etc/nut/upsd.conf
, da unser NUT Server auch von Clients abgefragt werden soll, müssen wir dieses erlauben. Mit folgendem Eintrag, wird der Server auf Anfragen von allen Interfaces antworten.
LISTEN 0.0.0.0 3493
/etc/nut/upsd.confAbschließend müssen wir in der /etc/nut/nut.conf noch dem Server sagen, das er als Server arbeiten soll. Ein Client würde den Eintrag netclient erhalten.
MODE=netserver
/etc/nut/nut.conf Damit die gemachten Einstellungen greifen, müsst ihr ein paar Dienste neu starten oder startet einfach den Server neu, das spart euch einiges an Getippe. Das war es dann auch mit dem eigentlichen Thema NUT Server einrichten.
sudo systemctl restart nut-server
sudo systemctl restart nut-client
sudo systemctl restart nut-monitor
sudo upsdrvctl stop
sudo upsdrvctl start
NUT-Server testen
Über das Tool upsc können wir testen, ob der Server mit der USV sprechen kann. Ihr solltet eine ähnliche Ausgabe erhalten und wisst nun das alles klappt.
upsc USV
battery.charge: 99
battery.charge.low: 10
battery.charge.warning: 50
battery.date: 2001/09/25
battery.mfr.date: 2023/08/31
battery.runtime: 8835
battery.runtime.low: 120
battery.type: PbAc
battery.voltage: 13.5
battery.voltage.nominal: 12.0
device.mfr: APC
device.model: unknown
device.type: ups
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.synchronous: auto
driver.version: 2.8.0
driver.version.data: APC HID 0.98
driver.version.internal: 0.47
driver.version.usb: libusb-1.0.26 (API: 0x1000109)
input.sensitivity: medium
input.transfer.high: 266
input.transfer.low: 180
input.voltage: 238.0
input.voltage.nominal: 230
ups.beeper.status: enabled
ups.delay.shutdown: 20
ups.load: 2
ups.mfr: APC
ups.mfr.date: 2023/08/31
ups.model: unknown
ups.productid: 0002
ups.realpower.nominal: 400
ups.status: OL CHRG
ups.test.result: No test initiated
ups.timer.reboot: 0
ups.timer.shutdown: -1
ups.vendorid: 051d
Das Webinterface
Der Server läuft, jedoch wollen wir auch sehen wie der Status ist. Dank dem Paket nut-cgi, haben wir zugriff auf ein einfaches Webinterface. Nun müssen wir noch die Datei /etc/nut/hosts.conf
anpassen um die entsprechenden USVen im Webinterface anzeigen zu lassen.
MONITOR USV@localhost "APC Back-UPS BE650G2"
/etc/nut/hosts.confNun müssen wir noch das CGI Modul für den Apache aktivieren und den Apache neu starten.
sudo a2enmod cgi
sudo systemctl restart apache2
Nun müssen wir noch die Datei /etc/nut/upsset.conf
anpassen und folgendes eintragen. Ok, wir haben das nicht gemacht, also ist das hier gemachte erst mal nur für eine Testumgebung und kein Wirksystem in freier Wildbahn.
I_HAVE_SECURED_MY_CGI_DIRECTORY
/etc/nut/upsset.confEuer Webinterface ist danach unter folgendem Link erreichbar: http://your.ip.adddress/cgi-bin/nut/upsstats.cgi Wie er seht erhaltet ihr allerhand nützliche Informationen, wie die aktuelle Auslastung (Load) und die daraus resultierende Laufzeit auf Batterien.
Der Server läuft, macht aber aktuell noch nichts, denn er würde aktuell nur sich selbst herunter fahren. Im nächsten Beitrag werden wir damit einen ESXi steuern, damit dieser bei automatisch herunter fährt, sobald die Batterie einen kritischen Stand erreicht.