Como manter o timer do watchdog em execução durante a reinicialização / desligamento

10

Na minha pesquisa até agora, notei que existem duas abordagens para ativar um timer de watchdog no raspberry: usar systemd ou instalar watchdog. Está tudo bem explicado aqui: https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=147501#

E eu consegui fazê-lo funcionar nos dois sentidos, mas não durante a reinicialização / desligamento. Eu usei um forkbomb para testá-lo e ele reage a isso, no entanto, quando tento:

sudo poweroff

Apenas fica no chão. Então, eu estou pensando que existe uma maneira de forçar o cão de guarda a continuar em execução durante a reinicialização / desligamento, para que ele seja redefinido após alguns segundos se não inicializar corretamente?

A maioria das abordagens inicia o watchdog durante a inicialização, mas e se você precisar dela em execução o tempo todo? Meu framboesa parou uma vez na reinicialização e eu tive que desconectá-lo / plugá-lo manualmente para fazê-lo funcionar.


ATUALIZAR:

Algumas coisas estão muito mais claras para mim agora. Há três coisas a considerar:

  1. watchdog timer
  2. daemon de cão de guarda
  3. daemon de serviço de watchdog

watchdog timer: um registro que aciona uma redefinição quando ela transborda, a cada ciclo de RPI incrementado, precisa ser limpo (chutado) regularmente para evitar a redefinição

Para executá-lo na inicialização, adicione o seguinte a /boot/config.txt :

dtparam=watchdog=on

watchdog daemon: um processo responsável por limpar (chutar) o timer do watchdog regularmente

Instale-o:

sudo modprobe bcm2835_wdt echo "bcm2835_wdt" | sudo tee -a /etc/modules sudo apt-get install watchdog sudo update-rc.d watchdog defaults

Configure /etc/watchdog.conf :

watchdog-device = /dev/watchdog watchdog-timeout = 14 realtime = yes priority = 1 max-load-1 = 24

Configure / etc / default / watchdog :

watchdog_module="bcm2835_wdt"

Para configurá-lo, adicione o seguinte ao /etc/modprobe.d/watchdog.conf :

options bcm2835_wdt nowayout=1 heartbeat=10

referência: http://vk5tu.livejournal.com/35721.html

O parâmetro de pulsação para o módulo do kernel é o intervalo máximo entre pulsações visto pelo dispositivo antes da reinicialização do hardware

O parâmetro nowayout determina o que acontece quando o dispositivo / dev / watchdog é fechado: um batimento cardíaco ainda é esperado ou não? Um valor 1 diz que a contagem regressiva para uma reinicialização continua em execução e se o dispositivo não for reaberto e uma pulsação gravada, a máquina será reinicializada.

Habilite-o (se isso não funcionar, primeiro cuide de watchdog.service e tente novamente):

sudo systemctl enable watchdog

Monitore:

sudo systemctl status watchdog

daemon de serviço watchdog: ativa quando o daemon watchdog falha / para, geralmente executa um daemon keepalive que ativa o watchdog regularmente

Configure /lib/systemd/system/watchdog.service :

# OnFailure=wd_keepalive.service- Comentar isso desativa o daemon keepalive; assim, quando o daemon watchdog falha / para, nada impede o cronômetro watchdog de reiniciar o RPI

[Install] WantedBy=multi-user.target - correção de bug


Finalmente:

Reinicie o RPI. Depois que o raspberry é reiniciado, tudo deve começar (watchdog timer e watchdog daemon). Para verificar este uso:

cat /var/log/syslog | grep watchdog

Saída esperada:

Jun 14 12:09:08 raspberrypi systemd[1]: Starting watchdog daemon... Jun 14 12:09:08 raspberrypi watchdog[813]: starting daemon (5.14): Jun 14 12:09:08 raspberrypi watchdog[813]: int=1s realtime=yes sync=no soft=no mla=24 mem=0 Jun 14 12:09:08 raspberrypi watchdog[813]: ping: no machine to check Jun 14 12:09:08 raspberrypi watchdog[813]: file: no file to check Jun 14 12:09:08 raspberrypi watchdog[813]: pidfile: no server process to check Jun 14 12:09:08 raspberrypi watchdog[813]: interface: no interface to check Jun 14 12:09:08 raspberrypi watchdog[813]: temperature: no sensors to check Jun 14 12:09:08 raspberrypi watchdog[813]: test=none(0) repair=none(0) alive=/dev/watchdog heartbeat=none to=root no_act=no force=no Jun 14 12:09:08 raspberrypi watchdog[813]: watchdog now set to 14 seconds Jun 14 12:09:08 raspberrypi watchdog[813]: hardware watchdog identity: Broadcom BCM2835 Watchdog timer Jun 14 12:09:08 raspberrypi systemd[1]: Started watchdog daemon.

