Outils pour utilisateurs

Outils du site


nut

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

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:

  1. En dessous de 80% de charge, on “force shutdown”
  2. 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

  1. rw-r—– 1 root nut 127 2006-01-15 18:45 upsd.conf
  2. rw-r—– 1 root nut 95 2006-01-15 18:47 upsd.users
  3. rw-r—– 1 root nut 325 2006-01-15 18:57 upssched.conf
  4. rw-r—– 1 root nut 43 2007-09-06 15:21 ups.conf
  5. rw-r—– 1 root nut 334 2008-08-02 12:04 upsmon.conf

Sans oublier, dans /root/prod/nut :

  1. 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>
nut.txt · Dernière modification : 2012/03/01 14:42 de thierry