NUT: Monitorizar UPS e Encerrar Servidores Automaticamente
Neste artigo
1. Introdução — Porquê Monitorizar UPS?
Uma falha de energia súbita num servidor sem UPS (Uninterruptible Power Supply) resulta em corrupção de ficheiros, perda de dados em trânsito e, no pior cenário, danos físicos em discos. No entanto, ter um UPS instalado não é suficiente: sem software de monitorização, o UPS funciona apenas como uma bateria temporária que se esgota sem que o servidor saiba que precisa de encerrar em segurança.
O Network UPS Tools (NUT) é um conjunto open-source de ferramentas que permite monitorizar e gerir UPS de vários fabricantes a partir de um único servidor Linux. Com o NUT, é possível:
- Receber notificações por email quando a energia falha ou a bateria está baixa;
- Encerrar servidores automaticamente antes que a bateria do UPS se esgote;
- Monitorizar vários UPS a partir de uma única consola central;
- Integrar com sistemas de monitorização como Nagios, Zabbix ou Prometheus.
O NUT suporta mais de 100 fabricantes, incluindo APC, CyberPower, Eaton, Tripp Lite e Liebert, através de drivers específicos para cada protocolo de comunicação (USB, serial, SNMP).
ℹ Importante
O NUT é o standard de facto para monitorização de UPS em Linux. É mais robusto que o apcupsd (APC apenas) e suporta arquitectura cliente/servidor, permitindo que um UPS proteja múltiplas máquinas em rede.
2. Instalar NUT — Driver, upsd e upsmon
O NUT tem três componentes principais que trabalham em conjunto: o driver (comunica com o UPS via USB/serial), o upsd (daemon que expõe os dados do UPS na rede) e o upsmon (cliente que monitoriza e desencadeia o encerramento). Entender a arquitectura é essencial antes de configurar.
2.1 Instalação em Debian/Ubuntu
No Debian, Ubuntu e derivados, o NUT está disponível nos repositórios oficiais:
# Instalar NUT e o driver USB genérico
sudo apt update
sudo apt install nut nut-driver upsmon nut-server
# Verificar que o serviço está instalado
systemctl status nut-server
systemctl status nut-monitor
2.2 Instalação em RHEL/CentOS/AlmaLinux
# RHEL/CentOS/AlmaLinux/Rocky
sudo dnf install nut
sudo systemctl enable nut-server nut-monitor
2.3 Arquitectura: Driver, upsd e upsmon
O fluxo de dados é linear: o driver lê o estado do UPS fisicamente e reporta-o ao upsd, que escuta num porto TCP (geralmente 3493). O upsmon liga-se ao upsd e, com base nos eventos recebidos, desencadeia o encerramento do sistema.
UPS (hardware)
|
| (USB / serial / SNMP)
v
upsdrvctl (driver) --> upsd (daemon TCP:3493)
|
| (TCP:3493)
v
upsmon (cliente local ou remoto)
|
| (quando bateria < critico)
v
shutdown -h now
2.4 Configurar o modo de operação
O ficheiro /etc/nut/nut.conf define o modo. Para um servidor standalone com UPS ligado directamente, usar standalone. Para um servidor que monitoriza UPS remotos, usar netserver. Para clientes que se ligam a um upsd remoto, usar netclient.
# /etc/nut/nut.conf
MODE=standalone
Após alterar o modo, reiniciar os serviços:
sudo systemctl restart nut-driver
sudo systemctl restart nut-server
sudo systemctl restart nut-monitor
3. Configurar UPS — APC, CyberPower e Eaton
A configuração do UPS é feita no ficheiro /etc/nut/ups.conf. Cada UPS tem um bloco próprio com um nome (entre parêntesis rectos) e o driver apropriado. É importante verificar qual o driver correcto para o modelo e protocolo de ligação.
Antes de configurar, é útil detectar o UPS ligado via USB:
# Listar dispositivos USB ligados
lsusb
# Procurar o UPS na lista
# Exemplo de output:
# Bus 001 Device 004: ID 051d:0002 American Power Conversion UPS
# Bus 001 Device 005: ID 0764:0501 Cyber Power Systems UPS
3.1 Configurar APC (Back-UPS, Smart-UPS)
Os UPS da APC ligados via USB usam o driver usbhid-ups, que suporta a maioria dos modelos Back-UPS e Smart-UPS recentes.
# /etc/nut/ups.conf
[apc]
driver = usbhid-ups
port = auto
desc = "APC Back-UPS 1500"
# Definir tempo máximo em bateria (segundos)
maxload = 300
Para modelos APC mais antigos com ligação serial (Smart-UPS com cabo Smart), usar o driver apcsmart e especificar o porto serial:
[apc_serial]
driver = apcsmart
port = /dev/ttyS0
desc = "APC Smart-UPS 1400 (serial)"
3.2 Configurar CyberPower
Os UPS da CyberPower usam também o driver usbhid-ups para modelos com USB, seguindo o standard HID Power Device Class.
# /etc/nut/ups.conf
[cyberpower]
driver = usbhid-ups
port = auto
desc = "CyberPower CP1500AVR"
# Vendor ID específico da CyberPower
vendorid = 0764
Para modelos CyberPower com cartão de rede (SNMP), usar o driver snmp-ups:
[cyberpower_snmp]
driver = snmp-ups
port = 192.168.1.50
community = public
desc = "CyberPower via SNMP"
mibs = cyberpower
3.3 Configurar Eaton
Os UPS da Eaton variam consoante a linha de produto. Os modelos Eaton 5E e 5P com USB usam usbhid-ups. Os modelos mais antigos (Eaton Powerware, SMT) podem necessitar do driver bcmxcp ou blazer_ser.
# /etc/nut/ups.conf
[eaton_usb]
driver = usbhid-ups
port = auto
desc = "Eaton 5E 1100 USB"
[eaton_serial]
driver = bcmxcp
port = /dev/ttyS0
desc = "Eaton Powerware 9130 (serial)"
Após configurar o ups.conf, é necessário iniciar o driver e verificar se comunica com o UPS:
# Iniciar o driver
sudo upsdrvctl start
# Verificar estado do UPS
upsc apc@localhost
# Output esperado:
# battery.charge: 100
# battery.runtime: 1200
# ups.status: OL
# ups.model: Back-UPS 1500
O estado OL significa “On Line” (energia normal). OB significa “On Battery” (a funcionar com bateria). LB significa “Low Battery”.
3.4 Configurar upsd (controlo de acesso)
O ficheiro /etc/nut/upsd.conf define onde o upsd escuta e /etc/nut/upsd.users define as credenciais de acesso:
# /etc/nut/upsd.conf
LISTEN 127.0.0.1 3493
LISTEN 192.168.1.10 3493
# /etc/nut/upsd.users
[admin]
password = MinhaPasswordSegura
actions = SET
instcmds = ALL
[monuser]
password = MonitorPassword
upsmon master
4. Notificações e Encerramento Automático
O encerramento automático é configurado no ficheiro /etc/nut/upsmon.conf. É aqui que se definem os limiares de bateria, os alertas e o comportamento quando a energia falha.
4.1 Configurar upsmon
# /etc/nut/upsmon.conf
# Monitorizar UPS local
MONITOR apc@localhost 1 monuser MonitorPassword master
# Tempo de execução mínimo em bateria (segundos)
MINSUPSLIFE 120
# Bateria baixa - quando atingir este valor, encerrar
SHUTDOWNCMD "/sbin/shutdown -h +0"
# Notificar quando a bateria está fraca
NOTIFYCMD /etc/nut/notify.sh
# Tipos de notificação
NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC
NOTIFYFLAG FSD SYSLOG+WALL+EXEC
# Esperar 15 segundos antes de marcar bateria baixa
DEADTIME 15
# Finais: segundos antes de forçar encerramento
FINALDELAY 5
4.2 Script de notificação por email
Criar um script /etc/nut/notify.sh que envia email sempre que um evento ocorre. Este script é chamado pelo upsmon com o tipo de evento como argumento:
#!/bin/bash
# /etc/nut/notify.sh
EMAIL="[email protected]"
HOST=$(hostname)
case "$NOTIFYTYPE" in
ONLINE)
SUBJECT="[UPS] Energia restaurada em $HOST"
BODY="A energia foi restaurada. O UPS voltou ao modo Online."
;;
ONBATT)
SUBJECT="[UPS] Falha de energia em $HOST"
BODY="Falha de energia detectada. UPS em modo bateria."
;;
LOWBATT)
SUBJECT="[UPS] Bateria baixa em $HOST"
BODY="Bateria do UPS baixa. Encerramento iminente."
;;
FSD)
SUBJECT="[UPS] Encerramento forçado em $HOST"
BODY="O upsmon ordenou encerramento forçado."
;;
*)
SUBJECT="[UPS] Evento em $HOST"
BODY="Evento: $NOTIFYTYPE"
;;
esac
echo "$BODY" | mail -s "$SUBJECT" "$EMAIL"
# Log adicional
logger -t upsmon "$SUBJECT - $BODY"
Tornar o script executável:
sudo chmod +x /etc/nut/notify.sh
4.3 Permissões de encerramento
O upsmon precisa de permissões para executar o shutdown. Adicionar a permissão via sudo ou usando o mecanismo nativo do NUT:
# Dar permissão de shutdown ao utilizador nut
# Em /etc/sudoers.d/nut:
nut ALL=(root) NOPASSWD: /sbin/shutdown
# Alternativa: usar o helper do NUT
sudo chmod u+s /sbin/nutshutdown
# Verificar estado do UPS e notificações (NÃO força shutdown):
sudo upsmon -l # listar estado e notificações
# Para forçar encerramento real (CUIDADO):
# sudo upsmon -c fsd
⚠ Atenção
O comando upsmon -c fsd força o encerramento real. Para testar notificações sem encerrar, simular eventos manualmente verificando os logs em /var/log/syslog ou journalctl -u nut-monitor.
4.4 Monitorizar UPS remoto (cliente)
Se um segundo servidor precisa de encerrar quando o UPS (ligado a outra máquina) fica sem bateria, configurar como cliente remoto:
# /etc/nut/nut.conf (no cliente)
MODE=netclient
# /etc/nut/upsmon.conf (no cliente)
MONITOR [email protected] 1 monuser MonitorPassword slave
SHUTDOWNCMD "/sbin/shutdown -h +0"
5. Erros Comuns e Soluções
A tabela seguinte resume os erros mais frequentes na configuração do NUT e as respectivas soluções. A maioria dos problemas está relacionada com permissões USB, drivers incorrectos ou configuração incompleta do upsmon.
| Erro | Causa | Solução |
|---|---|---|
| Can’t open /dev/hiddev0 | Permissões USB insuficientes | Adicionar regra udev em /etc/udev/rules.d/99-nut.rules com o vendorid correcto e grupo nut |
| Driver not found | Driver incorrecto no ups.conf | Consultar man nutdrv_list ou listar drivers disponíveis com upsdrvctl -h |
| Data stale | Driver não comunica com UPS | Verificar cabo USB/serial, executar upsdrvctl -D start em modo debug |
| Access denied | Credenciais erradas em upsd.users | Verificar utilizador e password em upsmon.conf correspondem a upsd.users |
| upsmon não encerra | SHUTDOWNCMD mal definido ou sem permissões | Confirmar caminho /sbin/shutdown existe e configurar sudoers para o utilizador nut |
| No such file: nut.conf | Ficheiro de configuração em falta | Copiar template de /usr/share/doc/nut/examples/ e descomprimir |
| Connection refused | upsd não está a correr ou LISTEN mal configurado | Verificar systemctl status nut-server e ss -tlnp | grep 3493 |
✓ Resumo
Para uma configuração funcional em 3 passos: (1) instalar NUT e definir MODE=standalone, (2) configurar o driver correcto em ups.conf e validar com upsdrvctl start, (3) configurar upsmon com MONITOR, SHUTDOWNCMD e NOTIFYCMD.
Artigos relacionados no kbase.pt