NAS fährt vom NUT-Master nicht herunter

Ich versuche, mein NAS so zu konfigurieren, dass es per Befehl von meinem NUT-Server heruntergefahren wird. Ich habe viele Dinge und Varianten ausprobiert, einschließlich der Umbenennung meines Servers / Hinzufügung einer Dummy-USV namens [qnapups] und der Erstellung eines Benutzers admin/123456 oder der Änderung der Konfigurationen genau wie in diesem Blog beschrieben:
https://www.dalbert.net/qnap-nas/
aber ich bekomme mein NAS nicht zum Herunterfahren.

Nachdem ich aktuell jeden Schritt im obigen Blog befolgt habe (Änderung des MONITOR-Befehls auf dem NAS, sodass Benutzername/Passwort korrekt sind und eine Dummy-USV namens qnapups im Master hinzugefügt wurde), habe ich eine funktionierende Verbindung unter Systemsteuerung → Externes Gerät → USV mit meiner Server-ID wie vorgesehen, und auch beim Ausführen von upsc myups@<ip> per SSH erhalte ich die USV-Daten. Aber kein Signal scheint das NAS zu beeinflussen.

Wenn ich jedoch das Herunterfahr-Signal mit

 upsmon -c fsd

auf dem Master sende, werden nur die anderen Clients heruntergefahren, nicht das NAS.

Ich bekomme dieses widerspenstige NAS einfach nicht zum Herunterfahren (ich habe vorher einen reinen SSH-Ansatz versucht, und das war noch schlimmer).

Meine /etc/config/ups/upsmon.conf auf dem NAS:

RUN_AS_USER admin            
MONITOR qnapnas@<ip> 1 monuser secret slave
MINSUPPLIES 0                
# NAS ist ein Client (wenn es NICHT andere Geräte mit Strom versorgt)
SHUTDOWNCMD "/sbin/shutdown -h +0"
FINALDELAY 0     

(Andere Dateien sind unverändert)

Wie gesagt, sowohl upsc myups@ip (echte USV) als auch upsc qnapups@ip (Dummy-USV) funktionieren wie erwartet, es wird aber kein Shutdown ausgeführt, und auch mit:

upscmd -u monuser -p secret qnapups@ip load.off
OK
upscmd -u monuser -p secret qnapups@ip driver.killpower
OK

Nichts bringt das NAS zum Herunterfahren.

Ich habe keine Logs, und soweit ich das verstehe, gibt es keine vollständige Version des NUT-Clients auf diesem Gerät, daher funktioniert es nicht wie erwartet mit allen Logdateien.

Ich kann nicht einmal herausfinden, wie ich einen lokalen Shutdown-Test debuggen könnte, da upsmon -c fsd auf dem NAS nicht funktioniert:

[~] # sudo upsmon -c fsd
Network UPS Tools upsmon 2.7.4
kill: No such process

Jede Hilfe wäre sehr willkommen!

Modell: TS-832PX
Software: QTS 5.0.1 2376

Könnten Sie bitte versuchen, den NUT Slave über unsere Benutzeroberfläche einzurichten? Oder gibt es einen bestimmten Grund, warum Sie ihn nicht direkt über die Benutzeroberfläche einrichten können?

Bezüglich des Problems mit dem Befehl werde ich dies an unser internes Team zur Analyse weiterleiten. Vielen Dank für die Meldung!

Endlich hat es begonnen, den BL-Status zu beachten und startet den im UI definierten Timer, das hat vorher nicht funktioniert (vielleicht war ein Neustart zusätzlich zum Anwenden-Button nötig).
Aber ich möchte ein FSD zu einem bestimmten Zeitpunkt auslösen, ich will keinen Batterie-Ereignis-Timer, ich habe ihn im UI auf 100 Minuten gesetzt, damit er nicht stört.
Ich möchte, dass es upsmon -fsd vom Master befolgt, was aktuell nicht der Fall ist.
Mit dummy-ups könnte ich das machen und einen 0-Minuten-Timer setzen, aber das UI lässt mich das nicht.

Gibt es ein Update?

Ich hatte die Lösung schon vor langer Zeit im alten Forum dokumentiert, aber das gibt es inzwischen nicht mehr.

Ich habe gerade meinen UPS auf ein Unifi UPS 2U umgestellt und dieses unterstützt einen NUT-Server, mit konfigurierbarem UPSName, Benutzernamen und Passwort.

Ich habe Claude Desktop benutzt, um das Ganze wieder zum Laufen zu bringen. Hoffe, das hilft dir.

QNAP als NUT (Network UPS Tools) Client fixen — Die GUI-Option „Network UPS Slave" funktioniert nicht richtig

Das Setup

  • Ein NUT-Server läuft auf einem separaten Gerät (in meinem Fall ein UniFi UPS, das als NUT-Server agiert), erreichbar unter <NUT_SERVER_IP>:3493.
  • Ein QNAP NAS (QTS 5.2.9), das diesen UPS als Client/Slave überwachen soll, damit es auf Stromereignisse reagieren kann.

Das Problem

