====== 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 ===== *http://www.networkupstools.org/ * http://www.rt74.eu/index.php?post/2008/06/23/Comment-installer-Nut-pour-un-onduleur-MGE-USB * 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 ACL admin2 ACL nagios 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 [[http://www.rt74.eu/index.php?post/2008/06/23/Comment-installer-Nut-pour-un-onduleur-MGE-USB|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 = ##allowfrom = localhost lan1 lan2 actions = SET instcmds = ALL upsmon master === upsmon.conf === MONITOR upscave@xencave 1 user 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 === {{:knutclient.png|KNutClient}}\\ http://www.knut.noveradsl.cz/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 [[serveur_xen#ttys0|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 = 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 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 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 -p ==== 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 -p upsrw -s ups.delay.shutdown=180 -u -p