HowTo:gentoo:InstallUPS
De Luispa
Instalación de SAI APC BR 800
Un SAI (Sistema de Alimentación Ininterrumpida), o más conocido por sus siglas en inglés UPS (Uninterruptible Power Supply: ‘suministro de energía ininterrumpible’) es un dispositivo que gracias a sus baterías, puede proporcionar energía eléctrica tras un apagón a todos los dispositivos que tenga conectados. Otra de las funciones de las SAI es la de mejorar la calidad de la energía eléctrica que llega a los equipos, filtrando subidas y bajadas de tensión y eliminando armónicos de la red en el caso de Corriente Alterna.
En mi caso estoy utilizando una SAI de APC, el modelo BR 800, para proteger mi servidor. Una de las ventajas de las SAI's es que pueden conectarse de forma inteligente con Linux, de modo que podamos por un lado monitorizarla, y por otro y mucho más importante, reaccionar desde Linux ante eventos como cortes de corriente, de modo que nos de tiempo a hacer un apagado ordenado del equipo.
Aviso: Hay dos programas que permiten controlar la SAI: sys-power/apcupsd y sys-power/nut. En mi caso he optado por apcupsd. No pueden estar los dos instalados a la vez o podrías tener interferencias. Si utilizas apcupsd, ten cuidado que no se instale nut debido a alguna dependencia de otro paquete que instales en el futuro
Modificación del Kernel
- Verifico que tengo activo lo siguiente en el Kernel
| Configuración del kernel de Linux: xxxxxxx |
Device Drivers --->
[*] HID Devices --->
[*] /dev/hiddev raw HID device support
|
- Compilo de nuevo el Kernel
# make && make modules_install # cp arch/x86_64/boot/bzImage /boot/bzImage-2.6.28-gentoo-r1 # cp System.map /boot/System.map-2.6.28-gentoo-r1
- Y como siempre, después de compilar el kernel, reinstalo los paquetes que usan módulos propios.
# cd /usr/src # emerge -v nvidia-drivers # eselect opengl set nvidia # emerge -v vmware-modules
Instalación del Hardware
Conecto la SAI y el ordenador en ella. Conecto el cable SAI al puerto DATA de la SAI y a un puerto libre del ordenador.
- Verificar primero si vemos el device de la SAI
# dmesg usb 8-1: new low speed USB device using uhci_hcd and address 2 usb 8-1: configuration #1 chosen from 1 choice generic-usb 0003:051D:0002.0002: claimed by neither input, hiddev nor hidraw usb 8-1: New USB device found, idVendor=051d, idProduct=0002 usb 8-1: New USB device strings: Mfr=3, Product=1, SerialNumber=2 usb 8-1: Product: Back-UPS BR 800 FW:9.o2 .I USB FW:o2 usb 8-1: Manufacturer: American Power Conversion usb 8-1: SerialNumber: QB0621139999
# cat /proc/bus/usb/devices Jose: T: Bus=05 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=1.5 MxCh= 0 D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 P: Vendor=051d ProdID=0002 Rev= 1.06 S: Manufacturer=American Power Conversion S: Product=Back-UPS BR 800 FW:9.o4 .I USB FW:o4 S: SerialNumber=3B0749X80011 C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr= 24mA I:* If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=usbhid E: Ad=81(I) Atr=03(Int.) MxPS= 6 Ivl=10ms Luis: T: Bus=08 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=1.5 MxCh= 0 D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 P: Vendor=051d ProdID=0002 Rev= 1.06 S: Manufacturer=American Power Conversion S: Product=Back-UPS BR 800 FW:9.o2 .I USB FW:o2 S: SerialNumber=QB0621139999 C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr= 24mA I:* If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=usbhid E: Ad=81(I) Atr=03(Int.) MxPS= 6 Ivl=10ms
- Ahora verificamos si tenemos todos los drivers necesarios en el Kernel:
# ls -l /sys/bus/usb/drivers/
Deberíamos ver estos drivers por lo menos: drwxr-xr-x 2 root root 0 Jan 6 15:27 hiddev drwxr-xr-x 2 root root 0 Jan 6 15:28 hub drwxr-xr-x 2 root root 0 Jan 6 15:28 usb drwxr-xr-x 2 root root 0 Jan 6 15:27 usbfs drwxr-xr-x 2 root root 0 Jan 6 15:28 usbhid
- En mi caso faltaba hiddev y por eso lo añadí en el paso anterior, en la configurción del kernel.
(bolica) # grep -i hiddev .config # CONFIG_USB_HIDDEV is not set
Instalación del Software
- Una vez que la SAI está conectada al servidor y he puesto el cable USB entre el puerto DATA de la SAI y un puerto libre del ordenador.
- Añado soporte de USB al paquete apcupsd. En /etc/portage/package.use agregar:
sys-power/apcupsd usb cgi gnome doc
- Ejecuto la instalación:
# emerge -v apcupsd These are the packages that would be merged, in order: Calculating dependencies... done! [ebuild N ] app-text/texlive-core-2007-r13 USE="X -doc" 42,232 kB [ebuild N ] media-libs/gd-2.0.35 USE="jpeg png truetype -fontconfig -xpm" 1,185 kB [ebuild N ] dev-texlive/texlive-documentation-base-2007 1,017 kB [ebuild N ] dev-texlive/texlive-basic-2007 USE="-doc" 29,249 kB [ebuild N ] dev-texlive/texlive-latex-2007 USE="-doc" 29,960 kB [ebuild N ] dev-texlive/texlive-latexrecommended-2007 USE="-doc" 22,731 kB [ebuild N ] virtual/latex-base-1.0 0 kB [ebuild N ] dev-tex/latex2html-2008 USE="png -gif" 1,107 kB [ebuild N ] sys-power/apcupsd-3.12.4 USE="cgi doc ncurses nls snmp usb vhosts -threads" 4,125 kB
Configuración
- Editamos el fichero de configuración de apcupsd, resalto en negrita los parámetros más importantes.
UPSCABLE usb UPSTYPE usb DEVICE /dev/ttyS0 LOCKFILE /var/lock ONBATTERYDELAY 6 BATTERYLEVEL 5 MINUTES 3 TIMEOUT 0 ANNOY 300 ANNOYDELAY 60 NOLOGON disable KILLDELAY 0 NETSERVER on NISIP 0.0.0.0 NISPORT 3551 EVENTSFILE /var/log/apcupsd.events EVENTSFILEMAX 10 UPSCLASS standalone UPSMODE disable STATTIME 0 STATFILE /var/log/apcupsd.status LOGSTATS off DATATIME 0
- El resto de ficheros de configuración son los siguientes:
>>> /etc/apcupsd/masterconnect >>> /etc/apcupsd/apcupsd.conf >>> /etc/apcupsd/offbattery >>> /etc/apcupsd/multimon.conf >>> /etc/apcupsd/onbattery >>> /etc/apcupsd/mastertimeout >>> /etc/apcupsd/hosts.conf >>> /etc/apcupsd/commfailure >>> /etc/apcupsd/commok >>> /etc/apcupsd/safe.apccontrol >>> /etc/apcupsd/changeme >>> /etc/apcupsd/apccontrol
- Los comandos instalados son:
>>> /sbin/powerflute >>> /sbin/apcupsd >>> /sbin/apctest >>> /sbin/apcaccess >>> /sbin/smtp
- Ejecuto el daemon
# /etc/init.d/apcupsd start
- Configuro el daemon para que arranque al hacer boot
# rc-update add apcupsd default
Creación de un Virtual Host
- El software de apcupsd incluye unos programas que pueden ser ejecutados a través de cgi-bin. Dado que hemos compilado con el USE=vhost, se soportan los Virtual Hosts, por lo tanto voy a crear un virtual host específico para acceder al estado de la SAI.
- Recuerdo que los correcto es usar el comando webapp-config para añadir un virtual host, otros ejemplos están documentados en el virtual host de mi wiki o el de Cacti.
- Uso webapp-config para que cree la estructura de directorios, copie el software y deje preparado todo en /data/www/sai/htdocs
# webapp-config -I -h sai -d . apcupsd 3.12.4
- Modifico mi DNS server para servir (en mi intranet) el sitio "sai.luispa.com"
- Añado un Virtual Host a apache, creo el fichero /etc/apache2/vhosts.d/45_cacti_ssl_vhost.conf
- Rearranco bind (/etc/init.d/named reload)
- Rearranco apache (/etc/init.d/apache2 graceful)
Monitorizar la SAI
Es necesario haber arrancado el daemon, algo que hice en un paso anterior. En mi caso tardó un rato en estar disponible el acceso tras el arranque del daemon (/etc/init.d/apcupsd start).
- Acceso vía Web
En mi caso, y dado que he creado un virtual host en la intranet, las URLs que voy a utilizar son las siguientes:
| http://sai.luispa.com/cgi-bin/multimon.cgi |
| http://sai.luispa.com/cgi-bin/upsfstats.cgi |
| http://sai.luispa.com/cgi-bin/upsstats.cgi |
NOTA: Dado que este virtual host sólo lo voy a usar para acceder a estos CGI-BIN, he decidido copiar adicionalmente la documentación del programa a htdocs:
# cd /data/www/sai/htdocs # cp -R /usr/share/doc/apcupsd-3.12.4/html/* .
Encuentro la documentación en: http://sai.luispa.com
- Acceso mediante línea de comando
Ejecuto el siguiente comando para ver el estado en el que se encuentra la SAI. Algunos parámetros importantes a mirar son los siguientes:
LINEV - Esto es el "line voltage" y debería ser un voltaje apropiado, que en Europa es alrededor de 220 Voltios. BATTV - Este valor debería estar cercano a 24 Voltios con más menos 5 voltios. STATUS - Estado de la SAI, que debería estar en ONLINE
APC : 001,040,0993 DATE : Sat Mar 07 22:29:43 CET 2009 HOSTNAME : bolica RELEASE : 3.12.4 VERSION : 3.12.4 (19 August 2006) gentoo UPSNAME : bolica CABLE : USB Cable MODEL : Back-UPS BR 800 UPSMODE : Stand Alone STARTTIME: Sat Mar 07 22:15:59 CET 2009 STATUS : ONLINE LINEV : 240.0 Volts LOADPCT : 36.0 Percent Load Capacity BCHARGE : 100.0 Percent TIMELEFT : 22.8 Minutes MBATTCHG : 5 Percent MINTIMEL : 3 Minutes MAXTIME : 0 Seconds OUTPUTV : 230.0 Volts DWAKE : 000 Seconds DSHUTD : 000 Seconds LOTRANS : 194.0 Volts HITRANS : 264.0 Volts RETPCT : 000.0 Percent ITEMP : 29.2 C Internal ALARMDEL : Always BATTV : 27.6 Volts LINEFREQ : 50.0 Hz LASTXFER : Unacceptable line voltage changes NUMXFERS : 0 TONBATT : 0 seconds CUMONBATT: 0 seconds XOFFBATT : N/A SELFTEST : NO STATFLAG : 0x07000008 Status Flag SERIALNO : QB0621130080 BATTDATE : 2001-09-25 NOMBATTV : 24.0 FIRMWARE : .o2 .I USB FW:o2 APCMODEL : Back-UPS BR 800 END APC : Sat Mar 07 22:30:08 CET 2009
- Icono de estado en Gnome
Dado que utilicé también el USE=gnome, deberíamos tener un un icono en el toolbar, donde nos da una indicación visual de la carga de la SAI.
El siguiente paso es configurar qué acción se debe realizar en el caso de que la batería se acerque a un estado crítico de carga. Esta es la parte más importante de todo lo que he realiazado hasta ahora. Se trata de, cuando se vaya la luz, poder apagar el equipo de forma ordenada, realizando un shutdown, justo un par de minutos antes de que se agote la batería
Configuración Avanzada
Esta es la sección más importante !!!.
Trata sobre cómo configurar el equipo para que trabaje codo con codo con la SAI, de modo que si se va la luz se realice un apagado ordenado, si la luz vuelve se rearranque, etc...
Configurar BIOS para encendido automático
Hay que asegurarse que el equipo se encienda automáticamente si tiene corriente eléctrica. Para que se haga un reboot automático después de hacer un apagado, para conseguir que el equipo vuelva a arrancar al volver la luz.
Esto no es lo típico, lo normal es que el equipo se apague al irse la luz y no vuelva a arrancarse al volver. Para conseguir el efecto del arranque automático al enchufar el cable (o volver la luz) hay que realizar modificaciones en la BIOS. En el caso de mi equipo he modificado el siguiente parámetro:
BIOS->Power Mgmt Setup->AC Back Function-> [Full On]
A partir de este momento, siempre que el equipo tenga potencia (luz), estará encendido. La única forma en la que puede apagarse es utilizando el comando /sbin/poweroff.
Cuando se va la luz la SAI tiene que colaborar con el equipo para hacer un apagado automático, de hecho, una vez que se inicia el apagado ordenado, llega un momento en el que el servidor tiene que pedirle a la SAI que le corte la corriente o volvería a arrancar.
Asegurarse que apcupsd está funcionando
Es muy importante que el daemon este siempre funcionando. Ya lo configuré en un paso anterior, pero no está de más recordarlo. El daemon se arranca usando el siguiente comando:
# /etc/init.d/apcupsd start
Y se configura que arranque automáticamente al encender el equipo con el siguiente comando:
# rc-update add apcupsd default
Puedes comprobar si está funcionando con el siguiente comando:
# ps -ef | grep -i apc root 9689 1 0 08:59 ? 00:00:00 /sbin/apcupsd
Configurar la reacción ante eventos
La parte más importante de toda la configuración es tener bien programada la reacción ante eventos. Cuando apcupsd detecta un problema, genera un EVENTO, que consiste primero en enviar un mensaje al LOG del sistema y segundo en invocar al programa apccontrol (se encuentra en /etc/acpupsd/apccontrol) para que gestione dicho evento.
Prueba de comunicaciones
Lo primero que vamos a comprobar es que se detecta algún evento. Para crear un evento realiza los siguientes pasos:
- Quita el cable USB que conecta con la SAI de tu ordenador.
En no más de 6 segundos el programa apcupsd debería detectar la falta de comunicación con el puerto ç de comunicaciones (en mi caso tardó casi 30 segundos) y debería realizar lo siguiente. - Enviar un mensaje broadcast comunicando la falta de comunicación con la SAI - Enviar un mensaje al LOG del sistema y al fichero /var/log/apcupsd.events NOTA: En Gnome no se ven los mensajes Broadcast, sólo si tienes una shell abierta. En KDE hay un daemon que permite hacer popup de una ventana, y también puede usarse en Gnome. Se llama: kde-base/kwrited
- Verás lo siguiente
1) Mensaje recibido en modo broadcast: Broadcast message from root (Sun Mar 8 09:40:54 2009): Warning communications lost with UPS bolica Sun Mar 08 09:40:54 CET 2009 Communications with UPS lost.
2) Fichero de eventos # tail -f /var/log/apcupsd.events Sun Mar 08 09:40:54 CET 2009 Communications with UPS lost.
- Una vez comprobado vuelvo a conectar el cable USB
Antes de 12 segundos el programa apcupsd debería restablecer la comunicación con la SAI y enviar un mensaje: "Communications restored with UPS bolica"
Prueba de pérdida de corriente
La siguiente prueba es quitar el cable de corriente de la SAI. Para realizarla vamos a utilizar una versión especial del fichero apccontrol. Para evitar un posible apagado del servidor (podría ocurrir que algo falle y que el equipo empiece a apagarse ordenadamente). De momento no queremos eso, estoy en una prueba anterior donde quiero comprobar que se detecta que se ha ido la luz.
- Preparamos la prueba
# cd /etc/apcupsd # cp apccontrol produccion.apccontrol <=== MUY IMPORTANTE NO TE OLVIDES !!
Copiamos una versión especial de apcccontrol que no va a apagar el equipo:
# cp safe.apccontrol apccontrol
- Desconecto el cable de corriente de la UPS (el que conecta la UPS a la red eléctrica)
Deberíamos ver los siguientes mensajes: Broadcast message from root (Sun Mar 8 10:11:08 2009): apccontrol: Warning power loss detected.
Aprox. 6 segundos después la SAI confirma que no es algo transitorio y envía: Broadcast message from root (Sun Mar 8 10:11:13 2009): apccontrol: Power failure. Running on UPS batteries.
- Tras 15 segundos más ya podemos volver a conectar el cable
apcupsd se da cuenta y debería enviar estos mensajes: Broadcast message from root (Sun Mar 8 10:12:38 2009): apccontrol: Off battery. Mains returned. Broadcast message from root (Sun Mar 8 10:12:38 2009): apccontrol: Power has returned...
Prueba de shutdown simulado
La siguiente es una prueba ya completa (IMPORTANTE que todavía estamos con el safe.apccontrol). Ahara vamos a comprobar que el equipo se apagaría tras un corte de corriente, pero con un truco, vamos a pedir que se inicien los procesos 30 segundos después de perder corriente:
- Modifico el fichero /etc/apcupsd.conf y cambio la línea TIMEOUT de 0 a 30
/etc/apcupsd/apcupsd.conf TIMEOUT 30
- Rearranco el daemon
# /etc/init.d/apcupsd restart
- Desconecto el cable de corriente de la UPS (el que conecta la UPS a la red eléctrica)
Deberíamos ver los siguientes mensajes: Broadcast message from root (Sun Mar 8 10:21:52 2009): apccontrol: Warning power loss detected. Broadcast message from root (Sun Mar 8 10:21:58 2009): apccontrol: Power failure. Running on UPS batteries. Broadcast message from root (Sun Mar 8 10:22:29 2009): apccontrol: UPS battery runtime limit exceeded. Doing shutdown. Broadcast message from root (Sun Mar 8 10:22:29 2009): apccontrol: /sbin/shutdown for halt would have been called.
- Conecto el cable de corriente y
Se cancelaría el proceso de shutdown y se muestran estos mensajes: Broadcast message from root (Sun Mar 8 10:22:29 2009): apccontrol: /sbin/shutdown for halt would have been called. Broadcast message from root (Sun Mar 8 10:23:09 2009): apccontrol: Power has returned... Broadcast message from root (Sun Mar 8 10:23:09 2009): apccontrol: Off battery. Mains returned.
- También puedo ver lo siguiente en la ventana de estado de la SAI en http://sai.luispa.com/cgi-bin/upsstats.cgi
Sun Mar 08 10:23:09 CET 2009 Allowing logins Sun Mar 08 10:23:09 CET 2009 Power is back. UPS running on mains. Sun Mar 08 10:23:09 CET 2009 Cancelling shutdown Sun Mar 08 10:23:09 CET 2009 Mains returned. No longer on UPS batteries. Sun Mar 08 10:22:29 CET 2009 User logins prohibited Sun Mar 08 10:22:29 CET 2009 Initiating system shutdown! Sun Mar 08 10:22:29 CET 2009 Reached run time limit on batteries. Sun Mar 08 10:21:58 CET 2009 Running on UPS batteries. Sun Mar 08 10:21:52 CET 2009 Power failure.
Restaurar apccontrol (IMPORTANTE)
- Una vez que hemos terminado las pruebas anteriores, es hora de devolver el programa apccontrol original a su sitio:
# cd /etc/apcupsd # cp produccion.apccontrol apccontrol
- Dejar el valor de TIMEOUT a 0 en /etc/acpupsd/apcupsd.conf
# nano apcupsd.conf TIMEOUT 0
- Rearrancar apcupsd
# /etc/init.d/apcupsd restart
Producción: prueba final
Ya esta todo configurado, pero recomiendo hacer una prueba "real" (Ojo, no me responsabilizo de las pérdidas que esto pueda causar en tu ordenador). Yo he hecho la prueba y me ha funcionado, pero es mi caso.
Puede hacerse tal cual o puedes jugar con la variable TIMEOUT de apcupsd.conf poniendola a 60 para no esperar tanto. No es mi caso, lo suyo es hacer la prueba "real", dejando que la SAI se agote, no tarda más de 15-20 min.
- Desconecto el cable de corriente de la SAI (el que conecta la SAI a la red eléctrica)
Se encienden las alarmas, el icono de Gnome avisa que se entra en modo batería A través del interfaz Web observo que estamos en modo batería. : A unos 3 minutos del final de la batería se inicia el shutdown. Cuando el shutdown termina el sistema también apaga la SAI. (NO Rearranques tu ordenador aquí) : Se apaga todo por completo. La SAI sigue pitando durante un rato (2-3 min). : Silencio total !!!
- Cuando todo está apagado ... conecto el cable de corriente a la SAI (el que conecta la SAI a red eléctrica)
Se enciende la SAI Tras unos segundos empieza a dar corriente a los equipos que tiene conectados. El servidor arranca automáticamente (recordar cambio en la BIOS) : Tras finalizar el boot el sistema está otra vez 100% operativo. : Observo el icono de Gnome que indica que la SAI está cargando sus baterías Observo en el interfaz web el estado de carga. :
¡¡¡ ENHORABUENA !!! El objetivo principal se ha conseguido.
Enlaces y Créditos
| [1] | http://wiki.luispa.com/ | Página principal de LuisPa. |
Volver a la página anterior
--Luis 22:50 7 mar 2009 (CET)

