Zarządzanie zasilaczami awaryjnymi za pomocą NUT pozwala uniknąć stosowania nietypowego oprogoramowania i pozwala na udostępnieniu informacji o zasilaniu awaryjnym dowolnemu systemowi operacyjnemu.
Rozpocznyamy od instalacji serwera NUT na urządzeniu, które będzie bezpośrednio podłączonego do UPSa (zakładamy, że na tym urządzeniu będzie Debian).
apt install nut nut-client nut-server
Sprawdzamy czy UPS jest poprawnie podłączony i jaki ma idetyfikator na magistrali USB
lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 17ef:60ee Lenovo TrackPoint Keyboard II
Bus 001 Device 002: ID 0463:ffff MGE UPS Systems UPS
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
W tym przypadku jest to 0463:ffff
Pobieramy informacje o zasilaczu używając nut-scanner, otrzymane informacje ułatwią znacznie konfigurację.
nut-scanner -U
SNMP library not found. SNMP search disabled.
Neon library not found. XML search disabled.
IPMI library not found. IPMI search disabled.
Scanning USB bus.
[nutdev1]
driver = "usbhid-ups"
port = "auto"
vendorid = "0463"
productid = "FFFF"
bus = "001"
Konfiguracja przechowywana jest w /etc/nut/ups.conf
Dobrze skopiować pierwotny plik konfiguracyjny, by móc do niego wrócić a nową konfigurację stworzyć w kompletnie nowym pliku, zatem:
cp /etc/nut/ups.conf /etc/nut/ups.example.conf
Poniżej nowy plik konfiguracyjny
pollinterval = 1
maxretry = 3
[ups1]
driver = usbhid-ups
port = auto
desc = "Nasz UPS1"
vendorid = 0463
productid = FFFF
Plik może zawierać wiele sekcji dla różnych UPSów.
Podobnie jak wcześniej kopiujemy na zaś pierwotny plik w bezpieczne miejsce.
Zawartość pliku uspmon.conf powinna wyglądać tak:
RUN_AS_USER root
MONITOR ups1@localhost 1 admin secret master
gdzie:
ups1@localhost wskazuje na wcześniej skonfigurowany zasilacz
1 to ilość podłączonych UPSów
admin użytkownik
secret hasło
master oznacza, że ten UPS jest fizycznie podłączony do tej maszyny
Jeżeli mamy podpiętych więcej UPSów to każdy dodajemy w kolejnej linii zaczynając od MONITOR.
Jak poprzednio zabezpieczamy pierwotny plik.
Zawartość pliku może wyglądać tak:
LISTEN 0.0.0.0 3493
Pozwoli to na dostęp z wszystkich komputerów do danych o UPSach.
Jeżeli zamierzmy korzystać z tych danych jedynie na maszynie podłaczonej fizycznie do UPSa plik może wyglądać jak poniżej:
LISTEN 127.0.0.1 3493
MODE=netserver
gdzie MODE może mieć wartości: standalone - klient i serwer NUT na tej samej maszynie netserver - udostępnianie informacji innym maszynom netclient - tylko pobieranie informacji z serwera nutdev1
Ustawiamy dane użytkowników, którch będzie obsługiwał nasz serwer NUT
[monuser]
password = secret
admin master
W ten sposób utworzyliśmy użytkownika admin o haśle secret
Mamy dwie opcje - prostsza - restart maszyny
Trudniejsza - ponowne uruchomienie wszystkich procesów związanych z NUT i przeładowanie sterowników:
service nut-server restart
service nut-client restart
systemctl restart nut-monitor
upsdrvctl stop
upsdrvctl start
Wykonanie każdego z tych poleceń może chwilkę zająć.
Uruchamiamy upsc podając nazwę zasilacza i maszyny, która go monitoruje
upsc ups1@localhost
Powinniśmy otrzymać informacje o stanie zasilacza:
Init SSL without certificate database
battery.charge: 81
battery.runtime: 2131
battery.type: PbAc
device.mfr: EATON
device.model: 5E 850i
device.type: ups
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 1
driver.parameter.port: auto
driver.parameter.productid: FFFF
driver.parameter.synchronous: no
driver.parameter.vendorid: 0463
driver.version: 2.7.4
driver.version.data: MGE HID 1.40
driver.version.internal: 0.41
input.voltage: 236.0
outlet.1.status: on
outlet.desc: Main Outlet
outlet.id: 1
outlet.switchable: no
output.frequency: 49.9
output.frequency.nominal: 50
output.voltage: 236.0
output.voltage.nominal: 230
ups.beeper.status: enabled
ups.delay.shutdown: 20
ups.firmware: 03.08.0018
ups.load: 10
ups.mfr: EATON
ups.model: 5E 850i
ups.power.nominal: 850
ups.productid: ffff
ups.start.battery: yes
ups.status: OL
ups.timer.shutdown: -1
ups.vendorid: 0463
Możemy pytać o konkretne parametry - np.: o stan naładowania:
upsc ups1@localhost battery.charge
Init SSL without certificate database
81
Tworzymy plik docker-compose.yml o zawartości:
version: "3.1"
services:
nut:
image: teknologist/webnut
container_name: webnut
environment:
- UPS_HOST=192.168.x.y
- UPS_PORT=3493
- UPS_USER=admin
- UPS_PASSWORD=secret
restart: unless-stopped
security_opt:
- no-new-privileges:true
ports:
- 6543:6543
Następnie wydajemy polecenie:
docker-compose up -d --force-recreate
Pobieramy WinNUT-client z github albo stąd: WinNUT
Zaczynamy od tego, że musimy mieć zainstalowany pakiet nut-client:
apt install nut-client
Przystępujemy do edycji /etc/nut/upsmon.conf
RUN_AS_USER root
MONITOR ups1@192.168.x.y 1 admin secret slave
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h now"
NOTIFYCMD /usr/sbin/upssched
POLLFREQ 2
POLLFREQALERT 1
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower
NOTIFYMSG ONLINE "UPS %s on line power"
NOTIFYMSG ONBATT "UPS %s 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 SYSLOG+WALL
NOTIFYFLAG ONBATT SYSLOG+WALL
NOTIFYFLAG LOWBATT SYSLOG+WALL
NOTIFYFLAG FSD SYSLOG+WALL
NOTIFYFLAG COMMOK SYSLOG+WALL
NOTIFYFLAG COMMBAD SYSLOG+WALL
NOTIFYFLAG SHUTDOWN SYSLOG+WALL
NOTIFYFLAG REPLBATT SYSLOG+WALL
NOTIFYFLAG NOCOMM SYSLOG+WALL
NOTIFYFLAG NOPARENT SYSLOG+WALL
RBWARNTIME 43200
NOCOMMWARNTIME 600
FINALDELAY 5
Konfigurujemy /etc/nut/nut.conf
MODE=netclient
Konfigurujemy /etc/nut/upssched.conf
CMDSCRIPT /etc/nut/upssched-cmd
PIPEFN /etc/nut/upssched.pipe
LOCKFN /etc/nut/upssched.lock
AT ONBATT * START-TIMER onbatt 30
AT ONLINE * CANCEL-TIMER onbatt online
AT ONBATT * START-TIMER earlyshutdown 30
AT LOWBATT * EXECUTE onbatt
AT COMMBAD * START-TIMER commbad 30
AT COMMOK * CANCEL-TIMER commbad commok
AT NOCOMM * EXECUTE commbad
AT SHUTDOWN * EXECUTE powerdown
AT SHUTDOWN * EXECUTE powerdown
Konfigurujemy /etc/nut/upssched-cmd
#!/bin/sh
case $1 in
onbatt)
logger -t upssched-cmd "UPS running on battery"
;;
earlyshutdown)
logger -t upssched-cmd "UPS on battery too long, early shutdown"
/usr/sbin/upsmon -c fsd
;;
shutdowncritical)
logger -t upssched-cmd "UPS on battery critical, forced shutdown"
/usr/sbin/upsmon -c fsd
;;
upsgone)
logger -t upssched-cmd "UPS has been gone too long, can't reach"
;;
*)
logger -t upssched-cmd "Unrecognized command: $1"
;;
esac
Dla pliku /etc/nut/upssched-cmd doodajemy flage pozwalającą go uruchamiać:
chmod a+x /etc/nut/upssched-cmd
Restartujemy klienta NUT
systemctl restart nut-client
Testujemy konfigurację wysyłając żądnie informacji o stanie UPSa:
upsc ups1@192.168.x.y
By sprawdzić czy klienci właściwie zareagują możemy zrestartować serwer NUT na maszynie do której fizycznie podłączone są zasilacze awaryjne:
systemctl restart nut-server
Na maszynach z klientami powinny pojawić się komunikaty o utracie łączności po czym komunikaty o odzyskaniu łączności.