Die eigene GUI-Option von QNAP hierfür — Systemsteuerung → System → Energie → UPS → „Network UPS Slave" — fragt nur nach der IP-Adresse des Servers. Es gibt kein Benutzername-/Passwort-Feld.

Echte NUT-MONITOR-Verbindungen (die das Gerät als authentifizierten Client registrieren und ein korrektes Herunterfahren ermöglichen) brauchen Zugangsdaten, die zu einem Eintrag auf dem Server in upsd.users passen. Ohne diese kann der QNAP-prozess („upsutil“), der über die GUI gestartet wird, nicht richtig authentifizieren, deshalb:

  • Das NAS tauchte nie in der Liste der verbundenen Clients des NUT-Servers auf.
  • Die eigenen UPS-Informationsfelder der GUI blieben leer (Netzstatus, Batteriestand, Modell — alles zeigte --), obwohl der UPS klar online war.

Manuell eine schreibgeschützte Abfrage ausführen funktionierte einwandfrei:

upsc <ups_name>@<NUT_SERVER_IP>

Das ergab sämtliche Live-Daten (Batteriestand, Last, Status usw.) — der Server ist also erreichbar und der UPS-Name stimmt. Allerdings ist dies nur ein nicht-authentifizierter read, keine Monitor-Verbindung. Man sieht nicht, ob der tatsächliche Monitoring-Daemon läuft.

Die entscheidende Entdeckung: Ein ps | grep -i ups zeigte nur upsutilupsmon (der eigentliche NUT-Monitor-Daemon) lief auf dem NAS gar nicht. Die GUI-Option „Network UPS Slave" startet ihn nicht.

Die Lösung

1. Die echte upsmon-Konfiguration direkt bearbeiten

QNAP bringt eine Standard-NUT-upsmon.conf mit, aber die GUI füllt dort die MONITOR Zeile nie mit Zugangsdaten, da sie sie nicht abfragt. Bearbeite die Datei direkt (per SSH oder SFTP):

/etc/config/ups/upsmon.conf

Füge die richtige MONITOR Zeile mit den passenden NUT-Zugangsdaten vom Server hinzu (oder korrigiere sie):

MONITOR <ups_name>@<NUT_SERVER_IP>:3493 1 <monitor_username> <monitor_password> slave

