Configurar un SAI (UPS) en Linux

Una cosa que podemos hacer para aumentar la disponibilidad de nuestro servidor es instalar un sistema de alimentación ininterrumpida (batería/SAI o UPS en inglés). Lo ideal es que nuestro SAI tenga una salida USB que nos permita monitorizar su carga y diversos datos de la linea de entrada (voltaje).

En mi caso tengo un SAI APC Back-UPS ES 700G como el que se ve en la imagen:

apc-backups-be700g-gr-8xsteckdosen-700-vaPor lo generar los SAI de APC suelen estar soportados en Linux sin hacer mucho, solo instalando el software de gestión de SAIs NUT, y conectando el cable USB. El cable USB es muy posible que en un extremo tenga un conector tipo RJ45 y en el otro el USB (es muy común que sea así). Nada mas conectarlo podemos comprobar que lo detecta correctamente ejecutando lsusb:

root@edomo:~# lsusb
Bus 001 Device 006: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
Bus 001 Device 005: ID 1058:1140 Western Digital Technologies, Inc. My Book Essential (WDBACW)
Bus 001 Device 002: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Lo detecta correctamente con el ID 051d:0002 (APC UPS). Sin problemas en esta parte. Ahora instalamos el software de gestión y monitorización del SAI:

root@edomo:~# apt-get install nut
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Se instalarán los siguientes paquetes adicionales:
bash-completion libnspr4 libnss3 libnss3-nssdb libupsclient4 nut-client nut-server
Paquetes sugeridos:
nut-monitor nut-cgi nut-snmp nut-ipmi nut-xml
Se instalarán los siguientes paquetes NUEVOS:
bash-completion libnspr4 libnss3 libnss3-nssdb libupsclient4 nut nut-client nut-server
0 actualizados, 8 nuevos se instalarán, 0 para eliminar y 4 no actualizados.
1 no instalados del todo o eliminados.
Se necesita descargar 0 B/2.005 kB de archivos.
Se utilizarán 7.880 kB de espacio de disco adicional después de esta operación.
¿Desea continuar? [S/n] s
Configurando libc-bin (2.23-0ubuntu4) ...
(Leyendo la base de datos ... 39478 ficheros o directorios instalados actualmente.)
Preparando para desempaquetar .../bash-completion_1%3a2.1-4.2ubuntu1.1_all.deb ...
Desempaquetando bash-completion (1:2.1-4.2ubuntu1.1) ...
Reemplazado por ficheros en el paquete instalado apt (1.2.15) ...
Preparando para desempaquetar .../libnspr4_2%3a4.12-0ubuntu0.16.04.1_armhf.deb ...
Desempaquetando libnspr4:armhf (2:4.12-0ubuntu0.16.04.1) ...
Preparando para desempaquetar .../libnss3-nssdb_2%3a3.23-0ubuntu0.16.04.1_all.deb ...
Desempaquetando libnss3-nssdb (2:3.23-0ubuntu0.16.04.1) ...
Preparando para desempaquetar .../libnss3_2%3a3.23-0ubuntu0.16.04.1_armhf.deb ...
Desempaquetando libnss3:armhf (2:3.23-0ubuntu0.16.04.1) ...
Preparando para desempaquetar .../libupsclient4_2.7.2-4ubuntu1_armhf.deb ...
Desempaquetando libupsclient4:armhf (2.7.2-4ubuntu1) ...
Preparando para desempaquetar .../nut-client_2.7.2-4ubuntu1_armhf.deb ...
Desempaquetando nut-client (2.7.2-4ubuntu1) ...
Preparando para desempaquetar .../nut-server_2.7.2-4ubuntu1_armhf.deb ...
Desempaquetando nut-server (2.7.2-4ubuntu1) ...
Preparando para desempaquetar .../nut_2.7.2-4ubuntu1_all.deb ...
Desempaquetando nut (2.7.2-4ubuntu1) ...
Procesando disparadores para man-db (2.7.5-1) ...
Procesando disparadores para libc-bin (2.23-0ubuntu4) ...
Procesando disparadores para systemd (229-4ubuntu12) ...
Procesando disparadores para ureadahead (0.100.0-19) ...
Configurando bash-completion (1:2.1-4.2ubuntu1.1) ...
Configurando libnspr4:armhf (2:4.12-0ubuntu0.16.04.1) ...
Configurando libnss3-nssdb (2:3.23-0ubuntu0.16.04.1) ...
Configurando libnss3:armhf (2:3.23-0ubuntu0.16.04.1) ...
Configurando libupsclient4:armhf (2.7.2-4ubuntu1) ...
Configurando nut-client (2.7.2-4ubuntu1) ...
Configurando nut-server (2.7.2-4ubuntu1) ...
Adding user nut to group dialout
Configurando nut (2.7.2-4ubuntu1) ...
Procesando disparadores para libc-bin (2.23-0ubuntu4) ...
Procesando disparadores para systemd (229-4ubuntu12) ...
Procesando disparadores para ureadahead (0.100.0-19) ...

