Configurer et surveiller un onduleur avec NUT
Cet article est une ébauche. N'hésitez pas à contribuer ou à en discuter.
Ce tuto est destiné à vous aider à configurer (et surveiller) un onduleur sur une Debian.
Nous avons utilisés un onduleur PROLINK PRO850VU, connecté à l'ordinateur par un câble USB.
Intérêt
L'intérêt d'avoir un onduleur n'est plus à démontrer.
Pouvoir contrôler celui-ci et ordonner l'arrêt de votre machine en cas de coupure prolongée du secteur en est un autre. En effet, si la coupure de secteur dure trop longtemps et que vous videz la batterie de votre UPS (Uninterruptible Power Supply qui signifie alimentation sans interruption) avant d'avoir le temps d'éteindre votre machine, l'intérêt de l'onduleur est nul... Vous aurez tout juste gagné quelques minutes avant la coupure sauvage de votre système.
De plus NUT vous permettra aussi d'éteindre l'onduleur: une fois la machine arrêtée l'onduleur s’arrêtera complètement, évitant ainsi une décharge complète de(s) batterie(s).
Installation de NUT
Installation
Branchez le câble de communication (ici un cable USB) de l'onduleur et vérifiez qu'il est bien détecté
$ dmesg ... [60193.736139] usb 3-4: new low-speed USB device number 2 using xhci_hcd [60193.762985] generic-usb 0003:0665:5161.0004: hiddev0,hidraw3: USB HID v1.00 Device [INNO TECH USB to Serial] on usb-0000:00:14.0-4/input0
Installez nut
# apt-get install nut ... Les paquets supplémentaires suivants seront installés : libupsclient1 nut-client nut-server ...
Configuration
Configurez votre onduleur: Il existe toute sorte de drivers, il faudra trouver le bon...
ls /lib/nut apcsmart belkin bestuferrups clone everups ivtscd metasys newmge-shut powerpanel solis upscode2 apcsmart-old belkinunv bestups clone-outlet gamatronic liebert mge-shut oneac rhino tripplite usbhid-ups bcmxcp bestfcom blazer_ser dummy-ups genericups liebert-esp2 mge-utalk optiups richcomm_usb tripplitesu victronups bcmxcp_usb bestfortress blazer_usb etapro isbmex masterguard microdowell powercom safenet tripplite_usb
Ce fichier /usr/share/nut/driver.list contient une liste d'onduleurs et le driver qu'il faut utiliser.
Prolink n'est pas dans la liste (il ne doivent pas ouvrir les spécification de leur matériel...); Nous avons réussi à faire fonctionner notre PRO850VU avec le driver "blazer_usb"
Si vous n'êtes pas sur du port de communication, mettez le à: port = auto
# $editor /etc/nut/ups.conf ... [apc] driver = blazer_usb port = /dev/ttyS0 #port = auto ...
Ajoutez ensuite une règle à UDEV afin qu'il attribue ttyS0 (si c'est bien le port sur lequel est l'onduleur) au groupe nut:
# $editor /etc/udev/rules.d/99_nut-serialups.rules KERNEL=="ttyS0", GROUP="nut"
Rafraichissez UDEV
udevadm trigger udevadm control --reload-rules
Changez manuellement le groupe de ttyS0 (ce sera automatique au prochain demarrage):
chgrp nut /dev/ttyS0
Démarrez upsdrvctl afin de vérifier que votre configuration (dans ups.conf) est la bonne:
upsdrvctl start
Network UPS Tools - UPS driver controller 2.6.3 Network UPS Tools - Megatec/Q1 protocol USB driver 0.04 (2.6.3) Supported UPS detected with mustek protocol Vendor information unavailable Battery runtime will not be calculated (runtimecal not set)
Configurez nut.conf
# $editor /etc/nut/nut.conf MODE=standalone
Configuration pour upsmon:
# $editor /etc/nut/upsd.conf LISTEN 127.0.0.1 3493
# $editor /etc/nut/upsd.users [admin] password = motdepasse allowfrom = localhost upsmon master actions = SET instcmds = ALL
Configuration des alertes et actions
# $editor /etc/nut/upsmon.conf
# Network UPS Tools: example upsmon configuration # # This file contains passwords, so keep it secure. MONITOR apc@localhost 1 admin motdepasse master SHUTDOWNCMD "/sbin/shutdown -h now" HOSTSYNC 15 POWERDOWNFLAG /etc/nut/killpower FINALDELAY 5 NOTIFYCMD /sbin/upssched NOTIFYMSG ONBATT "%s is on battery" NOTIFYMSG ONLINE "%s is back online" NOTIFYMSG LOWBATT "%s has a low battery!" NOTIFYMSG SHUTDOWN "System is being shutdown!" NOTIFYFLAG ONLINE SYSLOG+EXEC NOTIFYFLAG ONBATT SYSLOG+EXEC NOTIFYFLAG LOWBATT SYSLOG+EXEC NOTIFYFLAG FSD SYSLOG+WALL+EXEC NOTIFYFLAG COMMOK SYSLOG+EXEC NOTIFYFLAG COMMBAD SYSLOG+EXEC NOTIFYFLAG SHUTDOWN SYSLOG+EXEC NOTIFYFLAG REPLBATT SYSLOG+EXEC NOTIFYFLAG NOCOMM SYSLOG+EXEC
Configurons l'arrêt:
# $editor /etc/nut/upssched.conf
LOCKFN /var/lib/nut/upssched.lock PIPEFN /var/lib/nut/upssched.pipe CMDSCRIPT /bin/upssched-cmd AT ONBATT * START-TIMER onbatt1 13 AT ONLINE * CANCEL-TIMER onbatt1 #AT ONBATT * START-TIMER earlyshutdown 30 #AT ONLINE * CANCEL-TIMER earlyshutdown AT ONBATT * START-TIMER onbattwarn 30 AT ONLINE * CANCEL-TIMER onbattwarn
Le point important est de vérifier sur votre système si la fichier upssched-cmd existe et s'il se trouve à l'endroit que vous avez indiqué dans upssched.conf S'il n'existe pas:
touch /bin/upssched-cmd chmod +x /bin/upssched-cmd
Préparez le démarrage automatique de upsd et upsmon (selon votre branche - Stable, Testing ou Unstable - il peut y avoir des variations dans les noms des scripts dans init.d)
# update-rc.d ups-monitor defaults Adding system startup for /etc/init.d/ups-monitor ... /etc/rc0.d/K20ups-monitor -> ../init.d/ups-monitor /etc/rc1.d/K20ups-monitor -> ../init.d/ups-monitor /etc/rc6.d/K20ups-monitor -> ../init.d/ups-monitor /etc/rc2.d/S20ups-monitor -> ../init.d/ups-monitor /etc/rc3.d/S20ups-monitor -> ../init.d/ups-monitor /etc/rc4.d/S20ups-monitor -> ../init.d/ups-monitor /etc/rc5.d/S20ups-monitor -> ../init.d/ups-monitor
Tests
Éteignez la machine, branchez l'onduleur et redémarrez:
/etc/init.d/ups-monitor restart && tail -f /var/log/syslog * Restarting Network UPS Tools [ OK ] Dec 5 12:00:19 laurent upsd[2404]: ACL in upsd.conf is no longer supported - switch to LISTEN Dec 5 12:00:19 laurent upsd[2404]: ACCEPT in upsd.conf is no longer supported - switch to LISTEN Dec 5 12:00:19 laurent upsd[2404]: REJECT in upsd.conf is no longer supported - switch to LISTEN Dec 5 12:00:19 laurent upsd[2404]: listening on 127.0.0.1 port 3493 Dec 5 12:00:19 laurent upsd[2404]: listening on ::1 port 3493 Dec 5 12:00:19 laurent upsd[2404]: Connected to UPS [apc]: blazer_usb-apc Dec 5 12:00:19 laurent upsd[2404]: allowfrom in upsd.users is no longer used Dec 5 12:00:19 laurent upsd[2405]: Startup successful Dec 5 12:00:19 laurent upsmon[2407]: Startup successful Dec 5 12:00:19 laurent upsd[2405]: User admin@127.0.0.1 logged into UPS [apc]
# /etc/init.d/ups-monitor status Checking status of Network UPS Tools * upsd is running * upsmon is running
# upsc -l apc
Vérification de l'état complet:
# /bin/upsc apc@localhost battery.voltage: 13.10 battery.voltage.nominal: 12.0 beeper.status: enabled device.type: ups driver.name: blazer_usb driver.parameter.pollinterval: 2 driver.parameter.port: /dev/ttyS0 driver.version: 2.6.3 driver.version.internal: 0.04 input.current.nominal: 3.0 input.frequency: 49.6 input.frequency.nominal: 50 input.voltage: 232.8 input.voltage.fault: 232.8 input.voltage.nominal: 230 output.voltage: 234.9 ups.delay.shutdown: 30 ups.delay.start: 180 ups.load: 9 ups.productid: 5161 ups.status: OL ups.type: offline / line interactive ups.vendorid: 0665
S'il manque la charge (comme c'est le cas ci-dessus, il faut préciser le minima et maxima du voltage de la batterie dans le fichier ups.conf:
[apc] driver = blazer_usb port = /dev/ttyS0 default.battery.voltage.high = 14 default.battery.voltage.low = 11
# /bin/upsc apc@localhost
battery.charge: 77 battery.voltage: 13.30 battery.voltage.high: 14 battery.voltage.low: 11 battery.voltage.nominal: 12.0 beeper.status: enabled device.type: ups driver.name: blazer_usb driver.parameter.pollinterval: 2 driver.parameter.port: /dev/ttyS0 driver.version: 2.6.3 driver.version.internal: 0.04 input.current.nominal: 3.0 input.frequency: 49.6 input.frequency.nominal: 50 input.voltage: 237.0 input.voltage.fault: 234.9 input.voltage.nominal: 230 output.voltage: 234.9 ups.delay.shutdown: 30 ups.delay.start: 180 ups.load: 8 ups.productid: 5161 ups.status: OL ups.type: offline / line interactive ups.vendorid: 0665
Vérifions si la commande d'arrêt fonctionne (Attention cela va arrếter la machine immédiatement...)
# /sbin/upsmon -c fsd
Vérifions si le "timer" fonctionne (débranchez le cable d'alimentation de l'onduleur - Rebranchez le quand l'alerte est passé dans les logs):
# tail -f /var/log/daemon.log | grep upssched Dec 5 15:23:33 sidlol upssched[28374]: Timer daemon started Dec 5 15:23:33 sidlol upssched[28374]: New timer: earlyshutdown (120 seconds) ... Dec 5 15:25:18 sidlol upssched[28374]: Cancelling timer: earlyshutdown Dec 5 15:25:31 sidlol upssched[28374]: Timer queue empty, exiting
Et observons les messages (broadcast) dans une console:
Diffusion de message de nut@laurent (somewhere) at 15:25 ... UPS apc@localhost on battery
Modifions le script-exemple (upssched-cmd) pour qu'il envoie la commande d’arrêt sur l'évènement onbattwarn:
#! /bin/sh # # This script should be called by upssched via the CMDSCRIPT directive. # # Here is a quick example to show how to handle a bunch of possible # timer names with the help of the case structure. # # This script may be replaced with another program without harm. # # The first argument passed to your CMDSCRIPT is the name of the timer # from your AT lines. case $1 in upsgone) logger -t upssched-cmd "The UPS has been gone for a while" ;; onbattwarn) logger -t upssched-cmd "Shutting down using: upsmon -c fsd" upsmon -c fsd ;; *) logger -t upssched-cmd "Unrecognized command: $1" ;; esac
Vous pouvez bien sur lancer la commande (ou le script) que vous souhaitez, envoyer un mail ou un message d'alerte par ejabberd, stopper un programme, etc.
Exemple: Lancer le script /usr/local/bin/stoptout.sh avant d'éteindre votre machine:
ARRET="/usr/local/bin/stoptout.sh" case $1 in upsgone) logger -t upssched-cmd "Systeme sur onduleur";; onbat30) logger -t upssched-cmd "Lancement script" $ARRET;; onbat60) logger -t upssched-cmd "Arret systeme avec: upsmon -c fsd" upsmon -c fsd;; *) logger -t upssched-cmd "Unrecognized command: $1";; esac
Et bien sur, testez!
# tail -f /var/log/syslog
... Dec 6 07:34:44 sidlol upsmon[3968]: apc@localhost is on battery Dec 6 07:34:44 sidlol upssched[16976]: Timer daemon started Dec 6 07:34:44 sidlol upssched[16976]: New timer: onbatt1 (13 seconds) Dec 6 07:34:44 sidlol upssched[16976]: New timer: onbattwarn (120 seconds) ... Dec 6 07:36:44 sidlol upssched[16976]: Event: onbattwarn Dec 6 07:36:44 sidlol upssched-cmd: Shutting down using: upsmon -c fsd Dec 6 07:36:44 sidlol upsmon[3968]: Signal 10: User requested FSD Dec 6 07:36:44 sidlol upsd[3890]: Client admin@127.0.0.1 set FSD on UPS [apc] Dec 6 07:36:44 sidlol upsmon[3968]: Executing automatic power-fail shutdown Dec 6 07:36:44 sidlol upsmon[3968]: System is being shutdown!
Surveiller l'onduleur par le réseau
Vous avez deux (ou plus) machines connectées à votre ondueleur ? Vous pouvez utiliser NUT pour surveiller (via le réseau) l'onduleur sur celles-ci:
Sur le serveur (la machine connectée à l'onduleur qui va surveiller celui-ci) modifiez les fichiers suivants:
# $editor /etc/nut/upsd.conf LISTEN 10.10.10.101 3493
# $editor /etc/nut/upsd.users [slave] password = motdepasse allowfrom = slaves upsmon slave
Sur le client:
# $editor /etc/nut/upsmon.conf
MONITOR apc@10.10.10.101 1 slave motdepasse slave SHUTDOWNCMD "/sbin/shutdown -h +0" HOSTSYNC 15 POWERDOWNFLAG /etc/killpower FINALDELAY 5 NOTIFYCMD /sbin/upssched NOTIFYMSG ONBATT "%s is on battery" NOTIFYMSG ONLINE "%s is back online" NOTIFYMSG LOWBATT "%s has a low battery!" NOTIFYMSG SHUTDOWN "System is being shutdown!" NOTIFYFLAG ONLINE SYSLOG+EXEC NOTIFYFLAG ONBATT SYSLOG+EXEC NOTIFYFLAG LOWBATT SYSLOG+EXEC NOTIFYFLAG FSD SYSLOG+WALL+EXEC NOTIFYFLAG COMMOK SYSLOG+EXEC NOTIFYFLAG COMMBAD SYSLOG+EXEC NOTIFYFLAG SHUTDOWN SYSLOG+EXEC NOTIFYFLAG REPLBATT SYSLOG+EXEC NOTIFYFLAG NOCOMM SYSLOG+EXEC
Relancez ups-monitor (ou nut-client et nut-server) sur le serveur et sur le client. Votre client est prêt à recevoir les alertes du serveur et s'éteindre si nécessaire.
#apt-get install nut-cgi ... Les paquets supplémentaires suivants seront installés : apache2 apache2-mpm-worker apache2-utils apache2.2-bin apache2.2-common libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap
Les dépendances sont importantes (Apache2). Si vous ne souhaitez pas installer Apache, préférez NUT-monitor
# $editor /etc/nut/hosts.conf MONITOR apc@localhost "Local Prolink"
# $editor /etc/apache2/sites-available/apache-nut.conf
ScriptAlias /nut /usr/lib/cgi-bin/nut <Directory /usr/lib/cgi-bin/nut> Deny from all Allow from 127.0.0.1 10.10.10.0 AllowOverride None Options ExecCGI </Directory>
# a2ensite apache-nut.conf && service apache2 restart Enabling site apache-nut.conf. To activate the new configuration, you need to run: service apache2 reload [ ok ] Restarting web server: apache2 ... waiting .
Vous devriez déjà avoir accès à la page Web de monitoring de nut:
Mais pas à la page de configuration...
Pour cela il faudra un peu de sécurité, sans quoi vous ne pourrez pas y accéder!
# $editor /usr/lib/cgi-bin/nut/.htaccess <Files upsset.cgi> deny from all allow from localhost </Files>
# $editor /etc/nut/upsset.conf ... I_HAVE_SECURED_MY_CGI_DIRECTORY
nut-monitor: Surveillance Web de votre onduleur via un GUI
# apt-get install nut-monitor ... Les paquets supplémentaires suivants seront installés : python-nut