NUT (Network UPS Tools) es el software estándar en Linux para comunicarse con un SAI (UPS), leer su estado y apagar el servidor de forma ordenada antes de que se agote la batería. Un solo servidor conectado al SAI puede además compartir su estado por la red, para que el resto de máquinas alimentadas por el mismo SAI también se apaguen a tiempo. En este tutorial instalarás NUT en Ubuntu 24.04, configurarás un SAI conectado por USB, activarás el apagado automático y los avisos, y añadirás un segundo servidor como cliente de red.

Requisitos previos

  • Un servidor físico con Ubuntu 24.04 LTS conectado a un SAI mediante cable USB (la mayoría de modelos de APC, Eaton, CyberPower o Salicru usan el driver usbhid-ups).
  • Un usuario no root con privilegios sudo.
  • Opcional: otros servidores alimentados por el mismo SAI, en la misma red de gestión que el primero, para el paso 6.
  • Opcional: un agente de correo funcionando y el comando mail si quieres avisos por email.

Paso 1: Instalar NUT y detectar el SAI

Comprueba que el sistema ve el SAI por USB:

lsusb
Bus 001 Device 004: ID 051d:0002 American Power Conversion Uninterruptible Power Supply

Instala NUT. El paquete nut incluye el servidor (drivers y upsd) y el cliente (upsmon):

sudo apt update
sudo apt install nut

Usa nut-scanner para que te proponga la configuración del driver:

sudo nut-scanner -U
[nutdev1]
	driver = "usbhid-ups"
	port = "auto"
	vendorid = "051D"
	productid = "0002"
	product = "Back-UPS XS 1400U FW:926.T2 .I USB FW:T2"
	serial = "4B1234P56789"
	vendor = "American Power Conversion"
	bus = "001"

Anota el driver y, si vas a conectar más de un SAI, el serial.

Paso 2: Configurar el driver del SAI

Define el SAI en /etc/nut/ups.conf. El nombre entre corchetes (sai en este ejemplo) es el que usarás en el resto de la configuración:

sudo nano /etc/nut/ups.conf

Añade al final:

[sai]
    driver = usbhid-ups
    port = auto
    desc = "SAI del rack principal"

Si tienes varios SAI del mismo modelo, añade una línea serial = ... a cada uno para que el driver sepa cuál es cuál.

A continuación indica a NUT que este equipo tiene el SAI conectado y lo vigila él mismo. Edita /etc/nut/nut.conf:

sudo nano /etc/nut/nut.conf

Cambia la línea MODE a:

MODE=standalone

Con MODE=none (el valor por defecto) los servicios de NUT no arrancan. Si en el paso 6 vas a compartir el SAI con otros servidores, usa ya MODE=netserver.

Paso 3: Configurar el servidor upsd y su usuario

upsd es el servicio que expone el estado del SAI a los clientes, incluido el propio upsmon local. Por ahora solo debe escuchar en localhost. Edita /etc/nut/upsd.conf:

sudo nano /etc/nut/upsd.conf

Añade:

LISTEN 127.0.0.1 3493
LISTEN ::1 3493

Crea el usuario con el que upsmon se conectará a upsd. Edita /etc/nut/upsd.users:

sudo nano /etc/nut/upsd.users

Añade este bloque, sustituyendo contraseña_segura_monitor por una contraseña larga y aleatoria (por ejemplo, generada con openssl rand -base64 24):

[upsmon]
    password = contraseña_segura_monitor
    upsmon primary

upsmon primary indica que este usuario corresponde al equipo conectado físicamente al SAI, el que decide cuándo empieza el apagado. Protege el archivo, porque contiene contraseñas:

sudo chown root:nut /etc/nut/upsd.users
sudo chmod 640 /etc/nut/upsd.users

Arranca el driver y el servidor. En Ubuntu 24.04 el servicio nut-driver-enumerator crea un servicio de driver por cada SAI definido en ups.conf:

sudo systemctl restart nut-driver-enumerator.service
sudo systemctl restart nut-server.service

Comprueba que NUT lee datos del SAI:

upsc sai@localhost
battery.charge: 100
battery.charge.low: 10
battery.runtime: 2460
battery.runtime.low: 120
device.mfr: American Power Conversion
device.model: Back-UPS XS 1400U
input.voltage: 231.0
ups.load: 18
ups.status: OL

Las variables más útiles son:

  • ups.status: OL (con corriente), OB (funcionando con batería), LB (batería baja), RB (hay que cambiar la batería). Pueden aparecer combinadas, por ejemplo OB LB.
  • battery.charge y battery.runtime: carga en porcentaje y autonomía estimada en segundos.
  • battery.charge.low y battery.runtime.low: los umbrales a partir de los cuales el SAI declara batería baja.

Paso 4: Configurar upsmon para el apagado automático

upsmon vigila el estado y, cuando el SAI está con batería y en batería baja (OB LB), apaga el sistema. Edita /etc/nut/upsmon.conf:

sudo nano /etc/nut/upsmon.conf

Añade al final estas líneas, con la misma contraseña del paso anterior:

MONITOR sai@localhost 1 upsmon contraseña_segura_monitor primary
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h +0"
POLLFREQ 5
POLLFREQALERT 5
FINALDELAY 5
NOTIFYCMD /usr/local/bin/nut-notify
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC
NOTIFYFLAG COMMBAD SYSLOG+EXEC
NOTIFYFLAG COMMOK SYSLOG+EXEC
NOTIFYFLAG REPLBATT SYSLOG+EXEC
NOTIFYFLAG SHUTDOWN SYSLOG+WALL+EXEC

