HowTo:gentoo:InstallUPS

De Luispa

Instalación de SAI APC BR 800

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.
Fichero: /etc/apcupsd/apcupsd.conf
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"
  • Rearranco bind (/etc/init.d/named reload)
  • Rearranco apache (/etc/init.d/apache2 graceful)


Monitorizar la SAI

SAI vía Web

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
# apcaccess status
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
SAI en Gnome
SAI 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.


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

Carga SAI en Gnome
Carga SAI en Web

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)