Network UPS Tools (NUT): desligamento automático no Linux
Um nobreak sem automação só compra tempo: se ninguém desligar o servidor antes da bateria acabar, o corte de energia é abrupto, e o risco de corrupção de dados ou de um array RAID sujo é real. O Network UPS Tools (NUT) resolve isso monitorando o nobreak via USB, serial ou SNMP e disparando um desligamento limpo do Linux assim que a bateria chega ao nível crítico — sem depender de alguém acordado às 3h da manhã para desligar o rack na mão.
Como o NUT funciona
O NUT é dividido em três camadas que conversam entre si por TCP, o que permite tanto um servidor único cuidando de si mesmo quanto vários servidores dependendo do mesmo nobreak:
- driver — fala diretamente com o hardware do nobreak (ex.:
usbhid-upspara a maioria dos modelos USB) e traduz o protocolo do fabricante em variáveis padronizadas. - upsd — o servidor de dados. Lê o que o driver expõe e serve essas informações na porta 3493/tcp para quem perguntar.
- upsmon — o cliente de monitoramento. Fica de olho no status do nobreak e é quem efetivamente manda desligar o sistema operacional quando a bateria fica crítica.
Essa separação é o que permite que uma única unidade de nobreak, conectada por USB a apenas uma máquina, avise várias outras pela rede para se desligarem antes que a energia acabe de vez.
Passo a passo: instalando e configurando o NUT no Ubuntu/Debian
1. Instale o pacote
O pacote nut do Debian/Ubuntu já traz driver, servidor de dados e cliente de monitoramento juntos — não precisa instalar cada peça separadamente.
sudo apt update sudo apt install nut
2. Identifique o nobreak conectado
Para nobreaks USB (a grande maioria em ambiente de pequena/média empresa), confirme que o Linux enxerga o dispositivo antes de mexer em qualquer arquivo de configuração:
lsusb
Anote o fabricante que aparece (APC, Eaton, SMS, etc.). Praticamente todo nobreak USB moderno usa o driver usbhid-ups; casos específicos de protocolo proprietário exigem outro driver, listado na Hardware Compatibility List do próprio projeto NUT.
3. Configure o driver em ups.conf
Cada nobreak monitorado vira uma seção neste arquivo. Para drivers USB o valor de port não importa de verdade — o padrão é usar auto, já que o driver localiza o dispositivo sozinho quando só há um nobreak USB na máquina.
sudo nano /etc/nut/ups.conf
[nobreak1]
driver = usbhid-ups
port = auto
desc = "Nobreak do rack principal"
4. Defina o modo em nut.conf
O MODE diz ao NUT que papel esta máquina exerce. Para um único servidor que está fisicamente ligado ao nobreak e só monitora a si mesmo, o modo é standalone. Se outras máquinas forem monitorar este mesmo nobreak pela rede, o modo correto é netserver (ver seção sobre múltiplos servidores mais abaixo).
sudo nano /etc/nut/nut.conf
MODE=standalone
5. Crie o usuário de monitoramento
O upsmon não fala com o driver diretamente — ele autentica no upsd como um cliente comum, com usuário e senha. Isso existe para permitir controle de acesso mesmo quando o monitoramento é feito pela rede.
sudo nano /etc/nut/upsd.users
[monuser]
password = SENHA_FORTE_AQUI
upsmon primary
Restrinja a leitura deste arquivo, já que ele guarda a senha em texto puro:
sudo chown root:nut /etc/nut/upsd.users sudo chmod 640 /etc/nut/upsd.users
6. Configure o upsmon.conf
Este é o arquivo que decide o que acontece quando a bateria fica crítica. Três diretivas são obrigatórias: qual nobreak monitorar (MONITOR), o comando de desligamento (SHUTDOWNCMD) e onde marcar que o corte foi por falta de energia (POWERDOWNFLAG) — esse arquivo-flag é o que o script de shutdown do sistema consulta para decidir se deve, além de desligar o SO, também mandar o nobreak cortar a saída de energia.
sudo nano /etc/nut/upsmon.conf
MONITOR nobreak1@localhost 1 monuser SENHA_FORTE_AQUI primary MINSUPPLIES 1 SHUTDOWNCMD "/sbin/shutdown -h +0" POWERDOWNFLAG /run/nut/killpower
O número 1 depois do nome do nobreak é o “valor de energia” daquela fonte — só muda em servidores com fontes redundantes alimentadas por nobreaks diferentes. Use uma pasta volátil (recriada a cada boot, como /run) para o POWERDOWNFLAG: se o arquivo sobreviver a um reboot por engano, o próximo desligamento pode ser interpretado incorretamente.
Proteja este arquivo também, pela mesma razão do upsd.users:
sudo chown root:nut /etc/nut/upsmon.conf sudo chmod 640 /etc/nut/upsmon.conf
7. Suba os serviços
sudo systemctl enable --now nut-driver.target nut-server nut-monitor
8. Confirme que o NUT está lendo o nobreak
upsc nobreak1@localhost ups.status
A resposta esperada é OL (on line — funcionando na rede elétrica normal). Se vier OB (on battery) com o nobreak conectado na tomada, ou nenhuma resposta, o driver não está se comunicando — revise o ups.conf antes de continuar. Para ver todas as variáveis disponíveis, incluindo carga da bateria e autonomia estimada:
upsc nobreak1@localhost
9. Teste o desligamento forçado antes de confiar nele
Não espere a próxima queda de energia real para descobrir se a cadeia inteira funciona. O comando abaixo simula o evento crítico completo — inclusive o desligamento de verdade da máquina — então rode em janela de manutenção:
sudo upsmon -c fsd
Se o servidor desligar limpo e voltar a ligar sozinho quando a energia “retornar” (ou quando você ligar o nobreak de novo), a automação está funcionando. Se ele travar ou não desligar, o problema está no SHUTDOWNCMD ou nas permissões do POWERDOWNFLAG, não no nobreak.
Cuidado com RAID no momento do corte
Se o servidor usa RAID por software (mdadm), o kernel pode não concluir a rotina normal de desmontagem antes do corte de energia do nobreak, deixando o array sujo e forçando uma resincronização longa na próxima inicialização. Em scripts de desligamento mais rigorosos, vale colocar o array em modo somente leitura depois que os sistemas de arquivos forem remontados como read-only e antes do comando que corta a energia do nobreak:
sudo mdadm --readonly /dev/md0
Para RAID em controladora dedicada, confirme com o fabricante se o corte abrupto deixa o array em estado consistente — o comportamento varia bastante entre controladoras.
Monitorando mais de um servidor com o mesmo nobreak
É comum um nobreak alimentar várias máquinas, mas só uma estar fisicamente conectada a ele por USB. Nesse cenário, a máquina conectada é a primary (roda driver, upsd e upsmon) e as demais são secondary (só rodam upsmon, monitorando pela rede).
Na máquina primary, libere o upsd para aceitar conexões de rede em /etc/nut/upsd.conf:
LISTEN 0.0.0.0 3493
Crie um usuário secondary em upsd.users na primary (upsmon secondary em vez de primary), e nas outras máquinas configure o upsmon apontando para o IP da primary:
MONITOR nobreak1@192.168.1.10 1 monuser SENHA_FORTE_AQUI secondary
Assim, quando a bateria da nobreak ficar crítica, a primary avisa todas as secondary para se desligarem antes de desligar a si mesma por último — evitando que uma máquina fique tentando escrever em um storage que já perdeu energia.
Perguntas frequentes
Todo nobreak funciona com o NUT?
Não. Só nobreaks que expõem uma porta de comunicação (USB, serial ou placa de rede/SNMP) e têm driver suportado. Nobreaks puramente “burros”, sem interface de dados, não dá para automatizar por software — nesse caso a única automação possível é substituir o modelo.
Preciso rodar o upsd se só tenho um servidor?
Sim. Mesmo em modo standalone, o upsmon fala com o driver através do upsd — não existe um caminho direto entre eles. É mais uma camada, mas é a mesma arquitetura que permite escalar para vários servidores depois sem reinstalar nada.
O que muda entre primary e secondary?
A primary é quem detecta o evento crítico primeiro e decide iniciar a sequência de desligamento (o “forced shutdown flag”). As secondary apenas obedecem esse sinal. Só pode haver uma primary por nobreak.
O NUT desliga o próprio nobreak, ou só os servidores?
As duas coisas, na ordem certa: primeiro os sistemas operacionais são desligados, depois o script de shutdown do sistema primary chama upsdrvctl shutdown, que manda o nobreak cortar a saída — garantindo que tudo reinicie do zero, em vez de ficar em um estado indefinido quando a bateria realmente se esgotar.
Como sei que vai funcionar numa queda de energia real, e não só no teste?
O teste com upsmon -c fsd reproduz a mesma sequência de um evento real a partir da 3ª etapa (a única diferença é o motivo que disparou o alerta). Rodar esse teste periodicamente, especialmente depois de qualquer mudança no upsmon.conf ou de firmware do nobreak, é a única forma confiável de saber que a automação vai responder quando precisar.
Conclusão
Configurar o NUT leva menos de meia hora e elimina o cenário mais comum de perda de dados em pequenos data centers: energia que volta rápido demais para alguém correr até o rack, mas devagar demais para a bateria aguentar. Depois de configurado, o único trabalho recorrente é testar o upsmon -c fsd de tempos em tempos e revisar o SHUTDOWNCMD sempre que o sistema operacional mudar sua forma de desligar.