Con esto habremos instalado el servicio que monitorizará el SAI y las utilidades que nos permitirán controlarlo desde la linea de comandos. Antes de poder hacerlo vamos al directorio de configuración /etc/nut, donde tendremos los siguientes archivos:

  • nut.conf: Establece la configuración general de NUT, tipo de sistema de SAI (independiente, servidor en red, o cliente de red). Además de los parámetros generales de upsd, upsmon y del apagado.
  • ups.conf: Define los SAIs que podamos tener en nuestro sistema (o en otros sistemas conectados a la red) y que queremos controlar.
  • upsd.conf: Define los valores como puerto, dirección IP en la que escuchará el daemon, certificados a usar, …
  • upsd.users: Usuarios y grupos con acceso a la gestión de los SAIs
  • upsmon.conf: Configuración de monitorización para cada uno de los SAIs del sistema.
  • upssched.conf: Configuración del script auxiliar que usa upsmon para monitorizar los SAIs. Generalmente no hay que tocar nada en este fichero.

Empezamos por definir el tipo de sistema que tenemos, abrimos nut.conf y le indicamos que nuestro sistema, será un sistema independiente, ya que solo tenemos un SAI que administraremos en local. El archivo nut.conf nos quedara de la siguiente forma:

MODE=standalone

Ahora definiremos nuestro SAI en el archivo ups.conf, especificaremos el driver que usará, puerto físico y una descripción sencilla. Añadimos al fichero las siguientes lineas (el driver concreto que necesitáis lo podéis comprobar en la web de NUT, aquí):

[SAI_APC]
    driver = usbhid-ups
    port = auto
    desc = "APC Back-UPS ES 700G"

Vamos ahora con la configuración del demonio upsd, en el archivo upsd.conf. Como no vamos a permitir conexiones externas ni a usar cifrado nos basta con añadir la siguiente linea al archivo:

LISTEN 127.0.0.1 3493

Definimos el usuario upsmon que se usará para monitorizar la configuración del SAI, en el archivo upsd.users, a través de upsd, y el usuario admin que se usará para cambiar la forma en que funciona el SAI por comandos:

[upsmon]
    password  = nutpasswd
    upsmon master

[admin] 
    password = secreto1
    actions = SET
    instcmds = ALL

Finalmente el archivo upsmon.conf, al que conviene echarle un vistazo por la cantidad de opciones que permite especificar nos quedaría de la siguiente forma:

root@edomo:~# awk 'NF' /etc/nut/upsmon.conf | grep -v "^#"
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h +0"
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5
MONITOR SAI_APC@localhost      1         upsmon   nutpasswd        master
NOTIFYMSG ONLINE    "UPS %s on line power"
NOTIFYMSG ONBATT    "UPS %s on battery"
NOTIFYMSG LOWBATT    "UPS %s battery is low"
NOTIFYMSG FSD        "UPS %s: forced shutdown in progress"
NOTIFYMSG COMMOK    "Communications with UPS %s established"
NOTIFYMSG COMMBAD    "Communications with UPS %s lost"
NOTIFYMSG SHUTDOWN    "Auto logout and shutdown proceeding"
NOTIFYMSG REPLBATT    "UPS %s battery needs to be replaced"
NOTIFYMSG NOCOMM    "UPS %s is unavailable"
NOTIFYMSG NOPARENT    "upsmon parent process died - shutdown impossible"
NOTIFYFLAG ONLINE    SYSLOG+WALL
NOTIFYFLAG ONBATT    SYSLOG+WALL
NOTIFYFLAG LOWBATT    SYSLOG+WALL
NOTIFYFLAG FSD        SYSLOG+WALL
NOTIFYFLAG COMMOK    SYSLOG+WALL
NOTIFYFLAG COMMBAD    SYSLOG+WALL
NOTIFYFLAG SHUTDOWN    SYSLOG+WALL
NOTIFYFLAG REPLBATT    SYSLOG+WALL
NOTIFYFLAG NOCOMM    SYSLOG+WALL
NOTIFYFLAG NOPARENT    SYSLOG+WALL

Las lineas más relevantes son MONITOR, en la que le indicamos el nombre de nuestro SAI (el que pusimos en los archivos anteriores) y SHUTDOWNCMD, con el que le indicaremos al sistema el comando de apagado de emergencia. Con las lineas NOTIFY* podemos adaptar los mensajes que se enviarán a nuestros logs en caso de que se produzcan eventos que modifiquen el estado del SAI.

Para finalizar nos queda el archivo upssched.conf, pero que no tocaremos.

Con todo el sistema configurado podemos reiniciar el sistema y comprobar que los servicios funcionan correctamente ejecutando el siguiente comando:

root@edomo:~# upsc SAI_APC
Init SSL without certificate database
battery.charge: 100
battery.charge.low: 10
battery.charge.warning: 50
battery.date: not set
battery.mfr.date: 2012/10/03
battery.runtime: 2460
battery.runtime.low: 120
battery.type: PbAc
battery.voltage: 13.6
battery.voltage.nominal: 12.0
device.mfr: APC
device.model: Back-UPS ES 700G
device.serial: 5B1240T04143  
device.type: ups
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.version: 2.7.2
driver.version.data: APC HID 0.95
driver.version.internal: 0.38
input.sensitivity: medium
input.transfer.high: 266
input.transfer.low: 180
input.voltage: 236.0
input.voltage.nominal: 230
ups.beeper.status: disabled
ups.delay.shutdown: 20
ups.firmware: 871.O2 .I
ups.firmware.aux: O2
ups.load: 2
ups.mfr: APC
ups.mfr.date: 2012/10/03
ups.model: Back-UPS ES 700G
ups.productid: 0002
ups.serial: 5B1240T04143
ups.status: OL
ups.timer.reboot: 0
ups.timer.shutdown: -1
ups.vendorid: 051d

Como veis, así se obtiene toda la información del SAI. Lo más relevante es: battery.charge, ups.status (OL=Online, LB=Low Battery, entre otros), ups.beeper.status (que nos indica si el SAI pitará si se corta la alimentación), input.voltage

Algo que os puede ser de utilidad es apagar el pitido que emite el SAI cuando se va la luz. Para ello tenemos el comando upscmd usado con el usuario admin que creamos anteriormente (que tiene permisos para modificar el funcionamiento del SAI):

root@edomo:~# upscmd -l SAI_APC
Instant commands supported on UPS [SAI_APC]:

beeper.disable - Disable the UPS beeper
beeper.enable - Enable the UPS beeper
beeper.mute - Temporarily mute the UPS beeper
beeper.off - Obsolete (use beeper.disable or beeper.mute)
beeper.on - Obsolete (use beeper.enable)
load.off - Turn off the load immediately
load.off.delay - Turn off the load with a delay (seconds)
shutdown.reboot - Shut down the load briefly while rebooting the UPS
shutdown.stop - Stop a shutdown in progress
test.panel.start - Start testing the UPS panel
test.panel.stop - Stop a UPS panel test

root@edomo:~# upscmd -u admin -p secreto1 SAI_APC@localhost beeper.enable
OK

root@edomo:~# upsc SAI_APC | grep ups.beeper.status
Init SSL without certificate database
ups.beeper.status: enabled

root@edomo:~# upscmd -u admin -p secreto1 SAI_APC@localhost beeper.disable 
OK

root@edomo:~# upsc SAI_APC | grep ups.beeper.status
Init SSL without certificate database
ups.beeper.status: disabled

Como veis el estado del beeper cambia al ejecutar el comando anterior (si lo hacemos con el usuario upsmon, no nos dejará y mostrara un mensaje ERR ACCESS-DENIED). Los comandos que admite el SAI depende del modelo concreto, por eso conviene listarlos primero para saber si algún concreto esta soportado o no. Tened cuidado al enviar comandos al SAI, y mucho más si lo hacéis en remoto, porque lo podéis apagar sin querer… Jajaja 🙂

Como siempre, si tenéis algún problema o alguna sugerencia, no dudéis en comentar 🙂

 

Añadir un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.