Publié le 02/09/2005 Dans Linux
1. Considérations générales su...
2. Application pratique
3. » Installation sous linux
4. Installation sous Windows
5. Affichage de l'état de l'UPS ...
6. Configuration avancée
7. Conclusion
2. Application pratique
3. » Installation sous linux
4. Installation sous Windows
5. Affichage de l'état de l'UPS ...
6. Configuration avancée
7. Conclusion
Installation sous linux
3.1. Préparation du systèmeIl faut savoir que le périphérique USB à gérer est de type "HID" (je l'ai découvert en voyant que le nom du driver à employer est "hidups"). Il faut donc impérativement que le noyau supporte ce type de matériel. Ayant une Debian installée encore avec le noyau par défaut 2.4.18-bf24, j'en ai profité pour passer au dernier kernel stable : 2.6.8.1 au moment où j'ai réalisé l'opération. J'ai intégré la gestion de l'USB en dur dans le noyau, et les périphériques USB de type "HID" en module. Il faudra alors ajouter le module "usbhid" au fichier /etc/modules pour qu'il soit chargé automatiquement au prochain démarrage (sinon taper "modprobe usbhid" pour le charger au moment voulu)
Au démarrage de l'ordinateur vous devriez voir un message montrant que votre UPS est détecté :
usbcore: registered new driver
hiddev hiddev96: USB HID v1.10 Device [American Power Conversion Back-UPS BR 800 FW:9.o2 .I USB FW:o2] on usb-0000:00:10.0-1
usbcore: registered new
driver usbhid drivers/usb/input/hid-core.c: v2.0:USB HID core driver
Ok, l'UPS est détecté correctement, mais maintenant il faut encore créer son pseudo-fichier dans /dev ! Eh non cela n'est pas fait automatiquement... Heureusement, l'aide dans le menu de configuration du noyau sur le module usbhid mentione un fichier /usr/src/linux/Documentation/usb/hiddev.txt dans lequel est indiquée la commande magique à taper :
mknod /dev/usb/hiddev0 c 180 96
Cela crée un périphérique en mode caractère ; en effet les données échangées entre l'ups et l'ordinateur sont des codes alphanumériques lisibles par tous.
3.2. Installation de NUT
Le produit n'étant pas livré avec les pilotes adéquats, j'ai choisi d'utiliser NUT (pour Network UPS Tools), dont voici le site vitrine :
http://www.networkupstools.org
C'est un logiciel libre développé par le célèbre fabricant d'UPS français Merlin-Gerin (MGE), mais qui se veut universel, c'est-à-dire fonctionnant avec la plupart des UPS du marché (liste ici). De plus il existe des packages intégrés dans la plupart des distributions classiques (formats RPM et Debian). J'ai donc choisi d'utiliser NUT, qui est un driver générique, et qui gère parfaitement la mise en réseau.
Sous Debian l'installation est extrêmement aisée, comme d'habitude. Nous aurons besoin, en plus du package de base, du package spécial pour l'usb (nut-usb) :
apt-get install nut nut-usb
Attention : il est indispensable d'utiliser des sources "testing" (ou "unstable") dans votre fichier sources.list pour avoir des versions récentes (ceux de la version "stable" sont obsolètes comme d'habitude), et d'autre part le package nut-usb est relativement récent et donc non encore intégré dans la branche "stable" officielle de la distribution.
L'installation se déroule sans problème, mais l'aspect configuration laisse à désirer : aucun fichier de configuration dans /etc/nut, aucun assistant ou même message d'information : il est impératif de lire la documentation dans /usr/share/doc/nut, ou de chercher sur le net... Heureusement ce tutoriel est là pour vous simplifier la tâche
NB : si vous possédez une autre distribution que Debian, vous aurez probablement un package spécifique pour celle-ci (en RPM par exemple), sinon vous pouvez installer NUT en compilant ses sources. Il y aura quelques différences par rapport aux autres distributions concernant la localisation des fichiers de configuration.
3.3. Configuration de NUT sur le serveur maître
NUT est composé de 2 démons : upsd et upsmon. Le premier (upsd) est le démon qui surveille l'UPS et fournit les informations à upsmon. Le second (upsmon) est le programme réseau qui se connecte au serveur (soit lui-même si on est sur la machine maître, soit distant si on est sur une machine esclave) pour connaître l'état de l'UPS et lancer les actions adéquates sur le système.
Lors du démarrage de NUT par le script Init-V /etc/init.d/nut start il faut lui préciser quel(s) démon(s) démarrer, ce qui se fait via le fichier /etc/default/nut :
# start upsd
START_UPSD=yes
# start upsmon
START_UPSMON=yes
START_UPSD=yes
# start upsmon
START_UPSMON=yes
Dans le cas du master, on démarre les 2.
Remarque : les fichiers de configuration que nous allons voir maintenant ont tous été créés par moi-même après l'installation, les commentaires en anglais sont les miens.
Il faut ensuite spécifier comment communiquer avec l'UPS, donc choisir le driver et le port adéquats, ce qui fait dans le fichier /etc/nut/ups.conf (à créer) :
# define the ups driver and the port where it's connected
[myups]
driver=hidups
port=/dev/usb/hiddev0
[myups]
driver=hidups
port=/dev/usb/hiddev0
Entre crochets on définit le nom qu'on veut donner à notre UPS, ici j'ai choisi tout simplement "myups". Ceci permettra de l'identifier plus tard, car NUT peut gérer plusieurs UPS.
On précise ensuite le pilote qui est "hidups" pour les UPS USB (n'importe quel modèle et marque supportés) et le périphérique auquel il est connecté : /dev/usb/hiddev0 créé précédemment.
A noter que si on veut utiliser un UPS série, il suffit de changer le port /dev/ttyS0 par exemple) et choisir le driver correspondant au modèle de l'onduleur (voir man ups.conf et man nutupsdrv).
On va maintenant configurer le démon réseau au niveau des accès via le fichier /etc/nut/upsd.conf (à créer) :
# access-lists:
ACL all 0.0.0.0/0
ACL localhost 127.0.0.1/32
ACL lan 192.168.1.0/24
# rights:
ACCEPT localhost lan
REJECT all
ACL all 0.0.0.0/0
ACL localhost 127.0.0.1/32
ACL lan 192.168.1.0/24
# rights:
ACCEPT localhost lan
REJECT all
Attention la syntaxe présentée est celle introduite à partir de la version 2.0.x. Si vous avez une version plus ancienne (1.4.x) vous devrez utiliser la syntaxe suivante pour les droits d'accès :
# rights:
ACCESS grant monitor localhost
ACCESS grant monitor lan
ACCESS deny all all
ACCESS grant monitor localhost
ACCESS grant monitor lan
ACCESS deny all all
Ce fichier définit les access lists (ACL) et les droits de chacune. Ici on autorise les accès depuis le poste local et le réseau local.
Nous définissons alors les utilisateurs et leur mot de passe pour pouvoir se connecter au démon par le fichier /etc/nut/upsd.users (à créer) :
# define the user rights according to the ACL in upsd.conf
[user]
password = mypassword
allowfrom = localhost lan
upsmon master
[user]
password = mypassword
allowfrom = localhost lan
upsmon master
Ici on définit les utilisateurs et mot de passe et leurs droits. Inutile de se compliquer la vie, un seul utilisateur est créé ici ayant tous les pouvoirs. "upsmon master" dit que cet utilisateur a le droit de se connecter sur le serveur maître pour contrôler l'UPS.
Reste maintenant à paramétrer la surveillance de l'UPS et les actions à exécuter dans /etc/nut/upsmon.conf (à créer) :
# define the ups to monitor and the permissions
MONITOR myups@localhost 1 user mypassword master
# define the shutdown comand
SHUTDOWNCMD "/sbin/shutdown -h now"
MONITOR myups@localhost 1 user mypassword master
# define the shutdown comand
SHUTDOWNCMD "/sbin/shutdown -h now"
On définit l'UPS à surveiller avec les login/password et on spécifie qu'on est ici en mode "master". Il est obligatoire de renseigner la commande exacte à exécuter pour éteindre proprement l'ordinateur, dans le paramètre "SHUTDOWNCMD".
Dernière chose à faire : lancer NUT par /etc/init.d/nut start
Et voilà ! L'UPS est ainsi configuré et fonctionnel. Pour s'en assurer, un coup d'oeil dans /var/log/daemon.log (car le programme n'est pas fort bavard à l'écran) :
Sep 23 18:47:52 srvtest hidups[712]: Startup successful
Sep 23 18:47:52 srvtest upsd[713]: Connected to UPS [myups]: hidups-hiddev0
Sep 23 18:47:52 srvtest upsd[714]: Startup successful
Sep 23 18:47:52 srvtest upsmon[716]: Startup successful
Sep 23 18:47:52 srvtest upsd[714]: Connection from 127.0.0.1
Sep 23 18:47:52 srvtest upsd[714]: Client user@127.0.0.1 logged into UPS [myups]
Sep 23 18:47:52 srvtest upsd[713]: Connected to UPS [myups]: hidups-hiddev0
Sep 23 18:47:52 srvtest upsd[714]: Startup successful
Sep 23 18:47:52 srvtest upsmon[716]: Startup successful
Sep 23 18:47:52 srvtest upsd[714]: Connection from 127.0.0.1
Sep 23 18:47:52 srvtest upsd[714]: Client user@127.0.0.1 logged into UPS [myups]
On voit ici en première ligne que le driver est correctement chargé, ce qu'on peut vérifier avec la commande suivante :
dmesg | grep hid
qui va afficher les messages de boot du noyau concernant le pilote "hid", ce qui nous donne comme résultat :
usbcore: registered new driver hiddev
hiddev96: USB HID v1.10 Device [American Power Conversion Back-UPS BR 800 FW:9.o2 .I USB FW:o2] on usb-0000:00:10.0-1
usbcore: registered new driver usbhid
drivers/usb/input/hid-core.c: v2.0:USB HID core driver
hiddev96: USB HID v1.10 Device [American Power Conversion Back-UPS BR 800 FW:9.o2 .I USB FW:o2] on usb-0000:00:10.0-1
usbcore: registered new driver usbhid
drivers/usb/input/hid-core.c: v2.0:USB HID core driver
Notre UPS est bel et bien détecté
Les lignes suivantes de daemon.log indiquent que les lancements du démon upsd et du monitoring réseau upsmon ont réussi également.
Une commande utile : upsc myups@localhost indique l'état courant de l'UPS spécifié :
battery.charge: 100
battery.chemistry: PbAc
battery.runtime: 1290
battery.voltage: 27.8
driver.name: hidups
driver.parameter.port: /dev/usb/hiddev0
driver.version: 2.0.1
ups.delay.shutdown: -1
ups.delay.start: 0
ups.load: 380
ups.mfr: American Power Conversion
ups.model: Back-UPS BR 800 FW:9.o2 .I USB FW:o2
ups.serial: QB0406247589
ups.status: OL
battery.chemistry: PbAc
battery.runtime: 1290
battery.voltage: 27.8
driver.name: hidups
driver.parameter.port: /dev/usb/hiddev0
driver.version: 2.0.1
ups.delay.shutdown: -1
ups.delay.start: 0
ups.load: 380
ups.mfr: American Power Conversion
ups.model: Back-UPS BR 800 FW:9.o2 .I USB FW:o2
ups.serial: QB0406247589
ups.status: OL
Le premier flag "battery.charge" indique la charge de la batterie, ici 100%. Le dernier flag "ups.status" indique ici "OL" ce qui signifie "on line", donc situation normale, tout est alimenté via le secteur. En cas de panne de courant l'alimentation se fait via la batterie de secours, il serait indiqué "OB" ("On Battery"). "ups.load" indique quant à lui la charge totale connectée à l'UPS, en VA (ici 380 VA).
Maintenant comment va réagir le système en cas de coupure de courant ? Le test peut être fait très facilement en débranchant la prise d'alimentation de l'UPS. Dans un premier temps il ne se passe strictement rien, l'UPS se contente de fournir du courant via la batterie de réserve, le PC continue à tourner. Par défaut, dans la configuration standard qu'on a faite, NUT attend que la batterie soit presque vide (ce qu'il détecte via l'état de l'UPS) pour déclencher l'extinction du système, ce qui survient immanquablement au bout d'un certain laps de temps. Le système exécute alors automatiquement un shutdown -h now et on voit tous les process s'éteindre les uns après les autres jusqu'à l'arrêt complet de la machine. L'UPS a rempli son rôle
Il se peut que la machine mette 5 secondes maximum avant de s'éteindre, ceci est dû à l'intervalle avec lequel le démon surveille l'état de l'UPS, qui est fixé à 5 secondes par défaut.
Pour éviter d'avoir à attendre et vider la batterie pour les tests, il existe une commande à taper sur le serveur :
upsmon -c fsd
Cette commande envoit directement le signal "force shutdown" qui sera propagé à tous les esclaves et provoquera l'extinction de toutes les machines concernées, master y compris.
3.4. Configuration de NUT sur le serveur esclave
La configuration côté slave est beaucoup moins fastidieuse. Déjà, il ne faut installer que le package nut, nut-usb n'est pas nécessaire ici, puisque nous serons informé de l'état de l'UPS par le réseau.
Dans /etc/default/nut :
# start upsd
START_UPSD=no
# start upsmon
START_UPSMON=yes
START_UPSD=no
# start upsmon
START_UPSMON=yes
On ne démarre que le démon upsmon ici, upsd n'est nécessaire que sur la machine branchée physiquement au câble USB de l'UPS (c'est-à-dire le master).
Un seul fichier de configuration est nécessaire : /etc/nut/upsmon.conf (à créer)
# define the ups to monitor and the permissions
MONITOR myups@192.168.1.5 1 user mypassword slave
# define the shutdown comand
SHUTDOWNCMD "/sbin/shutdown -h now"
MONITOR myups@192.168.1.5 1 user mypassword slave
# define the shutdown comand
SHUTDOWNCMD "/sbin/shutdown -h now"
On indique ici l'adresse IP du serveur et le mot "slave" à la place de "master". Le reste est identique au fichier de configuration vu précédemment dans le cas du master.
Il suffit de démarrer NUT par /etc/init.d/nut start et taper upsc 192.168.1.5 (ip du serveur) pour tester et on obtient à l'écran l'état de l'UPS !
Et si on simule une panne de courant les 2 ordinateurs s'éteindront maintenant automatiquement, le serveur ayant donné le signal à tous les esclaves qui lui sont connectés.