quarta-feira, 7 de março de 2018

Controle de nobreak TS Shara em Linux - Raspberry pi

Tenho um servidor em um Raspberry, e estava sofrendo com problema de sistema de arquivos corrompidos devido desligamento incorreto ( falta de energia ). Para resolver isso procurei um nobreak. Mas como é um servidor, e niguém fica por perto o nobreak precisa fazer duas coisas: (1) desligar o servidor de forma controlada quando faltar energia, e (2) ligar novamente o servidor quando a energia voltar. Procurei o nobreak mais barato com controle por USB e encontrei o TS Shara Solo II.

Para o do nobreak escolhi utilizar o pacote NUT, pois o fabricante oferece esse software no site (apesar de desatualizado).

Instalei somente o básico do nut:
sudo apt-get install nut-client nut-server

Fiz a configuração dele adicionando os texto abaixo em cada arquivo:

/etc/nut/nut.conf
MODE=standalone

/etc/nut/ups.conf
[tsshara]
        driver = nutdrv_qx
        desc = "tsshara"
        port = auto
        protocol = "megatec"

/etc/nut/upsd.users
[upsmon]
        password = "123456"
        upsmon master
        actions = SET
        instcmds = ALL

/etc/nut/upsmon.conf
MONITOR tsshara@localhost 1 upsmon "123456" master
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC

Teste do driver. Ele deve mostrar algum erro se não funcionar.
sudo upsdrvctl start

Depois de um boot tudo estava funcionando. Para testar use:
upsc tsshara

Que deve apresentar algo assim:
Init SSL without certificate database
battery.charge: 92
battery.voltage: 12.80
battery.voltage.high: 13.00
battery.voltage.low: 10.40
battery.voltage.nominal: 12.0
device.mfr: UPS  700 VA AUT
device.model: TS Shara
device.type: ups
driver.name: nutdrv_qx
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.protocol: megatec
driver.parameter.synchronous: no
driver.version: 2.7.4
driver.version.data: Megatec 0.06
driver.version.internal: 0.28
input.current.nominal: 4.0
input.frequency: 60.0
input.frequency.nominal: 60
input.voltage: 0.0
input.voltage.fault: 0.0
input.voltage.nominal: 115
output.voltage: 111.0
ups.beeper.status: enabled
ups.delay.shutdown: 30
ups.delay.start: 180
ups.firmware: 20070731-5
ups.productid: 0035
ups.status: OB
ups.type: offline / line interactive
ups.vendorid: 0483

Hora de testar o desligamento/religamento controlado dele:
sudo upsmon -c fsd

O raspberry fez o shutdown direitinho e o nobreak desligou após 30 segundos. Após 180 segundos ele ligou novamente e no meio do boot o nobreak apagou!! Após 180 segundos ele ligou novamente e apagou no meio do boot novamente. E ficou ligando e desligando até eu aceitar que alguma coisa não estava funcionando direito. O sistema de arquivo ja tinha ido pro saco e tive que restaurar a imagem para fazer o raspberry funcionar novamente.

Esse não era o comportamento esperado, o nobreak não deveria desligar no meio do boot. Fiz alguns testes e identifiquei um possível bug no firmware do nobreak. Consegui fazer um paliativo para esse bug (apresentado em outro post) mas outro problema apareceu: o nobrek não ficava desligado quando estava sem energia, ele ligava, o raspberry dava boot, via que tinha pouca carga na bateria, mandava o nobreak desligar. O nobreak desligava por alguns minutos e ligava novamente, mesmo que ainda não tivesse energia. Ele ficava fazendo isso até acabar toda a carga da bateria. Logicamente não era isso que eu queria.

Após uma olhada no código fonte, e uma conversa com os desenvolvedores do NUT cheguei a seguinte configuração que funcionou:

/etc/nut/ups.conf
[tsshara]
        driver = nutdrv_qx
        desc = "tsshara"
        port = auto
        protocol = "megatec"
        offdelay = 30
        ondelay = 0

O parametro offdelay é o tempo em segundos que ele aguarda para desligar após receber o comando para desligar. o ondelay é o tempo que ele deveria esperar para voltar a funcionar após a energia ser reestabelecida. Entretanto utilizar um valor de ondelay diferente de zero não funciona neste nobreak, e ao invés de ele ficar desligado, ele fica reiniciando.