Tipp: Den korrekten <ups_name> (das ist der interne Gerätename, der auf dem NUT-Server registriert ist und muss nicht „ups" heißen) findet man mit:

upsc -l <NUT_SERVER_IP>

2. Den echten Monitoring-Daemon starten

Das QNAP-upsmon-Binary akzeptiert nicht das übliche -c <Pfad> wie normale NUT-Builds (dieses Flag ist für Kommandos wie fsd/reload/stop reserviert). Es liest seine Konfiguration direkt aus dem oben bearbeiteten Pfad /etc/config/ups/upsmon.conf — sobald diese Datei korrekt ist, genügt:

/usr/sbin/upsmon

Schau nach, ob er wirklich läuft (es sollten zwei Prozesse erscheinen — ein privilegierter Parent und ein unprivilegierter Worker):

ps | grep -i upsmon

Sobald er läuft, erscheint das NAS korrekt in der Client-Liste des NUT-Servers und die Verbindung ist authentifiziert.

3. Auf Dauer sicherstellen (Crontab-Watchdog)

Die QNAP-GUI weiß nicht, dass dieser Prozess von Hand gestartet wurde, deshalb überlebt er keinen Neustart und jede Änderung in den GUI-Energieeinstellungen oder ups.sh restart tötet ihn. Statt mit QNAPs fragiler autorun.sh zu kämpfen (die in Systemsteuerung → Hardware → Allgemein aktiviert werden muss und von Malware Remover auch wieder lautlos deaktiviert werden kann), ist ein einfacher Crontab-Watchdog zuverlässiger:

*/5 * * * * pgrep -x upsmon >/dev/null || /usr/sbin/upsmon

Das prüft alle 5 Minuten, ob upsmon läuft und startet ihn falls nötig neu — also auch nach Neustarts, Abstürzen und Eingriffen durch die GUI.

Wichtig bei QNAP: Die Datei /etc/config/crontab direkt zu bearbeiten (z.B. mit Notepad++ über SFTP) reicht nicht — crond.sh restart reicht nicht, sie muss explizit ins aktive crontab geladen werden:

crontab /etc/config/crontab && /etc/init.d/crond.sh restart

Danach prüfen, ob sie geladen wurde:

crontab -l

(Auch prüfen, ob die Zeilenenden im Unix/LF-Format sind, wenn man sie von Windows bearbeitet — CRLF kann bewirken, dass cron die Zeile stumm ignoriert.)

Ergebnis

  • upsmon läuft durchgehend und authentifiziert und erscheint korrekt in der Client-Liste des NUT-Servers.
  • upsc <ups_name>@<NUT_SERVER_IP> liefert weiterhin Live-UPS-Daten.
  • Ein Cron-Watchdog hält ihn am Laufen, auch bei Neustarts und GUI-Eingriffen, ohne dass das fragile QNAP-autorun.sh gebraucht wird.

Zusammenfassung der Ursache

Die eingebaute GUI-Option von QNAP „Network UPS Slave" ist ein vereinfachter, nicht-authentifizierter Wrapper (upsutil) — das ist nicht das gleiche wie der Standard-NUT-Daemon upsmon und kann kein echtes, authentifiziertes Client-Monitoring. Wenn die UPS-Statusseite auf deinem QNAP leere Felder zeigt und das NAS nicht in der Clientliste des NUT-Servers erscheint, prüfe ob wirklich upsmon läuft (ps | grep upsmon) — vermutlich tut er das nicht, egal was die GUI anzeigt.

:warning: Hinweis: Das umgeht QNAPs eigene integrierte USV-Verwaltung (upsutil / die GUI-Option „Netzwerk-USV-Slave“) und startet stattdessen den regulären NUT-upsmon-Daemon manuell, mit einem benutzerdefinierten SHUTDOWNCMD. Das wird von QNAP offiziell nicht unterstützt. Teste das unbedingt in deiner eigenen Umgebung, bevor du dich darauf verlässt — ich übernehme keinerlei Verantwortung für Datenverlust, nicht durchgeführte Shutdowns oder andere Probleme, die aus diesen Schritten resultieren.

QNAP + NUT: SHUTDOWNCMD fixen, wenn du upsmon statt QNAPs upsutil verwendest

Wenn du die eingebaute „Netzwerk-USV-Slave“-Option von QNAP umgehst (die deren eigenes upsutil-Tool nutzt und keine authentifizierten NUT-Verbindungen unterstützt) und stattdessen direkt den standardmäßigen NUT-upsmon-Daemon einsetzt, gibt es noch eine wichtige Sache zu fixen: Das voreingestellte SHUTDOWNCMD in upsmon.conf funktioniert auf QNAP nicht und scheitert bei einem echten Stromausfall einfach stumm.

Das Problem

QNAP liefert upsmon.conf mit dem Standard-Template von NUT aus:

SHUTDOWNCMD "/sbin/shutdown -h +0"

Das ist nur das generische Beispiel aus NUTs Source-Paket — derselbe Standard auf fast allen Linux-Distributionen. QNAP hat die Datei unverändert übernommen und nicht ans eigene OS angepasst, weil ihr unterstützter Weg von Anfang an nie upsmon vorsah, sondern auf upsutil setzt (siehe auch den Begleit-Post, warum upsutil nicht richtig mit authentifizierten NUT-Servern funktioniert).

Das Ergebnis: /sbin/shutdown existiert auf QNAP (QTS) nicht. Überprüfe das mit:

which shutdown
ls -la /sbin/shutdown

Falls upsmon jemals einen Notfall-Shutdown auslösen muss (USV im Batteriebetrieb, kritisch), scheitert dieser Befehl einfach — für upsmon passiert das stumm — und das System läuft weiter auf einer sterbenden USV, ohne dass tatsächlich heruntergefahren wird.

Warum upsutil dieses Problem nicht hat

upsutil (QNAPs eigenes Tool) nutzt das SHUTDOWNCMD gar nicht — die Logik für Shutdown und Unmount ist intern fest kodiert und ruft vermutlich direkt QNAPs echten Poweroff-Pfad auf. Es handelt sich um einen komplett separaten Code-Pfad zu upsmon/upsmon.conf. Die SHUTDOWNCMD-Zeile ist nur relevant, wenn du selbst upsmon startest.

Die Lösung

QNAPs tatsächlicher Poweroff-Einstiegspunkt ist:

/sbin/poweroff

Das ist bestätigt das echte Binary, das QNAPs eigenes /etc/init.d/poweroff-Script intern aufruft (nach eigenen Abläufen wie Scheduling und Prüfen von ausgelasteten Volumes, die du für einen USV-Notfall nicht brauchst — der Shutdown soll sofort erfolgen).

Passe upsmon.conf an:

SHUTDOWNCMD "/sbin/poweroff"

Dann upsmon neu starten, damit die Änderung aktiv wird:

pkill upsmon
/usr/sbin/upsmon

Fazit

Wenn du upsmon auf deinem QNAP NAS verwendest (weil die GUI-Option „Netzwerk-USV-Slave“ keine authentifizierten NUT-Server unterstützt), solltest du dem Standard-SHUTDOWNCMD in der upsmon.conf nicht trauen — das ist bloß generisches Upstream-Boilerplate, das QNAP nie angepasst hat, und die referenzierte Binary existiert auf QTS nicht. Ändere es auf /sbin/poweroff, bevor du dich im Ernstfall darauf verlässt.

Vielleicht sollte eine allgemeinere Implementierung (oder Unterstützung) als Produkterweiterung angefragt werden, um Workarounds zu vermeiden? Klingt für mich nach einem guten Anwendungsfall.

Stell dir vor, Qnap würde NUT direkt unterstützen… glaubt irgendwer wirklich, dass das eine Option ist? :rofl: