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:
Por 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 🙂