Qué hace cada directiva:

  • MONITOR: el SAI a vigilar, cuántas fuentes de alimentación del servidor dependen de él (1), el usuario, la contraseña y el papel (primary).
  • MINSUPPLIES 1: el servidor necesita al menos una fuente alimentada para seguir encendido.
  • SHUTDOWNCMD: el comando que se ejecuta para apagar.
  • NOTIFYFLAG: para cada evento, dónde se notifica: en el syslog, con un mensaje a las terminales abiertas (WALL) y ejecutando NOTIFYCMD (EXEC).

Si quieres que el apagado empiece antes, con más margen de batería, puedes subir el umbral en /etc/nut/ups.conf dentro del bloque [sai] con override.battery.charge.low = 40. El driver pasará a declarar batería baja al 40 %.

Paso 5: Crear el script de avisos

El script que indica NOTIFYCMD recibe el mensaje como argumento y el tipo de evento en la variable NOTIFYTYPE. Este registra cada evento en el syslog y, si hay un comando mail disponible, envía un correo:

sudo nano /usr/local/bin/nut-notify
#!/usr/bin/env bash
set -euo pipefail

destinatario="[email protected]"
mensaje="${1:-evento sin mensaje}"
tipo="${NOTIFYTYPE:-DESCONOCIDO}"

logger -t nut-notify "${tipo}: ${mensaje}"

if command -v mail >/dev/null 2>&1; then
    printf '%s\n' "${mensaje}" | mail -s "[SAI ${tipo}] $(hostname)" "${destinatario}"
fi

Sustituye [email protected] por tu dirección. El script se ejecuta con el usuario nut, así que debe poder leerlo y ejecutarlo:

sudo chmod 755 /usr/local/bin/nut-notify

Arranca upsmon:

sudo systemctl restart nut-monitor.service

Comprueba que se ha conectado a upsd:

sudo journalctl -u nut-monitor -n 10 --no-pager
nut-monitor[1532]: UPS: sai@localhost (primary) (power value 1)
nut-monitor[1532]: Using power down flag file /etc/killpower

Probar la configuración

La prueba más fiable es desenchufar el SAI de la pared durante un minuto. En unos segundos upsc sai@localhost ups.status debe devolver OB, verás el aviso en las terminales abiertas y en el syslog:

sudo journalctl -t nut-notify -n 5 --no-pager
nut-notify[2210]: ONBATT: UPS sai@localhost on battery
nut-notify[2215]: ONLINE: UPS sai@localhost on line power

Vuelve a enchufar el SAI antes de que llegue a batería baja.

Paso 6: Compartir el SAI con otros servidores de la red

Si otros servidores se alimentan del mismo SAI, pueden recibir su estado del equipo que tiene el cable USB (el primario). En los ejemplos, el primario tiene la IP de gestión 10.0.0.10 y los clientes están en 10.0.0.0/24.

En el servidor primario

Cambia el modo en /etc/nut/nut.conf:

MODE=netserver

Haz que upsd escuche también en la IP de gestión añadiendo esta línea a /etc/nut/upsd.conf:

LISTEN 10.0.0.10 3493

Crea un usuario para los clientes en /etc/nut/upsd.users, con otra contraseña distinta:

[upsremoto]
    password = contraseña_segura_remoto
    upsmon secondary

Permite el puerto 3493 solo desde la red de gestión y reinicia los servicios:

sudo ufw allow from 10.0.0.0/24 to any port 3493 proto tcp
sudo systemctl restart nut-server.service nut-monitor.service

En cada servidor cliente

Instala solo el cliente:

sudo apt install nut-client

Comprueba que llega al primario:

upsc [email protected] ups.status
OL

Pon MODE=netclient en /etc/nut/nut.conf y añade a /etc/nut/upsmon.conf:

MONITOR [email protected] 1 upsremoto contraseña_segura_remoto secondary
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h +0"

Arranca el monitor:

sudo systemctl restart nut-monitor.service

Cuando el SAI llegue a batería baja, el primario avisará a los clientes (secondary), esperará a que se desconecten y después se apagará él. Así los clientes siempre se apagan primero.

Solución de problemas

upsc responde Error: Driver not connected. El driver no está en marcha o no encuentra el SAI. Revisa su servicio con systemctl status 'nut-driver@sai' y el log con sudo journalctl -u nut-driver@sai -n 30 --no-pager. Comprueba que el nombre entre corchetes de ups.conf coincide con el que consultas.

El driver da Permission denied o Can't claim USB device. El paquete instala reglas udev para los SAI conocidos. Desconecta y vuelve a conectar el cable USB para que se apliquen. Si tu modelo no está en la lista, nut-scanner -U mostrará sus vendorid y productid para que abras una incidencia o crees una regla udev con GROUP="nut".

upsmon registra Login on UPS [sai@localhost] failed - got [ACCESS-DENIED]. El usuario o la contraseña de MONITOR no coinciden con upsd.users, o upsd no se ha reiniciado tras editar el archivo. Revisa ambos y ejecuta sudo systemctl restart nut-server.service nut-monitor.service.

Los clientes muestran Data stale o COMMBAD. Comprueba la conexión al puerto 3493 del primario (nc -zv 10.0.0.10 3493), la línea LISTEN de upsd.conf y la regla de UFW.

Conclusión

Tienes NUT leyendo el estado del SAI, avisando en cada corte y vuelta de la corriente, y apagando de forma ordenada el servidor primario y sus clientes de red antes de que se agote la batería. Como siguientes pasos:

  • Exporta las métricas del SAI a Prometheus con un exporter de NUT para vigilar la carga y la autonomía en el tiempo.
  • Revisa periódicamente ups.status en busca de RB y cambia las baterías cada 3 a 5 años.
  • Configura en la BIOS de cada servidor la opción de encendido automático al volver la corriente.