E:

ps aux|grep watchdog

Saída esperada:

root 813 0.0 0.2 1888 1760 ? SLs 12:09 0:00 /usr/sbin/watchdog pi 900 0.0 0.2 4752 1992 pts/0 S+ 12:10 0:00 grep --color=auto watchdog


TESTE :

Mate o daemon watchdog, execute:

ps aux|grep watchdog

Veja o ID do processo e mate-o:

root 812 0.0 0.2 1888 1760 ? SLs 12:16 0:00 /usr/sbin/watchdog pi 898 0.0 0.2 4752 1992 pts/0 S+ 12:16 0:00 grep --color=auto watchdog

sudo kill -9 812

Teste de forkbomb clássico, execute:

: (){ :|:& };:

Para testar a redefinição do raspberry se o processo de reinicialização falhar, execute:

sudo poweroff - com este eu tive alguns problemas

Framboesa deve reiniciar após 15s cca.

Duje
fonte

Respostas:

5

sudo poweroffsignifica desligar e ficar desligado. O cão de guarda não intercepta isso e não deve. O comportamento que você está enfrentando é correto e você não deve esperar que o cão de guarda reinicie um sistema desligado.

Eu não acho que é isso que você quer fazer. Se você deseja reiniciar o pi. você deve usar o comando sudo reboot. E, nesse caso, se algo travar durante a sequência de desligamento - inicialização que rebootdispara, o cão de guarda deve assumir o controle.

nickcrabtree
fonte
4

Eu não passei por todo o discurso retórico que você vinculou, mas o autor parece não entender o cão de guarda.

Há um cão de guarda de hardware BCM; Se você deseja iniciar o watchdog de hardware, inclua dtparam=watchdog=onem/boot/config.txt

Por si só, isso faz pouco, embora deva reiniciar o sistema se não for "chutado" regularmente. Você pode escrever um código que se abre /dev/watchdogpara começar.

Também existe um watchdog daemonque você pode configurar para ativar o watchdog; você deve poder começar comsudo systemctl enable watchdog

OBSERVAÇÃO: o bug mencionado abaixo estava em Jessie e foi corrigido no Stretch.
Infelizmente, existe um bug conhecido no script systemd, que é facilmente corrigido. Consulte http://unix.stackexchange.com/questions/346224/problem-with-systemd-starting-watchdog

Milliways
fonte
Obrigado por responder, adicionei uma atualização à minha postagem original para mostrar meu progresso. No entanto, ainda estou tendo problemas para fazer com que o WDT reinicie o RPI ao executar sudo poweroff. Às vezes funciona, às vezes não: S
Duje
11
Infelizmente, você parece ter misturado muitas idéias diferentes. Não pretendo ser um especialista em watchdog, mas para ver se está em execução systemctl status watchdog.service. O assassinato watchdog NÃO causará uma reinicialização, pois o watchdog.serviceinício é iniciado wd_keepalive.service, o que, como o próprio nome indica, impede a reinicialização.
Milliways
Não se você desativar o wd_keepalive.service. Assim: "Configure /lib/systemd/system/watchdog.service: # OnFailure=wd_keepalive.service- Comentando isso desativa o daemon keepalive assim uma vez watchdog daemon falhar / pára nada vai impedi watchdog timer de reiniciar RPI"
Duje
2

Power é um serviço / daemon do sistema em pi e é uma sequência de caracteres analisada por um IC diretamente conectado / conectado ao Broadcom IC. O fluxo de trabalho da operação pode ser alterado consultando os arquivos do sistema, mas pelo que posso dizer, você está tentando invocar periperiais em cenários de regulação de energia personalizados, dentro do conceito de interrupções e temporizadores de vigilância. Você pode alterar parte desse comportamento repinindo o IC regulador e executando alguma programação bare metal pré-inicialização. Confira estes e não hesite em contactar-me se você tem algo em mente. confira o conjunto de instruções da linha de referência ARM Corp., bem como a documentação da arquitetura. Está na web.

http://infocenter.arm.com/help/topic/com.arm.doc.dui0489f/DUI0489F_arm_assembler_reference.pdf

https://www.arm.com/files/pdf/CortexM3_programming_for_ARM7_developers.pdf

Aliás, diga "oi" ao seu professor ...

Yigit Turgut
fonte