Nos testes também tentei o parametro stayoff, mas o nobreak não parece ser compativel com este comando e também fica reiniciando. Entretanto observei o seguinte ao utilizar a configuração acima:

1 - Quando falta energia e a bateria do nobreak esta próximo do fim, o NUT força o desligamento do nobreak. Quando a energia volta o nobreak liga após uns 5 segundos e o sistema volta a operar.
2 - Se o comando de desligamento do nobreak for feito enquanto ainda existe alimentação, o nobreak desliga e não retorna mais. E pior: quando o nobreak é ligado ele lembra do ultimo comando de shutdown e desliga novamente no meio do boot, e puff...arrebenta com o sistema de arquivo. No caso de faltar energia, e o sistema começar a fazer shutdown, se a energia voltar antes do nobreak desligar o sistema vai permanecer desligado, e quanto ele for ligado novamente pode ocorrer o desligamento do nobreak no boot. Não bom!

Portanto, quando for testar o desligamento do nobreak, tirar ele da tomada para simular uma falta de energia.

Para ficar 100% é necessário que o fabricante corrija os bugs do firmware do nobreak. Vou tentar um contato com eles para ver se chego em alguma coisa.


12 comentários:

  1. É, esse comando aqui:

    sudo upsmon -c fsd

    Fez alguma coisa errada... agora é só plugar o USB que ele desliga o nobreak e meu sistema logo em seguida...

    ResponderExcluir
    Respostas
    1. sim, isso acontece se a configuração não estiver correta, isso é um bug do nobreak. Desconecte a USB do nobreak, tire ele da tomada por alguns minutos. Ligue e desligue ele algumas vezes. Deve voltar ao normal.

      Excluir
  2. Olá, por acaso seu nobreak é USB?

    O meu identifica o seguinte dispositivo: Bus 002 Device 004: ID 0483:5740 STMicroelectronics Virtual COM Port

    Mas não consegui fazer funcionar com esses drives.

    ResponderExcluir
    Respostas
    1. mesmo problema comigo, no meu antigo tsshara, funcionava, no novo tem esse stm

      Excluir
  3. É USB sim, e a interface USB é a STM mesmo, acho que esta correto. Vc precisa utilizar os NUT mais atual, se vc estiver pegando do repositorio pode ser que seja muito antigo e sem o suporte. Qual é a versão do NUT que voce esta utilizando?

    ResponderExcluir
    Respostas
    1. Eu estou como mesmo problema aqui. Usando a versão 2.7.4

      Excluir
    2. Estou na mesma situação também, com NUT 2.7.4 instalado via apt.

      Excluir
    3. Queria atualizar, encontrei que pode ser necessário usar a porta serial /dev/ttyACMx (troque o x por algum numero, aqui foi 0), e usando o driver blazer_ser consegui pegar todas as informações, de resto funcionou com esse tutorial.

      Excluir
  4. Boa idéia, não tinha pensado nisso. O driver pra tshara é uma adaptação do blazer, sua sugestão é muito boa e mais fácil de usar.

    ResponderExcluir
  5. Parabéns pelo Post! Ainda não testei com o meu, mas já é bom saber que alguém conseguiu fazer funcionar

    ResponderExcluir
  6. Opa Zecão. Obrigado por compartilhar o post!

    Com o nobreak entretanto o negócio não funcionou:

    >> sudo upsdrvctl start
    Network UPS Tools - UPS driver controller 2.7.4
    Network UPS Tools - Generic Q* USB/Serial driver 0.28 (2.7.4)
    USB communication driver 0.33
    Using protocol: Megatec 0.06
    No values for battery high/low voltages
    Using 'guesstimation' (low: 10.400000, high: 13.000000)!
    Battery runtime will not be calculated (runtimecal not set)

    >sudo upsc tsshara
    Error: Connection failure: Connection refused

    Você teria alguma sugestão de onde buscar a documentação para tentar descobrir o problema?

    ResponderExcluir
  7. Também estou tendo erro. Alguma sugestão?

    ResponderExcluir