NUT + Salicru (USB) — Configuración completa, apagado por batería y dry-run
Contexto
Sistema Debian 13 con UPS Salicru conectada por USB. Se descarta definitivamente el software propietario (PMasterP / PowerMaster+). Se adopta Network UPS Tools (NUT) como solución única.
Driver utilizado:
- nutdrv_qx
Nota: aunque el UPS fue inicialmente operativo con blazer_usb, el driver recomendado y estable para este modelo es nutdrv_qx.
blazer_usb está deprecado y puede fallar en detección tras reconexiones USB.
Con nutdrv_qx el dispositivo se detecta de forma consistente.
Modo de operación:
- standalone
Objetivo:
- Monitorizar la UPS
- Apagar el sistema de forma controlada
- Iniciar apagado cuando la batería baje al 30 %
- Poder simular cortes eléctricos (dry-run) sin apagar el sistema
Servicios NUT implicados
Arquitectura clásica de NUT (los tres niveles):
- Driver (habla con la UPS)
- Servidor (upsd)
- Monitor (upsmon)
Servicios activos:
- nut-driver@salicru.service
- nut-server.service
- nut-monitor.service
Comprobación:
systemctl status nut-driver@salicru systemctl status nut-server systemctl status nut-monitor
Arranque automático:
systemctl enable nut-driver@salicru nut-server nut-monitor
Configuración base
/etc/nut/nut.conf
MODE=standalone
/etc/nut/ups.conf
[salicru] driver = blazer_usb port = auto desc = "UPS Salicru USB"
/etc/nut/upsd.users
Usuario para upsmon (monitorización y apagado):
[monuser] password = ******** upsmon master
Usuario para comandos manuales y pruebas:
[cmduser] password = ******** actions = SET instcmds = ALL
Permisos correctos del fichero:
- Propietario: root
- Grupo: nut
- Modo: 0640
/etc/nut/upsmon.conf
Línea crítica de monitorización (sistema local primario):
MONITOR salicru@localhost 1 monuser ******** master
Comando de apagado:
SHUTDOWNCMD "/sbin/shutdown -h +0"
Archivo de powerdown:
POWERDOWNFLAG "/etc/killpower"
Frecuencias de polling:
POLLFREQ 5 POLLFREQALERT 5
Notificaciones ejecutables:
NOTIFYCMD /usr/sbin/upssched
NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC NOTIFYFLAG LOWBATT SYSLOG+WALL NOTIFYFLAG FSD SYSLOG+WALL
Nota importante:
- Directivas como PIPEFN, LOCKFN y ONBATTDELAY NO van en upsmon.conf
- Si se ponen ahí, upsmon falla o las ignora
Apagado condicionado al 30 % de batería (lógica personalizada)
NUT por defecto apaga en LOWBATT. Aquí se implementa una lógica propia basada en battery.charge.
Se usa upssched como orquestador.
Script: /usr/bin/upssched-cmd
Contenido completo:
#!/bin/bash
UPS="salicru"
case "$1" in check_battery) charge=$(upsc "$UPS" battery.charge 2>/dev/null | tr -d '% ')
if [ -z "$charge" ]; then
logger "NUT/upssched: no se pudo leer battery.charge"
exit 0
fi
if ! echo "$charge" | grep -qE '^[0-9]+$'; then
logger "NUT/upssched: battery.charge no es numérico: $charge"
exit 0
fi
if [ "$charge" -le 30 ]; then
logger "NUT/upssched: batería al ${charge}%. Iniciando apagado."
/sbin/shutdown -h now "Apagado por NUT: batería al ${charge}%"
else
logger "NUT/upssched: batería al ${charge}%. Sin apagar."
fi
;;
*) logger "NUT/upssched: comando desconocido '$1'" ;; esac
Permisos:
chmod 750 /usr/bin/upssched-cmd chown root:nut /usr/bin/upssched-cmd
Dry-run: simular un corte eléctrico sin apagar el sistema
Método limpio y recomendado: simulación desde la UPS.
Iniciar simulación de batería:
upscmd -u cmduser -p ******** salicru test.battery.start.quick
Efectos esperados:
- ups.status pasa a ONBATT
- Se ejecutan NOTIFY y upssched
- El sistema NO se apaga
- Se registran mensajes en el journal
Detener simulación:
upscmd -u cmduser -p ******** salicru test.battery.stop
Verificación y diagnóstico
Estado de la UPS:
upsc salicru
Logs en tiempo real:
journalctl -fu nut-monitor journalctl -fu nut-server
Mensajes esperables:
- ONBATT detectado
- Ejecución de upssched
- Evaluación de battery.charge
- Decisión de apagar o no
Ejemplo real:
NUT/upssched: batería al 100%. Sin apagar (por encima del 30%).
Errores comunes detectados en este despliegue
- Colocar ONBATTDELAY en upsmon.conf (directiva inválida)
- Colocar PIPEFN y LOCKFN en upsmon.conf (van en upssched.conf)
- Usuario de upsmon sin permiso "upsmon master"
- Confundir upsc (lectura) con upscmd (comandos)
- Intentar mezclar software propietario con NUT activo
Estado final
- Driver operativo
- Comunicación USB estable
- upsd funcional
- upsmon activo como master
- Apagado controlado por lógica propia
- Dry-run seguro y repetible
- Listo para producción