Le HOWTO des onduleurs (UPS) <author>Harvey J. Stein, <tt/hjstein@math.huji.ac.il/, Berger Financial Research, Ltd. <date>v1.3, 16 April 1995 adaptation française B.Choppy, 8 juillet 1995 <abstract> Ce document vous aidera à connecter un onduleur sur une machine Linux... si vous avez de la chance ... Copyright (c) 1994 by Harvey J. Stein. Vous pouvez utiliser ce document comme vous l'entendez, tant qu'il reste intact. En particulier, cette note (ainsi que les contributions ci-dessous) doit rester intouchée. NdT~: La traduction de ce HOWTO est particulierement délicate, en ce qu'il integre de nombreux messages échangés sur InterNet reproduits à l'identique. Autant que possible, on aura conservé la présentation générale de ces messages, ainsi que leur signification (y compris parfois une tournure inélégante ou un mot-à-mot désagréable), au détriment de la traduction intégrale et de l'utilisation de tournures plus courantes en Français. Dans certains cas, une partie en anglais est conservée, en particulier dans les en-têtes de messages. Les noms de signaux et broches de connexion ont été traduits, mais leur abréviation originelle conservé (par exemple, DCD~: Détection de porteuse). Une copie de la notice originale de copyright est conservée. Le traducteur prie les lecteurs de bien vouloir l'excuser de ces désagréments. (version originale conservée volontairement) You may use this document as you see fit, as long as it remains intact. In particular, this notice (along with the contributions below) must remain untouched. </abstract> <toc> <sect>Introduction <p> Ce HOWTO concerne la connexion d'un onduleur sur un PC sous Linux. L'idée est d'établir la connexion de telle sorte que Linux puisse s'arrêter proprement lorsque le courant s'arrête. Dans une large mesure, ce document est redondant, car toutes les informations de base sont contenues dans la page de man powerd livrée avec le paquetage SysVinit. De tout façon, il semble qu'il y ait périodiquement de nombreuses discussions sur le Net concernant la connexion de PC Linux à des onduleurs (et les versions de Linux que j'ai installées ne comportaient pas de page de man powerd). J'ai pensé qu'il pourraît être une bonne idée de faire un HOWTO, car~: <itemize> <item>Une seconde source d'informations peut aider à la compréhension de la méthode de connexion de Linux à un onduleur, même s'il s'agit simplement de la même information, écrite différemment. <item>Le HOWTO peut servir de repository pour les données spécifiques des onduleurs. <item>Le HOWTO contient des détails supplémentaires qui ne se trouvent pas dans la page de man de powerd. </itemize> Quoi qu'il arrive, ceci ne remplace pas la page de man de powerd. Espérons qu'après avoir lu les deux, les gens seront à même de se débrouiller avec les onduleurs. <sect1>Contributeurs <p> Je suis débiteur à vie de ceux dont j'ai reçu de l'aide, des suggestions, ainsi que des données spécifiques d'onduleurs. La liste inclut, dans l'ordre d'apparition dans ce document~: <itemize> <item>Miquel van Smoorenburg (miquels@cistron.nl.mugnet.org) <item>Danny ter Haar (danny@caution.cistron.nl.mugnet.org) <item>Hennus Bergman (hennus@sky.nl.mugnet.org) <item>Tom Webster (webster@kaiwan.com) <item>Marek Michalkiewicz (ind43@sun1000.ci.pwr.wroc.pl) <item>Christian G. Holtje (docwhat@uiuc.edu) <item>Ben Galliart (bgallia@orion.it.luc.edu) <item>Lam Dang (angit@netcom.com) </itemize> <sect1>Avertissement important <p> Je ne peux réellement pas garantir que quelque partie de ceci fonctionne pour vous. Connecter un onduleur à un ordinateur peut être un travail d'astuce. L'un ou l'autre, ou les deux peuvent brûler, exploser, mettre le feu, ou commencer la Troisième Guerre Mondiale. De plus, j'ai seulement une expérience directe de l'onduleur Advice 1200~A, et je n'ai pas eu à fabriquer de câble. Donc, <em>SOYEZ PRUDENT, RASSEMBLEZ TOUTE L'INFORMATION POSSIBLE SUR VOTRE ONDULEUR. REFLECHISSEZ D'ABORD, NE CROYEZ PAS A PRIORI CE QUE VOUS LISEZ ICI</em>. Par ailleurs, j'ai fait en sorte de tout faire fonctionner avec mes onduleurs, sans beaucoup d'informations des constructeurs, et sans faire fumer quoi que ce soit, donc c'est possible. <sect1>Autres documents <p> Ce document ne traite pas des fonctions et possibilités générales des onduleurs. Pour ce genre d'informations, voyez la Foire Aux Questions UPS.faq, disponible en FTP anonyme sur navigator.jpl.nasa.gov (128.149.23.82) dans <tt>pub/doc/faq/UPS.faq</tt>, et qui peut probablement âtre trouvée quelque part sur rtfm.mit.edu. Elle est maintenue par Nick Christenson (npc@minotaur.jpl.nasa.gov). Par E-mail avec lui, il souhaiterait qu'apparaisse <tt/UPS/ ou <tt/UPS FAQ/ ou quelque chose de similaire dans la ligne Subject de votre message. <sect>Que devez-vous faire (sommairement) ? <p> <itemize> <item>Branchez le PC sur l'onduleur. <item>Connectez le port série du PC à l'onduleur avec un câble spécial. <item>Lancez powerd sur le PC. <item>Configurez votre initd pour faire quelque chose de raisonnable lors des événements powerfail et powerok (comme démarrer un shutdown et tuer tous les shutdown en cours, respectivement, par exemple). </itemize> <sect>Comment est-ce supposé fonctionner~? <p> <descrip> <tag/Travail de l'onduleur/ Lorsque le courant s'arrête, l'onduleur continue d'alimenter le PC et signale l'arrêt du courant par bascule d'un relais ou d'un optocoupleur sur son port de contrôle. <tag/Travail du câble/ Le câble est conçu de telle manière que lorsque l'onduleur bascule ledit relais, cela monte un signal de contrôle particulier de la ligne série (typiquement, DCD, Détection de Porteuse) <tag/Travail de powerd/ Powerd contrôle le port série. Il maintient levés/baissés les signaux de contrôle du port série dont l'onduleur a besoin (typiquement, DTR, Terminal de Données Prêt, doit rester levé, et touts les signaux qui coupent l'onduleur doivent être maintenues baissés). Lorsque powerd voit le signal de contrôle de l'onduleur monter, il écrit <tt/FAIL/ dans <tt>/etc/powerfail</tt> et envoie un signal <tt/SIGPWR/ au process initd. Lorsque le signal de contrôle redescend, il écrit <tt/OK/ dans <tt>/etc/powerfail</tt> et envoie un signal <tt/SIGPWR/ à initd. <tag/Travail de initd (en plus de tout ce qu'il fait par ailleurs)/ Lorsqu'il reçoit un signal <tt/SIGPWR/, il regarde dans <tt>/etc/powerfail</tt>. Si celui-ci contient <tt/FAIL/, il exécute l'entrée <tt/powerfail/ du fichier <tt>/etc/inittab</tt>. S'il contient <tt/OK/, il exécute l'entrée <tt/powerokwait/ de <tt/inittab/. </descrip> <sect>Où obtenir le logiciel approprié~? <p> La dernière fois que j'ai regardé, le paquetage à prendre était <tt>/pub/Linux/system/Daemons/SysVinit-2.50.tgz</tt> sur sunsite.unc.edu ou un miroir. Il inclut une copie de powerd.c, shutdown.c et initd qui comprend le signal <tt/SIGPWR/ et interprète correctement les entrées powerfail et powerokwait du fichier inittab. Evidemment, maintenant, je suis sûr que de nouvelles versions sont disponibles. Quoi que vous ayez peut différer de la description présentée ici, mais adhèrera probablement à la philosophie générale du système. <sect>Comment configurer tout ça~? <p> Ce qui suit présuppose que vous disposez d'un câble qui fonctionne correctement avec powerd.c. Si vous n'êtes pas sûr de cela, voyez la section~: id="hacking" name="Analyse de câbles et modification de powerd.c"> pour toute information sur les câbles mal décrits et la reconfiguration de wtt/powerd/. Les sections <ref id="serial-port" name="Assignement des broches du port série"> et <ref id="ioctl" name="Correspondance entre ioctl et RS232"> seront aussi utiles. Si vous devez fabriquer un câble, voyez la section~: <ref id="make-cable" name="Comment réaliser un câble~?"> pour les détails généraux, et la sous-section de~: <ref id="ups-specific" name="Informations sur un certain nombre d'onduleurs"> qui se rapporte à votre onduleur. Cette dernière peut aussi contenir des informations sur les câbles fournis par le constructeur. Vous voudrez probablement lire toute la section <ref id="ups-specific" name="Informations sur un certain nombre d'onduleurs"> car chaque section contient quelques détails supplémentaires généralement utiles. <itemize> <item>Editez <tt>/etc/inittab</tt>. Placez-y quelque chose de ce genre~: <verb> # Que faire si le courant s'arrete (arreter le systeme et vider la batterie) pf::powerfail:/etc/powerfailscript +5 # Si le courant revient avant la fin du shutdown, arreter celui-ci pg:0123456:powerokwait:/etc/powerokscript </verb> <item>Ecrivez les scripts <tt>/etc/powerfailscript</tt> et <tt>/etc/powerokscript</tt> pour arrêter le système après cinq minutes, ou mener toute action appropriée, et tuer le shutdown en cours, respectivement. En fonction de votre version de shutdown, cela sera, soit si trivial que vous n'aurez même pas à écrire de script, soit un script d'une ligne bash, quelque chose du genre~: <verb> kill `ps -aux | grep "shutdown" | grep -v grep | awk '{print $2}'` </verb> et vous conserverez les scripts (au cas où cela ne vous arriverait pas dans un parfait état, la première apostrophe sur la ligne ci-dessus est une quote inversée, la seconde et la troisième sont des apostrophes, et la dernière est aussi une quote inversée). <item>Dites à initd de relire le fichier inittab avec~: <verb> telinit q </verb> <item>Editez rc.local pour lancer powerd lors du lancement. Syntaxe~: <verb> powerd <ligne> </verb> Remplacez <tt><ligne></tt> par le port série modem sur lequel sera connecté l'onduleur, comme~: <tt>/dev/cua1</tt>. <item>Connectez le port série du PC à celui de l'onduleur. NE BRANCHEZ PAS ENCORE LE PC SUR L'ONDULEUR. <item>Branchez une lampe sur l'onduleur. <item>Allumez l'onduleur et la lampe. <item>Lancez powerd. <item>Testez la configuration~: <itemize> <item>Débranchez l'onduleur. <itemize> <item>Contrôlez que la lampe reste allumée. <item>Contrôlez que <tt>/etc/powerfailscript</tt> est lancé. <item>Contrôlez que le shutdown est lancé. </itemize> <item>Rebranchez l'onduleur. <itemize> <item>Contrôlez que la lampe reste allumée. <item>Contrôlez que <tt>/etc/powerokscript</tt> est lancé. <item>Contrôlez que <tt>/etc/powerfailscript</tt> n'est pas lancé <item>Contrôlez que le shutdown est bien arrêté. </itemize> <item>Redébranchez l'onduleur. Laissez-le débranché et vérifiez que le PC s'arrête proprement dans un délai correct. <item><bf/La Partie Délicate./ Une fois que tout semble correct, arrêtez le PC et branchez-le sur l'onduleur. Lancez un script qui synchronise le disque dur toutes les secondes ou à peu près (sync). Simultanément, lancez un second script qui exécute un find sur votre disque entier. Le premier sert à rendre l'opération plus sûre, et le second, à consommer le maximum de puissance. Maintenant, tirez sur la prise de l'onduleur, vérifiez une fois de plus que le PC est lancé, et attendez. Assurez-vous que le PC s'arrête correctement avant que la batterie soit vide. C'est dangereux, car si la batterie n'assure pas le délai d'arrêt du PC, vous pouvez vous retrouver avec un système de fichiers corrompu, et peut-être même la perte de tous vos fichiers. Vous voudrez probablement réaliser une sauvegarde complète avant ce test, et positionner le délai de shutdown très court pour commencer. </itemize> </itemize> Félicitations~! Vous avez maintenant un PC sous Linux protégé par onduleur qui va s'arrêter proprement lors d'une coupure de courant~! <sect>Améliorations Utilisateur <p> <itemize> <item>Trifouillez <tt/powerd.c/ pour suivre la ligne indiquant un faible niveau de batteries. Dans ce cas, exécutez un shutdown <bf/immédiat/. <item>Modifiez la procédure de shutdown, afinq que, lorsqu'elle s'exécute dans des conditions de coupure de courant, elle éteigne l'onduleur après avoir effectué tout le nécessaire. </itemize> <sect><heading><label id="make-cable">Comment réaliser un câble~?</> <p> Cette section est juste composée de messages que j'ai vus sur le Net. Je ne l'ai pas réalisé, donc je ne peux parler d'expérience. Si quelqu'un le peut, qu'il écrive cette section pour moi :). Voir aussi le message concernant le GPS1000 dans la section <ref id="gps1000" name="GPS1000 d'ACCODATA"> <verb> >From miquels@caution.cistron.nl.mugnet.org Wed Jul 21 14:26:33 1993 Newsgroups: comp.os.linux Subject: Re: Interface onduleur pour Linux~? From: miquels@caution.cistron.nl.mugnet.org (Miquel van Smoorenburg) Date: Sat, 17 Jul 93 18:03:37 Distribution: world Organization: Cistron Electronics. Dans l'article <1993Jul15.184450.5193@excaliber.uucp> joel@rac1.wam.umd.edu (Joel M. Hoffman) ecrit~: >Je ne vais pas tarder a acheter un onduleur, et ai remarque que certains >d'entre eux ont des interfaces reseau pour prevenir celui-ci lorsque le >courant est coupe. > >Y a-t-il une telle interface pour Linux~? > >Merci.. > >-Joel >(joel@wam.umd.edu) > Lorsque je travaillais sur la derniere version de SysVinit (2.4 actuellement), j'ai eu temporairement un onduleur sur mon ordinateur, donc j'ai ajoute le support de celui-ci. Vous l'avez peut-etre vu que dans le dernier fichier d'en-tete <signal.h>, il y a maintenant un #define SIGPWR 30 :-). Malgre tout, je n'avais pas une telle interface speciale, mais la sortie de nombreux onduleurs est juste un relais qui s'ouvre ou se ferme en cas de coupure de courant. J'ai reflechi a une methode simple pour connecter ca sur la ligne DCD du port serie. Dans le paquetage SysVinit, il y a un demon appele "powerd" qui garde un oeil sur cette ligne serie et envoie SIGPWR a init lorsque l'etat change, pour qu'init puisse faire quelque chose (comme arreter le systeme dans les 5 minutes). La methode de connexion de l'onduleur a la ligne serie est decrite dans le source "powerd.c", mais je vais le dessiner ici pour explications~: +------------------------o DTR | +---+ | | resistance | | 10 kilo-Ohm | | +---+ Vers le port serie | +-----o-------+------------------------o DCD | | o relais | \ de l' | \ onduleur | | | +-----o-------+------------------------o GND Joli dessin, hein~? J'espère que cela peut etre utile. SysVinit peut etre trouve sur sunsite (et tsx-11 probablement) dans SysVinit2.4.tar.z Mike. -- Miquel van Smoorenburg, <miquels@cistron.nl.mugnet.org> Ibmio.com: cannot open CONFIG.SYS: file handle broke off. >From danny@caution.cistron.nl.mugnet.org Wed Jul 21 14:27:04 1993 Newsgroups: comp.os.linux Subject: Re: Interface onduleur pour Linux~? From: danny@caution.cistron.nl.mugnet.org (Danny ter Haar) Date: Mon, 19 Jul 93 11:02:14 Distribution: world Organization: Cistron Electronics. Dans l'article <9307174330@caution.cistron.nl.mugnet.org> miquels@caution.cistron.nl.mugnet.org (Miquel van Smoorenburg) ecrit : >La methode de connexion de l'onduleur a la ligne serie est decrite dans le >source "powerd.c", mais je vais le dessiner ici pour explications~: Le dessin n'etait pas vraiment claire, utilisez plutot celui-ci~! > > +------------------------o DTR > | > +---+ > | | resistance > | | 10 kilo-Ohm > | | > +---+ Vers le port serie > | > +-----o-------+------------------------o DCD > | > o relais > \ de l' > \ onduleur > | > +-----o--------------------------------o GND > Le DTR est maintenu haut. Lorsque le courant de l'onduleur s'arrete, le relais se ferme. L'ordinateur controle la descente de la ligne DCD. Lorsque cela arrive, il lance une sequence shutdown... _____ Danny -- <=====================================================================> Danny ter Haar <dannyth@hacktic.nl> or <danny@cistron.nl.mugnet.org> Robins law #103: 'a couple of lightyears can't part good friends' </verb> <sect><heading><label id="hacking">Analyse de câbles et modification de powerd.c</> <p> Essayez d'obtenir la documentation des câbles que votre revendeur d'onduleurs fournit. En particulier, recherchez~: <itemize> <item>Quelles lignes doivent être maintenues hautes. <item>Quelle(s) ligne(s) éteint(gnent) l'onduleur. <item>Quelles lignes l'onduleur modifie pour indiquer que~: <itemize> <item>Le courant est coupé. <item>La batterie est faible. </itemize> </itemize> Il vous faut ensuite modifier powerd.c en conséquence. Si vous avez des problèmes pour obtenir les informations précitées, ou si vous voulez juste les contrôler (une <em/bonne/ idée), le programme suivant peut vous y aider. C'est une version inversée de powerd.c. Il vous permet de positionner les signaux du port depuis la ligne de commande, puis il contrôle le port, en affichant l'état des signaux chaque seconde. Je l'ai utilisé en "upscheck /dev/cua1 2" (par exemple) pour monter le deuxième bit (DTR) et descendre les autres. Le nombre en base 2 indique les bits à monter, ainsi par exemple pour monter les bits 1, 2 et 3 (et descendre les autres), utilisez 7. Voir le code pour les détails. Voici le programme (non testé) upscheck.c. Il n'est pas testé car j'ai modifié la version que j'avais utilisée au départ pour le rendre plus clair, et que je ne peux tester la nouvelle version pour le moment. <tscreen><code> /* * upscheck Controle comment l'ordinateur et l'onduleur communiquent * * Usage: upscheck <device> <bits a monter> * Par exemple, upscheck /dev/cua4 4 pour monter le bit 3 et * controler /dev/cua4. * * Author: Harvey J. Stein <hjstein@math.huji.ac.il> * (mais en realite juste une modification mineure de Miquel van * Smoorenburg's <miquels@drinkel.nl.mugnet.org> powerd.c * * Version: 1.0 19940802 * */ #include <sys/types.h> #include <sys/ioctl.h> #include <fcntl.h> #include <errno.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <signal.h> /* Programme principal. */ int main(int argc, char **argv) { int fd; /* Ces parametres TIOCM_* sont definis dans <linux/termios.h>, qui */ /* est inclus indirectement ici. */ int dtr_bit = TIOCM_DTR; int rts_bit = TIOCM_RTS; int set_bits; int flags; int status, oldstat = -1; int count = 0; int pc; if (argc < 2) { fprintf(stderr, "Usage: upscheck <device> <bits-a-positionner>\n"); exit(1); } /* Ouvre le device a controler. */ if ((fd = open(argv[1], O_RDWR | O_NDELAY)) < 0) { fprintf(stderr, "upscheck: %s: %s\n", argv[1], sys_errlist[errno]); exit(1);} /* Recupere les bits a positionner sur la ligne de commande */ sscanf(argv[2], "%d", &ero;set_bits); while (1) { /* Positionne les bits specifies sur la ligne de commande (et */ /* seulement eux). */ ioctl(fd, TIOCMSET, &ero;set_bits); fprintf(stderr, "Positionnement de %o.\n", set_bits); sleep(1); /* Recupere les bits actuellement positionnes */ ioctl(fd, TIOCMGET, &ero;flags); fprintf(stderr, "Les signaux sont %o.\n", flags); /* Piochez ici en changeant TIOM_CTS par un autre TIOCM jusqu'a */ /* ce que le programme detecte que le courant est coupe lorsque */ /* vous debranchez l'onduleur. Ensuite, vous saurez comment */ /* modifier powerd.c */ if (flags & TIOCM_CTS) { pc = 0 ; fprintf(stderr, "Le courant est la.\n"); } else { pc = pc + 1 ; fprintf(stderr, "Le courant est coupe.\n"); } } close(fd); } </code></tscreen> <sect><heading><label id="serial-port">Assignement des broches du port série</> <p> La section qui précède présuppose la connaissance de la correspondance entre les signaux de terminal et les broches du port série. Voici une référence de cette correspondance, reprise du document de David Tal~: <GSRGAAO@TECHNION.BITNET> ``Câbles et connecteurs fréquemment utilisés''. J'inclus un diagramme illustrant les connecteurs, et une table donnant la corresopondance entre les numéros de broches et les signaux de ligne de terminal. <table> <tabular ca="|l|l|l|l|l|l|l|"> DB-25 | DB-9 | Nom | EIA | CCITT | DTE-DCE| Description @ Broche| Broche| | | | | @ <hline> 1 | | FG | AA | 101 | --- |Masse de chassis GND@ 2 | 3 | TD | BA | 103 | ---> |Données transmises, TxD@ 3 | 2 | RD | BB | 104 | <---| Données reçues, RxD@ 4 | 7 | RTS | CA | 105 | ---> |Requête pour envoyer@ 5 | 8 | CTS | CB | 106 | <---| Prêt à envoyer@ 6 | 6 | DSR | CC | 107 | <---| Jeu de données prêt@ 7 | 5 | SG | AB | 102 | ---- |Masse de signal, GND@ 8 | 1 | DCD | CF | 109 | <---| Détection de porteuse@ 9 | | -- | -- | - | - |Tension positive continue de test@ 10 | | -- | -- | - | - |Tension négative continue de test@ 11 | | QM | -- | - | <---| Mode d'égalisation@ 12 | | SDCD | SCF | 122 | <---| Détection de porteuse secondaire@ 13 | | SCTS | SCB | 121 | <---| Prêt à envoyer secondaire@ 14 | | STD | SBA | 118 | ---> |Données transmise secondaires@ 15 | | TC | DB | 114 | <---| Signal d'horloge de l'émetteur@ 16 | | SRD | SBB | 119 | <---| Signal d'horloge secondaire du récepteur@ 17 | | RC | DD | 115 | ---> |Signal d'horloge du récepteur@ 18 | | DCR | -- | - | <---| Horloge divisée du récepteur@ 19 | | SRTS | SCA | 120 | ---> |Requête pour émettre secondaire@ 20 | 4 | DTR | CD | 108.2| ---> |Terminal de données prêt@ 21 | | SQ | CG | 110 | <---| Détection de qualité de signal@ 22 | 9 | RI | CE | 125 | <---| Indicateur de sonnerie@ 23 | | -- | CH | 111 | ---> |Sélecteur de vitesse de données@ 24 | | -- | CI | 112 | <---| Sélecteur de vitesse de données@ 25 | | TC | DA | 113 | <---| Horloge transmise@ </tabular> <caption> Assignement des broches de port série (RS-232C), DB-25 et DB-9 </caption> </table> <code> 1 13 1 5 _______________________________ _______________ \ . . . . . . . . . . . . . / \ . . . . . / Connecteurs \ . . . . . . . . . . . . / \ . . . . / RS-232 vus de --------------------------- ----------- l'arrière de 14 25 6 9 l'ordinateur DTE : Equipement terminal de données (i.e. ordinateur) DCE : Equipement de communication de données (i.e. modem) RxD : Données reçues; 1 est transmis "bas", 0 "haut" TxD : Données envoyées; 1 est transmis "bas", 0 "haut" DTR : DTE annonce qu'il est alimenté et prêt à communiquer DSR : DCE annonce qu'il est prêt à communiquer; "bas" raccroche le modem RTS : DTE demande à DCE la permission d'envoyer des données CTS : DCE agrée la RTS RI : DCE indique au DTE qu'il tente d'établir une connexion DCD : DCE annonce qu'une connexion est établie </code> <sect><heading><label id="ioctl">Correspondance entre ioctl et RS232</> <p> Puisque vous pouvez aussi devoir modifier powerd.c pour monter et descendre les signaux corrects, vous pouvez aussi avoir besoin des valeurs numériques des différents signaux de terminal. Ils peuvent être trouvés dans <tt>/usr/include/linux/termios.h</tt>, mais sont reproduits ici comme référence. Puisqu'ils peuvent être sujets à changements, vous auriez avantage à les vérifier avec ledit fichier. <tscreen><code> /* lignes modem */ #define TIOCM_LE 0x001 #define TIOCM_DTR 0x002 #define TIOCM_RTS 0x004 #define TIOCM_ST 0x008 #define TIOCM_SR 0x010 #define TIOCM_CTS 0x020 #define TIOCM_CAR 0x040 #define TIOCM_RNG 0x080 #define TIOCM_DSR 0x100 #define TIOCM_CD TIOCM_CAR #define TIOCM_RI TIOCM_RNG </code></tscreen> Notez que la troisième colonne est en hexadécimal. <sect><heading><label id="ups-specific">Informations sur un certain nombre d'onduleurs</> <p> Cette section contient des informations spécifiques de certains onduleurs. Ce que je souhaiterais serait de disposer des informations sur le port de contrôle de l'onduleur (ce que fait chaque broche et ce qu'elle attend qui soit fait), sur le câble fourni par le constructeur (ce qu'il connecte et où), ainsi qu'une version modifiée de powerd.c qui fonctionne avec l'onduleur. Ce que j'ai actuellement est une description à peu près complète de chaque onduleur. Je voudrais essayer d'affiner chaque information, mais comme je ne peux tester chaque onduleur, il est difficile de décider exactement de ce qui est nécessaire. De plus, chaque onduleur semble avoir quelques trucs supplémentaires qui sont bien décrits par les auteurs de chaque section. Ainsi, pour l'heure, je laisse tout en place. Tout pour un HOWTO épais. <bf/Veuillez m'envoyer vos expériences pour les inclure ici./ <sect1>Expériences générales. <p> J'ai conservé les commentaires des gens, mais n'ai pas encore obtenu la permission de les inclure ici. Voici un sommaire général de ce que j'ai entendu dire. APC: Ne donneront pas d'informations sur leur mode "intelligent" sans votre signature d'un accord de non-diffusion. Donc, les gens sont forcés d'utiliser leurs onduleurs "intelligents" en mode "idiot", comme souligné plus bas. Tripp Lite: Une personne a dit que Tripp ne diffuserait pas non plus d'information. Upsonic: Quelqu'un a dit qu'Upsonic a discuté de détails techniques au téléphone, répondu aux questions par fax et est serviable en général. <sect1>Advice 1200 A <p> Onduleurs d'Advice Electronics, Tel Aviv, Israël (Tout leur matériel porte une étiquette à leur nom). Spécification des broches du port de contrôle. <itemize> <item>2 - Coupure de courant. <item>5 - Batterie faible. <item>6 - Extinction de l'onduleur. <item>4 - Masse commune des broches 2, 5 et 6. </itemize> Ils m'ont aussi donné le dessin suivant qui ne m'a servi à rien, mais peut vous être utile si vous souhaitez fabriquer vous-même un câble~: <tscreen><code> 2 ----------+ | \ \| |-------------- /| \/ <--- Le "\/" indique le type de ce | transistor. J'ai oublié ce que | cela veut dire, mais ce n'est +-----+ pas fondamental. / / / 5 ----------+ | \ \| |-------------- /| \/ | | +-----+ / / / +------------- | / 10K |/ 6 --\/\/\/--| |\ \/ | | +-----+ / / / 4 ----------+ | | +-----+ / / / </code></tscreen> Câble fourni Ils m'ont d'abord donné un câble qui appartenait à un paquetage DOS de contrôle de l'onduleur appelé RUPS. Je l'ai utilisé pour les tests. Une fois ceux-ci satisfaisants, ils m'ont donné un câble qu'ils utilisent pour les serveurs Netware connectés à des onduleurs. Il fonctionnait à l'identique. Voici les détails~: <itemize> <item>DTR - Alimentation du câble (powerd.c doit le monter). <item>CTS - Courant présent (descend quand le courant est coupé). <item>DSR - Batterie faible (descend lorsque la batterie faiblit). <item>RTS - Extinction de l'onduleur (à monter pour éteindre). </itemize> (Le powerd.c inclus dans SysVinit place ou laisse RTS haut, causant l'arrêt de l'onduleur immédiatement lors du lancement de powerd~!) <sect1><heading><label id="gps1000">GPS1000 d'ACCODATA</> <p> <tscreen><verb> >From hennus@sky.nl.mugnet.org Thu Mar 10 15:10:22 1994 Newsgroups: comp.os.linux.help Subject: Re: auto-shutdown avec un onduleur From: hennus@sky.nl.mugnet.org (Hennus Bergman) Date: Tue, 1 Mar 1994 22:17:45 GMT Distribution: world Organization: The Organization For Removal Of On-Screen Logos Dans l'article <CRAFFERT.94Feb28125452@nostril.lehman.com>, Colin Owen Rafferty <craffert@nostril.lehman.com> ecrit : >Je suis prêt à acheter un onduleur pour ma machine, et j'en >voudrais un qui sache faire un "auto-shutdown". > Je viens d'en acheter un vraiment pas cher :-) C'est un GPS1000 d'ACCODATA. Tout le monde connaît la bonne qualite de leur production (je n'ai pas d'actions chez eux :-() ? >Je suppose que tous ont une sorte de connexion serie qui previent le >systeme de cela. > Je l'ai pris à part pour trouver comment il fonctionnait. Il y avait trois optocoupleurs (deux sorties, une entree) connectes sur un connecteur à 9 broches à l'arriere. L'un s'allume lorsque le courant est coupe, et s'eteint lorsque ce dernier revient. Durant ce temps, on peut utiliser l'"entree" pour arreter la batterie (il relache le relais de puissance). Le troisieme est une sorte d'acquittement de la commande d'arret. Je pense que l'interface de mon onduleur a ete concue pour etre connectee a des niveaux TTL, mais avec quelques resistances il peut etre connecte a un port serie. Il est branche de telle sorte qu'avec un port RS-232 on ne puisse utiliser les deux optocoupleurs de sortie; mais l'acquittement de la commande d'arret n'est pas vraiment necessaire. On peut se conten- ter de celui qui est important (Notez qu'il est possible de faire fumer la partie transistor des optocoupleurs avec des niveaux RS-232 si on le branche mal). ;-) J'esperais etre capable de le connecter a mon port de jeux inutilise, mais ce dernier n'a pas de sortie, n'est-ce pas~? Je vais probablement finir par mettre un port parallele supplementaire pour ca. Tous les onduleurs n'utilisent pas d'optocoupleurs, certains se contentent de simple relais, qui sont moins difficiles a connecter, mais bien sur, pas aussi `elegants'. >Quelqu'un a-t-il ecrit un paquetage qui surveille l'onduleur et effectue >un shutdown (ou similaire) lorsque le courant s'arrete ? SysVinit-2.4 (et probablement 2.5 aussi bien) a un demon `powerd' qui surveille le port serie en continu et previent init quand CD (Detection de porteuse) tombe. Init active ensuite un shutdown avec un delai. Si le courant revient apres quelques minutes, le shutdown est arrete. Tres beau. Le seul probleme que j'aie eu avec est qu'il ne dit pas a l'onduleur de s'arreter lorsque le shutdown est fini. Il attend simplement la avec une invite root. Je vais probablement ecrire un petit program pour l'arreter >depuis /etc/brc. RSN. > Colin Rafferty, Lehman Brothers <craffert@lehman.com> Hennus Bergman </verb></tscreen> <sect1>TrippLite BC750LAN (Standby UPS) <p> <tscreen><verb> From: Tom Webster <webster@kaiwan.com> To: hjstein@MATH.HUJI.AC.IL (Harvey J. Stein) Subject: Re: SOS - Powerd & onduleurs - SOS Date: Mon, 8 Aug 1994 12:26:09 -0700 (PDT) Harvey, Tout d'abord, laisse-moi dire que la lecture de ton HOWTO m'a beaucoup plu. C'est à peu pres ce que j'esperais voir devenir mon document. J'ai ecrit mon pseudo-HOWTO tard dans la nuit, car je continuais à voir le message "Puis-je connecter un onduleur à Linux...", à peu pres une fois par mois dans c.o.l.*. Le mien traite specifiquement de la connexion d'un modele particulier d'onduleur (series TrippLite BCxxx/LAN) sur une machine Linux et de l'adaptation de powerd à ce cas. Il necessite quelques ameliorations, les choses etant un peu bidouillees. Maintenant que je l'ai poste trois ou quatre fois en reponse aux question, je recois finalement quelques feedback (qui trouvent ces erreurs). Les problemes que je lui connais jusqu'a present sont : La version correcte de SysVinit est 2.4 et non 2.04. Il y a certains arguments concernant la necessite d'une ou plusieurs resistances dans mon cable. Le seul endroit ou j'aie vu que ce serait necessaire est sur l'extinction de l'inverseur, pour etre sur de ne pas envoyer une trop forte tension dans l'onduleur. Pour le circuit de detection, je ne vous pas pourquoi un equipement DTE ne peut admettre de voir son signal boucle vers lui-meme. Tout ce que je fais est de connecter une ligne qui est maintenue haute sur le signal Detection de porteuse. Je dois etre un peu plus clair sur le fonctionnement de l'onduleur lorsqu'il entre en mode coupure de courant. Les TrippLite fournissent _et_ un circuit ouvert _et_ un circuit ferme en cas de coupure de courant, deux broches differentes et une broche de masse commune. Ainsi tout ce que j'ai a faire est de brancher une broche maintenue haute sur la ligne Detection de porteuse et de la router sur le circuit ouvert sur coupure de l'onduleur, pour faire tomber la detection de porteuse. Je pense que cela trompe quelque personnes qui ont lu la description de Miquel van Smoorenburg d'un onduleur qui fournit seulement un circuit ferme sur coupure de courant, et necessite un cable beaucoup plus complique. Voila, c'est tout ce a quoi je pense pour l'instant. Je prevois de regarder si mon cable continue a fonctionner si j'insere des resistance dans tous les circuits. Si c'est le cas, je ferai les modifications dans mon document, que tu devrais trouver ce week-end. Tom ---------------- De Linux et les onduleurs [ou comment connecter un onduleur TrippLite BCXXXLAN] par Tom Webster <webster@kaiwan.com> 05/20/94 (Version 1.0) 1.0 Introduction J'ai bataille sur la connexion d'un TrippLite BC750LAN (onduleur autonome) sur ma machine Linux il y a a peu pres six mois. Puisque j'ai vu differentes demandes sur ce sujet, je le mets sous un format relativement stable afin de n'avoir qu'a l'envoyer lorsque la question reapparait. 1.1 Les Resultats Lorsque le courant est coupe dans mon appartement, les choses suivantes se passent : 1. L'onduleur bascule son inverseur et l'ordinateur commence à fonctionner sur l'onduleur. L'alarme de l'onduleur commence a retentir. Si le courant revient, l'onduleur re-bascule son inverseur et retourne sur le secteur. Rien d'autre n'arrive, sauf que l'alarme s'arrete. 2. Si le courant est coupe depuis 15 a 30 secondes, le systeme envoie en message aux utilisateurs (par wall) et commence un shutdown (pour arreter) dans les cinq minutes. Si le courant revient, le shutdown est abandonne, et un message explicatif est envoye aux utilisateurs (par wall). 3. Pendant que le systeme est en phase de shutdown, son dernier acte doit etre d'eteindre l'onduleur, pour couper le courant du systeme. Cela est fait apres le umount des disques, et est realise pour eviter que le systeme arrete consomme de la puissance de l'onduleur. 4. Quand le courant secteur revient, le systeme redemarre normalement. Le BC750 a suffisamment de jus pour maintenir mon systeme en fonction un certain temps, donc pourquoi l'eteins-je apres seulement cinq minutes ? La reponse se trouve dans quelques regles pifometriques (elles peuvent varier chez vous) : a. Si le courant baisse ou s'arrete, 90% des fois ce sera pour 0 a 2 minutes. b. Si cela dure plus longtemps, c'est que ca durera entre une demi-heure et cinq heures. c. Si cela dure un moment (voir b), le courant va revenir et repartir au moins une fois pendant que l'entreprise d'electricite travaille sur la ligne (le courant reviendra pour 5 a 45 secondes, puis s'arretera a nouveau). Donc, j'ai configure mon systeme pour couvrir la majorite des coupures que j'ai, sans tenter de tenir celles qui durent vraiment longtemps. J'ai aussi garde une grosse reserve dans l'onduleur pour gerer les situations d'aller-retour. 1.2 Avertissement Je ne fait aucune garantie d'aucune sorte sur la fiabilite ou la securite induites par mon avis. C'est ainsi que mon systeme est configure, et autant que je puisse le dire, il fonctionne bien pour moi. Votre configuration peut necessiter des differrences pour correspondre a vos besoins, en particulier si vous utilisez differents types d'onduleurs. 2.0 Materiel Dans le cas de mon onduleur, j'ai pense que l'interface RS-232 etait, quelque part, mal nommee. Je pensais que l'onduleur envoyait et recevait des donnees, comme lorsque l'on communique avec un modem avec les commandes "AT". Ce n'etait pas le cas. Il semble qu'elle s'appelle RS-232 parce qu'elle est batie dans les limites des specifications RS-232 en termes de tension et de limites de signaux. Pour communiquer avec l'onduleur, vous devez pouvoir detecter les changements d'etat de certaines lignes et changer l'etat de certaines autres. Le fait que ces lignes puissent n'avoir rien en commun avec les lignes que votre systeme puisse s'attendre a utiliser, s'il communiquait avec un modem ou une imprimante, explique probablement pourquoi votre onduleur necessite des cables speciaux pour permettre aux logiciels (y compris ceux du constructeur) de communiquer avec l'onduleur. Au travers d'essais et d'erreurs avec un boitier de brassage RS-232, j'ai pu definir un diagramme de cable pour relier l'onduleur a l'ordinateur. Veuillez noter que je l'ai realise sans regarder le cable officiel TrippLite et que celui-ci peut etre different. Onduleur Systeme DB-25 DB-25 1 <--------------> 1 Masse 2 <--------------> 4 Coupure de secteur 8 <--------------> 8 Circuit de detection 3 <--------------> 2 Inverseur d'arret 20 <--------------> 22 Circuit Une fois le cable broche ainsi, branchez simplement le cote onduleur sur celui-ci et le cote systeme sur un port serie libre de votre machine. Vous aurez vraisemblablement a vous debrouiller avec des adaptateurs 9->25 et 25->9 pour faire aller votre cable, mais vous devriez pouvoir gerer cela avec un bon magasin d'informatique. 3.0 Logiciel Le logiciel que j'utilise est disponible pour les utilisateurs de Linux et se trouve sur de nombreuses distributions (SLS et Slackware au minimum). Cette configuration a fonctionne pour moi sur les noyaux 0.99.9, 0.99.14 et 1.0. 3.1 Init System V Ce paquetage est necessaire pour faire fonctionner le tout. Si vous utilisez encore le paquetage "Init simple", il est peut-être temps d'envisager la mise a jour. La version que j'utilise est 2.04, et je crois que Miquel van Smoorenburg est l'auteur du paquetage. 3.2 powerd powerd est le demon du courant, par defaut il surveille le changement d'etat de la ligne DCD et indique ces changements au systeme par le mecanisme du signal. Le source de powerd est fourni dans le paquetage Init System V. Compilez-le, deplacez-le dans un repertoire de binaires (je l'ai mis dans /sbin sur mon systeme), et modifiez votre script rc.local pour lancer le demon. La partie correspondante de mon rc.local a l'allure suivante : ----- couper ici ----- # Ajoute le support de l'onduleur echo "Demarrage du demon powerd..." if [ -x /sbin/powerd ]; then /sbin/powerd /dev/cua4 fi ----- couper ici ----- 3.3 inittab Votre inittab doit etre modifie pour gerer correctement les signaux que powerd enverra s'il y a une coupure secteur. Les lignes correspondantes de mon inittab ont l'allure suivante : ----- couper ici ----- # Quoi faire si le courant est coupe (passer en mono-utilisateur) pf::powerfail:/sbin/shutdown -f +5 "THE POWER IS FAILING" # Si le courant revient, abandonner le shutdown en cours. pg:0123456:powerokwait:/sbin/shutdown -c "THE POWER IS BACK" # Si le courant revient en mono-utilisateur, passer en multi-utilisateur. ps:S:powerokwait:/sbin/init 2 ----- couper ici ----- 3.4 rc.0 (brc) En fonction de la configuration de votre systeme, l'un des scripts rc.0 ou brc est execute immediatement avant le shutdown. Ces scripts prennent soin de diverses choses, comme demonter les disques ou autre nettoyage de derniere minute. Le circuit de l'inverseur de shutdown est concu pour signaler un shutdown a un inverseur lorsque des donnees sont envoyees sur la ligne DTR. Dans mon cas, j'ai juste transmis un court fichier sur le port serie (/etc/passwd car j'etais sur de toujours le trouver la). Mon rc.0 est comme ci-dessous, notez qu'il est surtout conservateur, le sync peut etre supprime et les delais de sleep peuvent probablement etre affines, mais cela fonctionne, donc je ne m'y suis pas plus interesse. ----- couper ici ----- #! /bin/sh # # brc Ce fichier est execute par init(8) lors du shutdown du # systeme (i.e. place en niveau de fonctionnement 0). # Habituellement, il s'occupe de demonter tous les systemes # de fichiers non indispensables. # # Version: @(#)/etc/brc 2.01 02/17/93 # # Auteurs: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org> # Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> # # Modifie : 01/15/94 - Ajout du support de shutdown d'inverseur # Tom Webster <webster@kaiwan.com> PATH=/sbin:/bin:/usr/sbin:/usr/bin echo Descente des systemes de fichiers... sync umount -a sleep 2 cat /etc/passwd > /dev/cua4 sleep 5 echo Done. ----- couper ici ----- (Sur mon onduleur, l'inverseur fonctionne seulement lorsque le courant est coupe, donc cela ne pose pas de probleme d'envoyer le signal d'arret a chaque shutdown) 4.0 Conclusion Bien, c'est ainsi que j'ai branche mon onduleur TrippLite sur mon Linux. N'hesitez pas a m'envoyer un mot avec le resultat de vos tentatives, en particulier si vous avez des ameliorations. :-> From: Tom Webster <webster@kaiwan.com> To: hjstein@MATH.HUJI.AC.IL (Harvey J. Stein) Subject: Re: SOS - Powerd & onduleurs - SOS Date: Thu, 11 Aug 1994 12:20:50 -0700 (PDT) Harvey, > Comme j'essayais de le dire, powerd peut simplement lancer shutdown > directement dans un evenement de baisse de batterie, de telle sorte > qu'init n'ait pas besoin de s'en occuper ni d'etre modifie - pas de > nouveau signal necessaire. Bien que cela viole la belle separation > des taches de powerd et init, c'est plus facile que d'ajouter un > nouveau signal. Ou penses-tu seulement a une autre commande ? Quelque > chose comme avoir powerok/powerfail/powerfailnow en tant que commandes > d'inittab qui s'executent lorsque SIGPWR est recu et que /etc/powerfail > contient OK/FAIL/LOWBATT (respectivement). Cela serait plsu propre, > mais de faire executer shutdown -r now a powerd est evident a faire, > et peut aussi bien etre fait - la logique serait la meme quelle que > soit l'action prise par powerd lors de la baisse de batterie. Pour > l'instant, il peut simplement lancer shutdown, et lorsqu'init sera > modifie, il pourra ecrire LOWBATT dans /etc/powerfail (ou quel que soit > le nom de ce fichier) et envoyer SIGPWR a init. Je voudrais ajouter la commande LOWBATT, ce serait plus propre ainsi. J'ai juste besoin de jeter un coup d'oeil au code et de voir quelle serait la difficulte de l'ajouter. Je dois aussi regarder mon branchement, je pense que cela pourrait vouloir dire que j'aie a faire passer mon systeme par la procedure entiere de descente pour un test final (une fois que je penserai qu'il fonctionne). Tom From: Tom Webster <webster@kaiwan.com> To: hjstein@MATH.HUJI.AC.IL (Harvey J. Stein) Subject: Re: SOS - Powerd & onduleurs - SOS Date: Mon, 15 Aug 1994 09:46:06 -0700 (PDT) Harvey, Eh bien, j'ai passe a peu pres tout mon week-end a prendre des mesures au multimetre pour les comparer a la documentation de mon onduleur. Les seules conclusions auxquelles je sois arrivee sont : 1. Mon systeme a fonctionne 8 a 9 mois maintenant. S'il avait du faire fumer quelque chose, ce serait deja fait. 2. Si mon succes est fonde sur les defauts de mon port serie (j'ai une carte STB 4COM), je n'ai aucun moyen de le verifier sur mon systeme. Je devrai laisser le probleme a quelque pauvre ame du Net. 3. Autant que je puisse dire, la seule justification de la resistance de 10 kohm dans le diagramme de Miquel etait de maintenir la ligne plus haut que DCD, meme apres la mise a la masse du circuit. 4. Le seul circuit qui doive faire autre chose que d'etre change par l'onduleur (le circuit de shutdown de l'inverseur) contient une resistance de 40 kohm (a l'interieur de l'onduleur). Cela doit eviter tout probleme. 5. Le circuit de Miquel fonctionne pour une detection de coupure de courant, et peut etre extrapole pour inclure le circuit de batterie faible. Si mon circuit s'avere inutilisable pour d'autres, il necessitera plus de soudures que je ne voudrais en faire dans un cable. Par ailleurs, j'en ai eu assez ce matin et ai commande un cable chez TrippLite. J'ai commande le cable LanTastic/LAN Manager/Win NT, c'est juste un cable (9M-9F) sans logiciel. Cela va m'economiser environ 40 dollars (le cable PC Unix (avec logiciel) est a environ 140 dollars). La motivation de cela etait triple : (1) Sous un an, je vais probablement utiliser Windows 4.0 ou Windows NT 3.50 (j'ai ete beta-site 3.1) et les deux supporteront le controle d'onduleur (je sais que NT le fait et j'ai vu l'icone de gestion de l'energie sur un bureau Windows 4.0 dans un magazine d'informatique). (2) Mon cable actuel ne sera compatible avec aucun autre logiciel de gestion pour d'autres OS (sauf chance extraordinaire), et travailler avec un cable connu (et j'espere qu'il sera bientot standard ?) sur un powerd modifie peut elargir l'audience. (3) Je peux toujours analyser le cable pour voir si TrippLite inclut une certaine securite dans ses cables. Il devrait etre la d'ici une semaine ou a peu pres. En attendant, je vais commencer a regarder dans powerd pour inclure LOWBATT. Tom </verb></tscreen> <sect1>APC Backup-UPS <p> Il semble qu'il y ait une certaine controverse sur la fiabilite des informations indiquees ici sur les APC Back-UPS. Donc, soyez prudent. Je preface cette section avec un message d'avertissement que j'ai recu. Il peut ne pas prendre tout son sens tant que le reste de la section n'est pas lu, mais ainsi, au moins vous aves plus de chances de le voir. Et, a nouveau, comme je n'ai aucun onduleur APC, je ne peux verifier la fiabilite d'aucun de ces messages. <sect2>Un message d'avertissement <p> <tscreen><verb> From ind43@sun1000.ci.pwr.wroc.pl Sun Oct 9 11:00:42 1994 Newsgroups: comp.os.linux.admin Subject: BUPS-HOWTO warning From: ind43@sun1000.ci.pwr.wroc.pl (Marek Michalkiewicz) Date: 6 Oct 1994 18:38:15 GMT Organization: Technical Univeristy of Wroclaw NNTP-Posting-Host: ci3ux.ci.pwr.wroc.pl X-Newsreader: TIN [version 1.2 PL2] Si vous voulez connecter un onduleur APC Back-UPS sur votre Linux, ce qui suit peut vous interesser. Il y a un bon BUPS-HOWTO qui decrit comment le faire. Mais il a un "bug". Le signal RTS du port serie est utilise pour arreter l'onduleur. Celui-ci ne s'arretera que s'il travaille sur sa batterie. Le manuel indique que le le signal d'arret doit durer au moins 0,5ms. Mais un temps inferieur est suffisant, au moins pour mon APC Back-UPS 600. L'utilisation de RTS est dangereux, car ce dernier est monte a l'ouverture du device. Le programme backupsd le redescend ensuite, mais il reste haut un moment. Cela coupe le courant lors du premier lancement de backupsd s'il y a une coupure secteur a ce moment. Cela peut arriver par exemple lorsque l'onduleur est eteint, et que le courant revient pour un moment. Soit il faut lancer backupsd avant de monter les systemes de fichiers en lecture/ecriture, soit (mieux) utiliser TX (broche 3) plutot que RTS (broche 7) pour eteindre l'onduleur (la numerotation est pour un DB-9). Utilisez ioctl(fd, TCSBRKP, 10); pour monter TX pendant une seconde, par exemple. L'utilisation de TX doit etre sure. Je posterai peut-etre les diff si le temps me le permet... -- Marek Michalkiewicz ind43@ci3ux.ci.pwr.wroc.pl </verb></tscreen> <sect2>BUPS-HOWTO <p> Luminated Software Group Presente HOWTO utilisation d'onduleurs de secours (d'APC) (pour proteger votre Linux) Version: 1.01 BETA Document de : Christian G. Holtje <docwhat@uiuc.edu> Information de cablage et aide : Ben Galliart <bgallia@orion.it.luc.edu> Traduction : Bernard Choppy <bernard.choppy@alias.fdn.fr> Ce document est place dans le Domaine Public a une condition. Celle-ci est que ce qui appartient a Cesar revienne a Cesar. Modifiez ceci autant que vous voulez, rappelez juste que nous avons travaille dessus. ******************************************************************************* Attention ! Ni moi, ni aucun de ceux qui on ecrit ou aide a ce document, ne garantissons quoi que ce soit pour ces textes/sources/indications. Si quoi que ce soit est endommage, nous n'y sommes POUR RIEN ! Cela fonctionne POUR AUTANT QUE NOUS LE SACHIONS, mais nous pouvons avoir fait des erreurs. Donc, soyez prudent ! ******************************************************************************* NdT : Ce document contient des references de pieces detachees Radio-Shack, qui etaient vendues par le reseau Tandy en France. Ce reseau n'existe plus, mais la reference peut tout de meme etre utile. Ok, vous venez juste d'acheter (ou vous allez le faire) un Back-UPS d'APC (d'autres pourront peut-etre tirer quelque chose de ces informations, avec peu ou pas de modifications, mais nous ne savons pas). Vous avez jete un coup d'oeil au prix du couple logiciel/cable Power-Chute, et n'etes pas sur que le jeu en vaille la chandelle. Bien, j'ai fait mon propre cable, et mon propre logiciel et je les utilise pour eteindre automatiquement mon Linux lors d'une coupure secteur. Vous savez quoi ? vous pouvez aussi ! *** Le Cable *** C'etait la partie la plus difficile a imaginer (je m'y connais peu en hardware, donc Ben a fait le plus gros du travail). Pour en fabriquer un, vous devez acheter ce qui suit chez votre marchand d'electronique local : <tscreen><verb> 1 connecteur a souder subminiature male DB-9 [Radio Shack cat. no. 276-1537c] 1 connecteur a souder subminiature femelle DB-9 [Radio Shack cat. no. 276-1538c] 2 boitiers pour les connecteurs ci-dessus (vendus separement en general) Du cable multi-brins (pas mono-brin) </verb></tscreen> Il vous faut aussi, mais vous pourrez peut-etre l'emprunter~: <tscreen><verb> 1 fer a souder de la soudure </verb></tscreen> Ok... voici comment connecter le tout ! Ces diagrammes montrent le côté ARRIERE (celui où vous soudez les câbles sur les broches). Les lettres V, R et B représentent les couleurs des câbles que j'ai utilisés, et facilitent la distinction des lignes (Note~: j'utilise la numerotation standard RS-232 (pour autant qu'on puisse dire). Le livre de l'APC utilise une numérotation différente. Ignorez-la~! Utilisez la nôtre... Je l'ai déjà changée pour vous~!). <tscreen><verb> --------------------- Cote Male (vers l'onduleur) ! \ B R * * * / \ * * * V / ------------ --------------------- Cote femelle (vers le port COM) ! \ R * * * V / \ * B * * / ------------ </verb></tscreen> Pour ceux qui préfèrent les chiffres~: <tscreen><verb> Male Femelle --------------------------------------- 1 7 Bleu 2 1 Rouge 9 5 Vert </verb></tscreen> --------- Complement~: Utilisation des broches RS-232~! ----------- Puisque nous avons eu à trouver cette information~: >Depuis l'ARRIERE (côté soudure), les broches sont numérotées ainsi~: <tscreen><verb> --------------------- \ 1 2 3 4 5 / \ 6 7 8 9 / ------------ </verb></tscreen> Les broches signifient <tscreen><verb> Numero Nom Abreviation (parfois prefixee par D) 1 Detection de porteuse CD 2 Reception de donnees RD 3 Transmission de donnees TD(?) 4 Terminal de donnees pret DTR 5 Masse de signal Gnd 6 Jeu de donnees pret DSR 7 Demande pour envoyer RTS(?) 8 Pret a envoyer CS 9 Indicateur de sonnerie RI </verb></tscreen> Ce que nous avons fait était la connexion de la ligne RS-232 de l'onduleur "Fail Output" sur CD, le châssis de l'onduleur sur Gnd, et l'entrée "Shut Down" sur RTS. Facile, maintenant qu'on vous le dit, non~? Je n'ai aucune idée du bon fonctionnement du logiciel ci-dessous, si vous achetez le câble d'APC. Il peut fonctionner, ou non. *** Le Logiciel *** Ok, j'utilise le paquetage SysVInit de Miquel van Smoorenburg pour Linux (voir à la fin pour emplacements, remerciements, adresses E-mail, etc.). Je ne sais ce qui doit être changer pour utiliser l'init de quelqu'un d'autre, mais je sais que ce code (qui suit) fonctionne avec celui de Miquel. Simplement ainsi je remercie comme je le dois. J'ai regardé dans le code de Miquel pour comprendre comment ioctl() fonctionnait. Si je n'avais pas eu cet exemple, j'aurais eu des problèmes. J'ai aussi utilisé la routine powerfail() (à l'identique, je crois), puisqu'elle doit interagir avec init, j'ai pensé qu'il devait savoir ça mieux que moi. Le fichier .c est à la fin de ce document, et nécessite seulement d'être copié/collé. Pour cela, supprimez simplement tout ce qui n'est pas du code. Ce document doit se terminer par la ligne /* Fin de Fichier */... coupez le reste. Ce programme peut, soit être lancé comme démon pour contrôler l'état de l'onduleur et l'indiquer à init, soit être lancé pour envoyer la commande "kill-power" (coupure d'alimentation) à l'onduleur. L'alimentation ne sera coupée que s'il y a un problème secteur et que l'onduleur est sur batteries. Une fois le courant revenu, il se rallume. Pour le lancer comme démon, entrez simplement~: backupsd /dev/backups /dev/backups est un lien vers /dev/cua0 (COM 1, pour les DOSseurs) actuellement. La beauté du lien est que je n'ai qu'à le refaire si je passe sur COM~2 ou COM~3. Ensuite, si le secteur s'arrête, init lancera les commandes de powerwait. Un exemple (qui vient de mon /etc/inittab)~: <tscreen><verb> #Voici les actions de coupure de courant pf::powerwait:/etc/rc.d/rc.power start po::powerokwait:/etc/rc.d/rc.power stop </verb></tscreen> Powerwait sera lancé si le courant baisse, et powerokwait s'il revient. Voici mon rc.power complet~: <tscreen><code> #! /bin/sh # # rc.power Ce fichier est exécuté par init en cas de coupure de courant # # Version : @(#)/etc/rc.d/rc.power 1.50 1994-08-10 # # Auteur : Christian Holtje, <docwhat@uiuc.edu> # # Definit le chemin PATH=/sbin:/etc:/bin:/usr/bin:/sbin/dangerous # Regarde comment nous avons ete appele case "$1" in start) echo "Attention - probleme d'alimentation secteur." | wall # Sauvegarde le niveau de fonctionnement actuel ps | gawk '{ if (($5 == "init") && ($1 == "1")) print $6 }' \ | cut -f2 -d[ | cut -f1 -d] \ > /tmp/run.level.power /sbin/shutdown -h +1m ;; stop) echo "Alimentation secteur revenue." | wall echo "Tentative d'arret du shutdown." | wall shutdown -c ;; *) echo "Usage: $0 [start|stop]" exit 1 ;; esac </code></tscreen> Pas mal, non~? En fait, il y a un petit problème, là... Je n'ai pas eu le temps de le trouver... S'il y a un gourou "sh" par ici... J'ai laissé un petit détail de côté, c'est de faire couper l'alimentation par l'onduleur si le PC est arrêté courant coupé. Cela est réalisé en ajoutant la ligne suivante à la fin de votre script halt~: <tscreen><verb> /sbin/backupsd /dev/backups killpower </verb></tscreen> Cela va simplement couper l'alimentation si le secteur est coupé. *** Tester le tout *** C'est juste une petite section pour vous dire~: SOYEZ PRUDENT~! Je vous recommande la sauvegarde de vos partitions Linux, avec plusieurs "sync" avant de tester, et d'être prudent en général. Evidemment, je ne fais que vous le recommander. Je n'ai pas été prudent du tout, et j'ai eu à nettoyer ma partition plusieurs fois pendant les tests de ma configuration. Mais elle fonctionne. :-) *** Où l'obtenir *** Le SysVInit de Miquel van Smoorenburg's peut se trouver sur~: <tt>sunsite.unc.edu:/pub/Linux/system/Daemons/SysVinit-2.50.tgz</tt> et une correction pour certains shell bash se trouve juste à côté~: <tt>sunsite.unc.edu:/pub/Linux/system/Daemons/SysVinit-2.50.patch1</tt> Pour ce qui est d'obtenir ce HOWTO, vous pouvez m'envoyer un E-mail, docwhat@uiuc.edu avec pour sujet~:'request' et le mot-clef 'backups' dans le corps du message (il est possible que j'automatise cela, et d'autres choses). *** Section des remerciements qui sont dûs *** Merci à Miquel van Smoorenburg <miquels@drinkel.nl.mugnet.org> pour son superbe paquetage SysVInit et son powerd.c qui m'ont beaucoup aidés. Christian Holtje <docwhat@uiuc.edu> Documentation backupsd.c (Ce qui n'est pas de Miquel) rc.power Ben Galliart <bgallia@orion.it.luc.edu> Le câble Informations sur le standard RS-232 Astuces bruyantes (non rapportées ici) <tscreen><code> /* backupsd.c -- Simple demon pour lire les signaux de coupure de * courant d'un onduleur Back-UPS (d'APC). * * Certaines parties proviennent du powerd.c de Miquel van Smoorenburg * D'autres sont originales de Christian Holtje <docwhat@uiuc.edu> * Je crois qu'on peut dire que c'est dans le Domaine Public, simplement * n'oubliez pas de citer les auteurs originaux, la ou c'est necessaire. * * Avertissement : Nous ne garantissons RIEN de ce logiciel, ni * n'assumons aucune responsabilité concernant son * utilisation, bonne ou mauvaise. */ #include <sys/types.h> #include <sys/ioctl.h> #include <fcntl.h> #include <errno.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <signal.h> /* C'est le fichier necessaire pour SysVInit */ #define PWRSTAT "/etc/powerstatus" void powerfail(int fail); /* Programme principal */ int main(int argc, char **argv) { int fd; int killpwr_bit = TIOCM_RTS; int flags; int status, oldstat = -1; int count = 0; if (argc < 2) { fprintf(stderr, "Usage: %s <device> [killpower]\n", argv[0]); exit(1); } /* Ouverture du port */ if ((fd = open(argv[1], O_RDWR | O_NDELAY)) < 0) { fprintf(stderr, "%s : %s : %s\n", argv[0], argv[1], sys_errlist[errno]); exit(1); } if ( argc >= 3 && (strcmp(argv[2], "killpower")==0) ) { /* Coupons l'alimentation */ fprintf(stderr, "%s : Tentative de coupure d'alimentation !\n", argv[0] ); ioctl(fd, TIOCMBIS, &ero;killpwr_bit); /* Hmmm... Si vous avez une coupure d'alimentation, */ /* ce code ne sera jamais execute */ exit(0); } else /* Puisqu'il ne faut pas couper l'alimentation, il faut restaurer */ /* RTS (killpwr_bit) */ ioctl(fd, TIOCMBIC, &ero;killpwr_bit); /* Passe en demon. */ switch(fork()) { case 0: /* Je suis le fils */ setsid(); break; case -1: /* Passage demon manque */ fprintf(stderr, "%s : fork impossible.\n", argv[0]); exit(1); default: /* Je suis le pere */ exit(0); } /* Maintenant, on scrute la ligne DCD */ while(1) { ioctl(fd, TIOCMGET, &ero;flags); status = (flags & TIOCM_CD); /* Si DCD est monte, le secteur est coupe */ if (oldstat == 0 && status != 0) { count++; if (count > 3) powerfail(0); else { sleep(1); continue; } } /* Si DCD est redescendu, le secteur est revenu */ if (oldstat > 0 && status == 0) { count++; if (count > 3) powerfail(1); else { sleep(1); continue; } } /* Reinit du compteur, sauvegarde de l'etat et sleep 2 secondes */ count = 0; oldstat = status; sleep(2); } /* Erreur ! (ne doit pas arriver) */ return(1); } /* Signale a init que le courant est coupe ou revenu */ void powerfail(ok) int ok; { int fd; /* Cree le fichier necessaire a init pour shutdown/abandon */ unlink(PWRSTAT); if ((fd = open(PWRSTAT, O_CREAT|O_WRONLY, 0644)) >= 0) { if (ok) write(fd, "OK\n", 3); else write(fd, "FAIL\n", 5); close(fd); } kill(1, SIGPWR); } /* Fin de Fichier */ </code></tscreen> <sect1>APC Smart-UPS, Modèle 600 <p> De nombreuses personnes ont un APC Smart UPS. Pour autant que je sache, aucun ne peut l'utiliser en mode "intelligent" (smart) sous Linux. C'est parce qu'APC refuse de diffuser son protocole pour le mode "intelligent" sans un accord de non-diffusion. Pas très intelligent de leur part, j'ai dit :). La méthode générale est d'acheter à un endroit qui diffuse l'information. J'ai entendu dire que Best en fait partie. Si vous etes coince avec un APC Smart-UPS, cous pouvez toujours l'utiliser, mais seulement en mode "idiot" comme tout autre onduleur indiqué plus haut. Voici quelques informations sur la fabrication d'un câble pour cela. Vous aurez probablement à modifier powerd.c comme indiqué en section <ref id="hacking" name="Analyse de câbles et modification de powerd.c"> <tscreen><verb> From dangit@netcom.com Mon Aug 22 10:16:23 1994 Newsgroups: comp.os.linux.misc Subject: Cable de controle d'onduleur pour APC From: dangit@netcom.com (Lam Dang) Date: Fri, 19 Aug 1994 11:56:28 GMT Organization: NETCOM On-line Communication Services (408 261-4700 guest) X-Newsreader: TIN [version 1.2 PL1] [Pas fait la premiere fois] Quelques habitues du Net m'ont demande ce que je savais sur les cables de controle d'onduleur. Voici ce que j'ai trouve lorsque j'en ai fait un pour mon APC Smart-UPS, modele 600. Je n'en prends pas la responsabilite. C'est juste un rapport d'experimentations; utilisez-le a vos risques et perils. Veuillez lire le manuel de l'utilisateur d'abord, en particulier section 6.4 : Port d'Interface d'Ordinateur. Le cable est a realiser entre un connecteur DB-9 femelle sur l'onduleur et un DB-25 male sur l'ordinateur. Puisque j'ai coupe un bout d'un cable 9 broches pour le remplacer par un DB-25, j'ai du faire TRES ATTENTION AUX NUMEROS DES BROCHES. Le boitier du DB-25 est assez grand pour contenir un regulateur de tension et deux resistances. J'ai eu tout le materiel (liste ci-dessous) chez Radio-Shack pour moins de 10 dollars. Comme Windows NT Advanced Server 3.5 (beta 2) le nécessite, l'"interface" entre le connecteur de l'onduleur et celui du PC est ainsi : Onduleur (DB-9) PC (DB-25) 1 (Extinction) 20 (DTR) 3 (Coupure de secteur) 5 (CTS) 4 (Commun) 7 (GND) 5 (Batterie faible) 8 (DCD) 9 (Masse chassis) 1 (Chassis Ground) C'est assez sommaire. Vous pouvez utiliser la broche 6 de l'onduleur au lieu de la broche 3 (elles sont inverses l'une de l'autre). La complication est de monter les broches collecteur ouvert 3 (ou 6) et 5 de l'onduleur. Ce modele APC fournit une sortie non regulee de 24 V continu sur la broche 8. La tension de sortie est disponible tout le temps (au moins un peu apres que le signal de batterie faible soit monte). L'intensite est limitee a 40mA. Pour monter, la broche 8 est l'alimentation d'un regulateur de tension de +5V/ La sortie de ce regulateur passe dans deux resistances de 4,7kohm. L'autre bout d'une resistance connecte les broches 3 (Coupure de courant) de l'onduleur et 5 du PC (CTS). Celle de l'autre resistance connecte les broches 5 de l'onduleur (Batterie faible) et 8 du PC (DCD). Les deux resistances consomment environ 2 mA lorsqu'elles sont a la masse. Testez votre cable sans le connecter au PC. Lorsque l'onduleur est alimente, les broches 5 (CTS) et 8 (DCD) cote PC doivent etre tres proches de 5V, et monter la broche 20 pendant 5 secondes ne doit avoir aucun effet. Ensuite, retirez la prise secteur de l'onduleur pour le passer sur batteries. La broche 5 (CTS) doit tomber a 0V, la broche 8 (DCD) doit rester a l'identique a 5V, et monter la broche 20 (DTR), par exemple, en court-circuitant les broches 8 et 20, doit eteindre l'onduleur apres environ 15 secondes. Conservez l'onduleur sur batterie jusqu'a l'allumage de la diode "Low Bettery" du panneau frontal. Maintenant, la broche 8 (DCD) doit descendre a 0V aussi. Attendez que la batterie soit rechargee. Ensuite, connectez votre cable au PC, desactivez les options de l'onduleur en positionnant tous ses interrupteurs sur ON, et lancez votre logiciel favori de controle d'onduleur. Pour ceux qui veulent l'utiliser avec Windows NT Advanced Server, les tensions de l'interface onduleur sont NEGATIVES pour la coupure de secteur (sur la broche 3 de l'onduleur) et la batterie faible, et POSITIVE pour l'arret a distance. Les parametres de ligne serie comme la vitesse n'ont aucune importance. Je n'ai pas teste mon cable avec le powerd de Linux. Si vous le faites, faites-le nous savoir. J'utilise NT aussi souvent que Linux sur le meme PC. Je dois etre conforme au schema d'onduleur de NT. Peut-etre quelqu'un pourrait-il modifier powerd pour le faire fonctionner avec et en poster le source ici. Liste du materiel necessaire : 1 boitier DB-9 (Radio Shack 276-1510) 1 connecteur sub-DB-25 femelle (276-1430) 1 regulateur de tension 7805 +5Vdc (276-1770) 2 resistances de 4,7kohm 1 carte a composants perforee (276-148) 1 cable avec au moins un connecteur 9 broches male. Il vous faudra un multimetre, un fer a souder et quelques heures. Esperant etre utile, Amities, -- Lam Dang dangit@netcom.com </verb></tscreen> <sect>Comment eteindre d'autres machines sur le même onduleur~? <p> Certaines personnes (y compris moi-même), ont plusieurs PC Linux connectés sur un onduleur. Un PC contrôle l'onduleur et doit éteindre les autres PC lorsque le secteur est coupé. Il y a de nombreuses manières de réaliser cela, toutes sont en "faites-le vous-même" actuellement, et de nombreuses sont simplement hypothétiques. Nous supposons que les PC peuvent communiquer sur un réseau. Appelons le PC qui surveille l'onduleur le maître, et les autres PC, les esclaves. <sect1><heading><label id="ups-status-port">Méthode de l'état du port</> <p> Configurez un port sur le maître qui, lorsqu'on y est connecté, envoie soit "OK", soit "FAIL", soit "BATLOW" lorsque le courant est là, qu'il est coupé, ou que la batterie est faible, respectivement. Montez cela sur le port 13 (le port time) sur lequel vous pouvez faire un telnet et recevoir l'heure locale. Montez sur les esclaves une version de powerd qui lit ce port plutôt que de contrôler une ligne série. Je pense que c'est probablement la meilleure méthode, et j'ai l'intention d'upgrader mes systèmes pour l'utiliser. <sect1>Méthode d'émission en l'air <p> Identique à la section <ref id="ups-status-port" name="Méthode de l'état du port">, mais par émission d'un message broadcast Ethernet signifiant l'événement. Cela peut avoir des implications de sécurité, puisqu'il peut être {{spoofed}} <sect1>Méthode du pseudo-login <p> Configurez les pseudo-login sur les esclaves avec les noms <tt/powerok/ et <tt/powerfail/, tous les deux avec le même UID. Faites de <tt>/etc/powerokscript</tt> le shell du user powerok, et de <tt>/etc/powerfailscript</tt> celui du user powerfail. Sur le maître, faites en sorte que le script <tt>/etc/powerokscript</tt> fasse un rlogin sur chaque esclave en tant que user powerok et que le script <tt>/etc/powerfailscript</tt> fasse un rlogin en tant que powerfail sur chaque esclave. Placez un fichier <tt/.rhosts/ sur chaque esclave dans le répertoire par défaut de powerok et powerfail pour autoriser le root du master à entrer comme users powerok et powerfail sur chaque esclave. C'est le système que j'utilise actuellement. Malheureusement, j'ai quelques difficultés à faire que les login distants s'exécutent et rendent la main sans se bloquer. Il faudrait probablement que le script <tt>/etc/powerfailscript</tt> fasse les rsh sur les esclaves en tâche de fond pour lui éviter de bloquer. Néammoins, je n'ai jamais obtenu de login correct en tâche de fond. J'ai même essayés des combinaisons complexes comme faire se loger <tt/toto/ sur l'esclave. Tout ce que j'ai utilisé avait des problèmes et se trouvait bloqué par un entrée tty (ou sortie, je ne m'en rappelle plus). En plus, cela peut créer des trous de sécurité. </article>