Network UPS Tools (NUT): desligamento automático no Linux
|

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-ups para 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.

Gostou? Compartilhe.

Posts Similares

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *