Table des matières
Nut
Mise en garde
L'electricité, c'est un peu le souffle de la vie, pour des machines.
Les pilotes “series” et “usb” ne se comportent pas toujours comme attendu.
Par exemple, avec un pilote série:
ups.delay.shutdown=10
Ca coupe le jus dans les 10 secondes prochaines !
Dixit 'Arjen de Korte' : I assume you're using the 'mge-shut' driver, right? In this driver, the parameters are actually timer (not delay) values which will start running immediately after writing them. This is confusing at best. If you only want to change the delay values, you must use the 'ondelay' and 'offdelay' parameters in 'ups.conf'.
Mais pas sur un pilote USB: ca ne fait rien.
Jouer avec 'ondelay' ou 'offdelay' ne fait rien non plus.
De plus, il est vain de vouloir controler l'arret de l'onduleur lorsqu'on recoit un signal “LOWBATT”: c'est trop tard, vous avez 20 secondes (plus ou moins selon les onduleurs) pour arreter votre systeme.
Si votre système a besoin de 30 secondes de plus, c'est mort! Même s'il vous reste encore 30% de charge ou plus !
J'ai perdu beaucoup de temps autour de ces incohérences, et c'est bien dommage.
Dixit 'Arjen de Korte' : You should always do your setup (and testing) with a non-critical load connected. Testing with a live server is definitely not recommended, unless you've prepared your server to lose power unexpectedly.
Ok. Mais il faudrait aussi unifier le comportement de vos pilotes.
Liens
- Compatibilité: http://www.networkupstools.org/compat/stable.html
APC Smart-UPS RM 2U 1000VA
On a trouvé un Onduleur… mais comment le monitorer!
nut
Installer “nut”
# apt-get update # apt-get install nut
driver
Par le port série…
/etc/nut/ups.conf
Mettre dedans:
[smartups] driver = apcsmart port = /dev/ttyS0 desc = UPS filer5
test
# upsdrvctl start Network UPS Tools - UPS driver controller 2.0.4 Network UPS Tools (version 2.0.4) - APC Smart protocol driver Driver version 1.99.8, command table version 2.0 Detected Smart-UPS 1000 RM [AS0303211207(] on /dev/ttyS0
Yes !
Unable to open /dev/ttyS0: Permission denied |
Dans ce cas, on a peut être simplement oublié:
# adduser nut dialout
Afin que le user “nut” soi autorisé a utiliser le port serie!
Quand ca marche:
On peut arreter pour l'instant:
# upsdrvctl stop Network UPS Tools - UPS driver controller 2.0.4 Stopping UPS: smartups
Port USB
Non testé.
config
upsd
upsd.conf
ACL all 0.0.0.0/0 ACL localhost 127.0.0.1/32 ACL admin1 <IP_1> ACL admin2 <IP_2> ACL nagios <IP_3> ACCEPT localhost admin1 admin2 nagios REJECT all
Il faut donner l'ip avec le mask ! a.b.c.d/mask . Exemple: 10.20.12.34/32
daemon
Editer /etc/default/nut
, afin d'avoir:
# start upsd START_UPSD=yes
Retour sous shell:
# /etc/init.d/ups-monitor start Starting Network UPS Tools: upsdrvctl upsd.
test
# upsc smartups@localhost battery.alarm.threshold: 0 battery.charge: 100.0 battery.charge.restart: 00 battery.date: 01/15/03 battery.packs: 000 battery.runtime: 25080 battery.runtime.low: 120 battery.voltage: 27.67 battery.voltage.nominal: 024 driver.name: apcsmart driver.parameter.port: /dev/ttyS0 driver.version: 2.0.4 driver.version.internal: 1.99.8 input.frequency: 50.00 input.quality: FF input.sensitivity: H input.transfer.high: 253 input.transfer.low: 208 input.transfer.reason: S input.voltage: 228.9 input.voltage.maximum: 228.9 input.voltage.minimum: 227.5 output.voltage: 228.9 output.voltage.target.battery: 230 ups.delay.shutdown: 090 ups.delay.start: 000 ups.firmware: 618.3.I ups.id: UPS_IDEN ups.load: 000.0 ups.mfr: APC ups.mfr.date: 01/15/03 ups.model: Smart-UPS 1000 RM ups.serial: AS0303211207( ups.status: OL ups.temperature: 024.7 ups.test.interval: 1209600 ups.test.result: NO
C'est un bien vieille onduleur…
upsmon
Pas pour l'instant…
MGE
Par USB
J'ai suivit cette methode .
Packages
Pour APT:
# echo "deb http://opensource.mgeups.com/stable/debian binary/" >> /etc/apt/sources.list
Installer:
# apt-get update # apt-get install mgeups-psp nut
update 30/03/2009: Avec “lenny”, le package “nut” est suffisant ! |
On branche l'USB: entre le PC et l'onduleur:
# lsusb Bus 004 Device 002: ID 0463:ffff MGE UPS Systems UPS
Ok.
Tester pilote
On créé/modifie rapidement le fichier /etc/nut/ups.conf
pour avoir:
[upscave] driver = usbhid-ups port = auto desc = "MGE 1000" #vendorid = 0463
Et puis on test:
# upsdrvctl start Network UPS Tools - UPS driver controller 2.2.0- Network UPS Tools: 0.28 USB communication driver 0.28 - core 0.30 (2.2.0-) Detected a UPS: MGE UPS SYSTEMS/ELLIPSE Using subdriver: MGE HID 1.0
Mais j'ai surtout eu des erreurs… il a suffit que je débranche et rebranche l'USB, pour que ca marche.
Je n'ai plus eu d'erreur de ce genre par la suite: un reliquat de configuration “serie” devait parasiter l'USB ?
Mais surtout, ne pas oublier de faire:
# upsdrvctl stop Network UPS Tools - UPS driver controller 2.2.0-
Sinon, la suite va deconner…
Fichiers de config
# ls -lart /etc/nut -rw-r----- 1 root nut 3790 2008-08-03 00:31 ups.conf -rw-r----- 1 root nut 2118 2008-08-03 00:35 upsd.conf -rw-r----- 1 root nut 2322 2008-08-03 00:38 upsd.users -rwxr-xr-x 1 root root 1670 2008-08-03 13:50 upssched-cmd -rw-r----- 1 root nut 4611 2008-08-03 13:50 upssched.conf -rw-r----- 1 root nut 11928 2008-08-03 16:06 upsmon.conf
ups.conf
[upscave] driver = usbhid-ups port = auto desc = "MGE 1000" #vendorid = 0463
upsd.conf
Sous Squeeze:
LISTEN 0.0.0.0
Obsolete (ne plus utiliser) :
ACL all 0.0.0.0/0 ACL localhost 127.0.0.1/32 ACL lan1 192.168.0.0/24 ACL lan2 192.168.1.0/24 ACCEPT localhost lan1 lan2 REJECT all
upsd.users
[user] password = <MOT_DE_PASSE_SECRET> #<OBSOLETE>#allowfrom = localhost lan1 lan2 actions = SET instcmds = ALL upsmon master
upsmon.conf
MONITOR upscave@xencave 1 user <MOT_DE_PASSE_SECRET> master MINSUPPLIES 1 SHUTDOWNCMD "/sbin/shutdown -h +0" # TJ ----------------------------- # Ca coupe le courant a la toute fin. # D'aprés mes tests: ca ne casse pas le RAID . # Par contre: bien laissé le temps au "slave" de s'arreter! # ---------- POWERDOWNFLAG /etc/nut/killpower NOTIFYCMD /sbin/upssched POLLFREQ 5 POLLFREQALERT 5 HOSTSYNC 15 DEADTIME 15 NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC NOTIFYFLAG FSD SYSLOG+EXEC+WALL NOTIFYFLAG COMMOK SYSLOG+EXEC NOTIFYFLAG COMMBAD SYSLOG+EXEC NOTIFYFLAG SHUTDOWN SYSLOG+WALL+EXEC NOTIFYFLAG NOCOMM SYSLOG+EXEC RBWARNTIME 43200 NOCOMMWARNTIME 300 FINALDELAY 5
La plupart de ces lignes sont celles par defaut… J'ai surtout personnalisé le truc pour recevoir des mails sur l'etat de l'onduleur !
Le POWERDOWNFLAG
fonctionne, mais il faut bien ajuster les droits pour autoriser le daemon (nut) a creer un fichier dans /etc/nut
. Donc pour cela:
# cd /etc/nut # chown root:nut . # chmod 0770 .
est resté un mystere pour moi:
Alors que les scripts sont là (y compris /etc/init.d/halt
), impossible d'éteindre l'onduleur, au lieu d'eteindre le PC de par lui-même. Le fichier nommé par le flag POWERDOWNFLAG
n'est jamais créé…
D'aprés mes tests, il n'y a pas de problème avec un RAID. |
S'il y a des slaves, il faut qu'ils aient le temps de s'arreter. |
upssched.conf
CMDSCRIPT /etc/nut/upssched-cmd PIPEFN /var/run/nut/upssched.pipe LOCKFN /var/run/nut/upssched.lock AT ONBATT * START-TIMER onbatt 120 AT ONLINE * CANCEL-TIMER onbatt AT COMMBAD * START-TIMER upsgone 10 AT COMMOK * CANCEL-TIMER upsgone AT ONBATT * EXECUTE ups-on-batt AT ONLINE * EXECUTE ups-on-line AT LOWBATT * EXECUTE ups-low-batt AT SHUTDOWN * EXECUTE ups-shutdown AT NOCOMM * EXECUTE ups-no-comm
Nota : |
Depuis Lenny (et/ou la version de nut >1.2.1 ), c'est plutôt:
PIPEFN /var/run/nut/upssched/upssched.pipe LOCKFN /var/run/nut/upssched/upssched.lock
Avec en préalable:
# mkdir /var/run/nut/upssched # chown root:nut /var/run/nut/upssched # chmod g+sw /var/run/nut/upssched
upssched-cmd
new
NOUVEAU SCRIPT |
J'ai créé un nouveau script parce qu'a l'occasion de l'installation d'un slave (un “ReadyNAS Duo”), je me suis rendu compte que l'arret de l'onduleur est toujours effectué 20 secondes aprés le signal “LOWBATT”.
J'ai eu beau rechercher un moyen de changer cela: im-po-ssible. ⇒ Lorsque je recois un signal “LOWBATT”, l'onduleur coupe 20 secondes plus tard !
Ni le maitre, ni les slaves n'ont le temps de s'arreter en 20 secondes.
Donc, j'ai refait un scripte qui donne une dizaine de minutes de sursis avant l'arret volontaire et propre, du maitre et de ces esclaves.
Dans le même temps, ce script examine le pourcentage de charge des batteries de l'onduleur. Donc voici les nouvelles conditions:
- En dessous de 80% de charge, on “force shutdown”
- Aprés 12 minutes sur batterie, on “force shutdown”
( Le nom de mon onduleur est “upscave” … A adapter selon le votre. )
#! /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. NAME=`basename $0` MYBATTLOW="80" case $1 in # TJ ---------------------------- ups-on-batt) BATTCHARGE="$( upsc upscave battery.charge )" logger -t "$NAME" "Coupure de courant! Charge: $BATTCHARGE" echo "Coupure de courant a la cave! Charge: $BATTCHARGE" | mail -s "$NAME: $1" root@localhost if [ "$BATTCHARGE" -le "$MYBATTLOW" ]; then logger -t "$NAME" "Charge $BATTCHARGE : Arret maintenant." echo "Charge $BATTCHARGE : Arret maintenant." | mail -s "$NAME: $1" root@localhost /sbin/upsmon -c fsd fi ;; ups-on-line) logger -t "$NAME" "Retour du courant." echo "Retour du courant a la cave." | mail -s "$NAME: $1" root@localhost ;; onbatt|onbatt2|onbatt3|onbatt4|onbatt5) BATTCHARGE="$( upsc upscave battery.charge )" logger -t "$NAME" "Coupure de courant [ $1 ] - confirme ! Charge: $BATTCHARGE" echo "Coupure de courant a la cave!!! Charge: $BATTCHARGE" | mail -s "$NAME: $1" root@localhost if [ "$BATTCHARGE" -le "$MYBATTLOW" ]; then logger -t "$NAME" "Charge $BATTCHARGE : Arret maintenant." echo "Charge $BATTCHARGE : Arret maintenant." | mail -s "$NAME: $1" root@localhost /sbin/upsmon -c fsd fi ;; onbatt-fsd) BATTCHARGE="$( upsc upscave battery.charge )" logger -t "$NAME" "Coupure de courant - force shutdown ! Charge: $BATTCHARGE" echo "Coupure de courant a la cave!!! force shutdown ! Charge: $BATTCHARGE" | mail -s "$NAME: $1" root@localhost # stop au plus vite s'il y a une panne de jus /sbin/upsmon -c fsd ;; ups-low-batt) logger -t "$NAME" "Charge faible." echo "Charge batterie faible." | mail -s "$NAME: $1" root@localhost ;; ups-shutdown) logger -t "$NAME" "Shutdown en cours..." echo "Le Shutdown est en cours..." | mail -s "$NAME: $1" root@localhost ;; ups-fsd) logger -t "$NAME" "FSD en cours..." echo "Le FSD est en cours..." | mail -s "$NAME: $1" root@localhost ;; ups-no-comm) logger -t "$NAME" "Communication absente" echo "Il n'y a plus de communication avec l'onduleur..." | mail -s "$NAME: $1" root@localhost ;; # ------------------------------- upsgone) logger -t "$NAME" "The UPS has been gone for awhile" ;; *) logger -t "$NAME" "Unrecognized command: $1" # TJ ---------------------------- echo "UPS info: $1" | mail -s "$NAME: Unrecognized command" root@localhost # ------------------------------- ;; esac
Bien sur, il faut adapter upssched.conf
en conséquence:
# cat upssched.conf | egrep "^AT" AT ONBATT * START-TIMER onbatt 120 ; # 2 minutes AT ONLINE * CANCEL-TIMER onbatt AT ONBATT * START-TIMER onbatt2 240 ; # 4 minutes AT ONLINE * CANCEL-TIMER onbatt2 AT ONBATT * START-TIMER onbatt3 360 ; # 6 minutes AT ONLINE * CANCEL-TIMER onbatt3 AT ONBATT * START-TIMER onbatt4 480 ; # 8 minutes AT ONLINE * CANCEL-TIMER onbatt4 AT ONBATT * START-TIMER onbatt5 600 ; # 10 minutes AT ONLINE * CANCEL-TIMER onbatt5 AT ONBATT * START-TIMER onbatt-fsd 720 ; # 12 minutes : force shutdown AT ONLINE * CANCEL-TIMER onbatt-fsd AT COMMBAD * START-TIMER upsgone 10 AT COMMOK * CANCEL-TIMER upsgone AT ONBATT * EXECUTE ups-on-batt AT ONLINE * EXECUTE ups-on-line AT LOWBATT * EXECUTE ups-low-batt AT FSD * EXECUTE ups-fsd AT SHUTDOWN * EXECUTE ups-shutdown AT NOCOMM * EXECUTE ups-no-comm
Pour résumer:
Dans mon cas, lorsque je recois un signal “LOWBATT”, c'est que mon systeme va être coupé salement dans 20 secondes.
old
#! /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 # TJ ---------------------------- ups-on-batt) logger -t upssched-cmd "Coupure de courant!" echo "Coupure de courant a la cave!" | mail -s "upssched-cmd: $1" root@localhost ;; ups-on-line) logger -t upssched-cmd "Retour du courant." echo "Retour du courant a la cave." | mail -s "upssched-cmd: $1" root@localhost ;; onbatt) logger -t upssched-cmd "Coupure de courant - confirme !" echo "Coupure de courant a la cave!!!" | mail -s "upssched-cmd: $1" root@localhost ;; ups-low-batt) logger -t upssched-cmd "Charge faible." echo "Charge batterie faible." | mail -s "upssched-cmd: $1" root@localhost ;; ups-shutdown) logger -t upssched-cmd "Shutdown en cours..." echo "Le Shutdown est en cours..." | mail -s "upssched-cmd: $1" root@localhost ;; ups-no-comm) logger -t upssched-cmd "Communication absente" echo "Il n'y a plus de communication avec l'onduleur..." | mail -s "upssched-cmd: $1" root@localhost ;; # ------------------------------- upsgone) logger -t upssched-cmd "The UPS has been gone for awhile" ;; *) logger -t upssched-cmd "Unrecognized command: $1" # TJ ---------------------------- echo "UPS info: $1" | mail -s "upssched-cmd:Unrecognized command" root@localhost # ------------------------------- ;; esac
Demarrer
start daemon
Verifier que le fichier /etc/default/nut
contient:
# start upsd START_UPSD=yes # start upsmon START_UPSMON=yes
Et un petit coup de :
# /etc/init.d/nut start Starting Network UPS Tools: upsdrvctl upsd upsmon.
Verifions les logs:
# tail /var/log/syslog Aug 3 17:14:44 xencave usbhid-ups[4036]: Startup successful Aug 3 17:14:44 xencave upsd[4037]: listening on 0.0.0.0 port 3493 Aug 3 17:14:44 xencave upsd[4037]: Connected to UPS [upscave]: usbhid-ups-upscave Aug 3 17:14:44 xencave upsd[4038]: Startup successful Aug 3 17:14:44 xencave upsmon[4040]: Startup successful Aug 3 17:14:44 xencave upsd[4038]: Connection from 192.168.0.1 Aug 3 17:14:44 xencave upsd[4038]: Client user@192.168.0.1 logged into UPS [upscave]
Ok.
test
# upsc upscave@localhost battery.charge: 86 battery.charge.low: 30 battery.runtime: 2924 battery.type: PbAc driver.name: usbhid-ups driver.parameter.pollinterval: 2 driver.parameter.port: auto driver.version: 2.2.0- driver.version.data: MGE HID 1.0 driver.version.internal: 0.30 input.transfer.high: 264.0 input.transfer.low: 184.0 outlet.0.desc: Main Outlet outlet.0.id: 1 outlet.0.switchable: no outlet.1.desc: PowerShare Outlet 1 outlet.1.id: 2 outlet.1.status: on outlet.1.switchable: no output.voltage: 230.0 ups.beeper.status: enabled ups.delay.shutdown: -1 ups.delay.start: -10 ups.load: 6 ups.mfr: MGE UPS SYSTEMS ups.model: Ellipse 1000 ups.power.nominal: 1000 ups.productid: ffff ups.serial: 1H6F4304V ups.status: OL CHRG ups.vendorid: 0463
Knutclient
Bilan
Plus stable que la version sur port “serie”: J'avais des “lags” étrange et la configuration était mal foutu.
Par port série
Il s'agit d'une vieille methode. la version USB est plus mieux. |
# aptitude install nut
En fait, j'ai betement recopié des fichiers que j'avais déja…
Xen et ttyS0
Par défaut, Xen se réserve l'usage du port ttyS0
(COM1, pour les vieux).
Voir comment récuperer l'usage de ce port ici.
dialout
Autorisé le user nut
a utiliser le port ttyS0
!
Effectivement:
# id nut uid=105(nut) gid=105(nut) groupes=105(nut) # ls /dev/ttyS0 -lart crw-rw---- 1 root dialout 4, 64 2008-08-02 12:00 /dev/ttyS0
Donc:
# adduser nut dialout Ajout de l'utilisateur « nut » au groupe « dialout »... Terminé.
Les fichiers
- rw-r—– 1 root nut 127 2006-01-15 18:45 upsd.conf
- rw-r—– 1 root nut 95 2006-01-15 18:47 upsd.users
- rw-r—– 1 root nut 325 2006-01-15 18:57 upssched.conf
- rw-r—– 1 root nut 43 2007-09-06 15:21 ups.conf
- rw-r—– 1 root nut 334 2008-08-02 12:04 upsmon.conf
Sans oublier, dans /root/prod/nut
:
- rwxr-xr-x 1 root root 175 2008-08-02 11:08 upssched-tj
upsd.conf
# access-lists: ACL all 0.0.0.0/0 ACL localhost 127.0.0.1/32 ACL lan 192.168.0.0/24 # rights: ACCEPT localhost lan REJECT all
upsd.users
[user] password = <MOT_DE_PASSE_SECRET> allowfrom = localhost lan actions = SET instcmds = ALL upsmon master
upssched.conf
# generated by myself
CMDSCRIPT /root/prod/nut/upssched-tj PIPEFN /var/run/nut/upssched-tj.pipe LOCKFN /var/run/nut/upssched-tj.lock # TJ # Appele le script 'upssched-tj.pl' apres 120 s sur batterie # (sinon, ca coupera ulterieurement, sur fin batterie) AT ONBATT * START-TIMER shutdown 120 AT ONLINE * CANCEL-TIMER shutdown
ups.conf
[upscave] driver=mge-shut port=/dev/ttyS0
upsmon.conf
# define ups to monitor MONITOR upscave@localhost 1 user <MOT_DE_PASSE_SECRET> master # define the shutdown command SHUTDOWNCMD "/sbin/shutdown -h now" # TJ POLLFREQ 20 POLLFREQALERT 10 DEADTIME 60 NOTIFYCMD /sbin/upssched NOTIFYFLAG COMMOK SYSLOG NOTIFYFLAG COMMBAD SYSLOG NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC
/etc/aliases
Ajouter:
upscave: root
/root/prod/nut/upssched-tj
ce fichier est mal foutu. voir l'install USB plutot |
#!/bin/sh # actually send the shutdown signal to master (will broadcast to all slaves) # TJ : je desactive le shutdown programme sur timeout (sched...) # /sbin/upsmon -c fsd
(Sert plus a grand chose …?)
Bilan
Bof. Ca eteind la machine, alors que je voudrais que ca coupe le courant avant que le systeme eteigne la machine. (Sinon, la machine ne remonte pas quand le courant revient)
Tips
commandes
couper vite, mais proprement
Forcer l'arret du “maitre” comme si il y a avait eu une coupure de courant:
# upsmon -c fsd
La procedure “shutdown” est immédiatement engagé.
couper le jus
Couper le jus dans “X” secondes !
upsrw -s ups.delay.shutdown=10 -u user -p <MOT_DE_PASSE_SECRET> upscave@localhost
# /sbin/upsdrvctl shutdown
“X” est fonction de la conf de l'onduleur: généralement, 20 secondes.
oups !
A force de jouer, je me retrouve avec un onduleur avec ça:
battery.charge.low=10
Corriger comme ca:
$ upsrw -s battery.charge.low=30 -u <USER> -p <PASS> <UPS_NAME>
oups !!!!
Lorsque je recois un signal “LOWBATT” , même s'il reste 30% de charge, l'onduleur coupe dans les 20 secondes qui suivent.
Impossible de changer cela.
changer
upsrw -s battery.charge.low=30 -u <user> -p <pass> <ups_name>
upsrw -s ups.delay.shutdown=180 -u <user> -p <pass> <ups_name>