Skip to main content

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):

  1. Driver (habla con la UPS)
  2. Servidor (upsd)
  3. 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