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
mailsi quieres avisos por email.
Notaesta guía es para equipos propios, por ejemplo en una oficina o un rack local. En los servidores dedicados de CubePath la alimentación redundante y los SAI del centro de datos los gestiona CubePath, así que no necesitas NUT en ellos.
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 ejemploOB LB.battery.chargeybattery.runtime: carga en porcentaje y autonomía estimada en segundos.battery.charge.lowybattery.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 ejecutandoNOTIFYCMD(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.
Advertenciapara probar el apagado completo existe
sudo upsmon -c fsd, que simula batería baja y apaga el servidor (y los clientes de red) de inmediato. Úsalo solo en una ventana de mantenimiento.
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.statusen busca deRBy 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.
