Watchdog: различия между версиями

Материал из Wiren Board
(Отметить эту версию для перевода)
(не показаны 52 промежуточные версии 7 участников)
Строка 1: Строка 1:
<languages/>
{{DISPLAYTITLE:Watchdog в контроллерах Wiren Board}}
<translate>
== Принцип работы ==
<!--T:1-->
В контроллере есть два сторожевых таймера (англ. watchdog): программный и аппаратный, которые дополняют друг друга.  
Сторожевой таймер, или "Watchdog" — аппаратно реализованная схема контроля за зависанием системы.  


<!--T:2-->
Программный контролирует работу отслеживаемых им сервисов, а аппаратный контролирует работу операционной системы, получая периодические сигналы от программного таймера.
Представляет собой таймер, построенный на отдельной микросхеме-компараторе. Таймер периодически сбрасывается подачей переменного сигнала, подаваемого на вход таймера с вывода GPIO процессора.  


<!--T:3-->
Поэтому при циклической перезагрузке контроллера, подключитесь к [[WB Debug Console|Debug Console]] и смотрите вывод — там будут подсказки, что происходит.
Если сброса не произошло в течение некоторого интервала времени (~15c), происходит перезагрузка по питанию (выключение одной из линий питания на 3-4 секунды).


<!--T:4-->
== Аппаратный ==
В системе watchdog представлен устройством /dev/watchdog1, конфигурация watchdog-демона храниться в файле /etc/watchdog.conf
===Как устроен===
</translate>
Аппаратный таймер отсчитывает заданное время и по переполнению счётчика перезагружает контроллер сбросом питания.
 
Реализация аппаратного таймера зависит от версии контроллера:
* Wiren Board 7.4 и новее — сделан на [[Wiren_Board_Embedded_Controller|Embedded Controller]], считает до 60 секунд и сбрасывает питание контроллера.
* Wiren Board 5, Wiren Board 6, Wiren Board 7 — сделан на специальной микросхеме-компараторе, считает до 15 секунд и сбрасывает питание контроллера.
 
В актуальном ПО контроллера таймер представлен устройством <code>/dev/watchdog1</code>.
 
===Отключение===
Если операционная система контроллера не загружается, а контроллер находится в циклической перезагрузке — нужно отключить аппаратный таймер.
Процедура зависит от версии контроллера, [[Disassembling_the_controller_case|корпус контроллера надо разобрать]]:
* Wiren Board 7.4 и новее — нажать и держать кнопку кнопку B1 или запаять перемычку Watchdog OFF. Это блокирует работу Wiren Board Embedded Controller, поэтому вместе с отключением таймера у вас перестанут работать: входы Ax, кнопка включения и другие выполненные на нём функции.
* Wiren Board 7.2…7.3 — запаять перемычку Watchdog OFF.
* Wiren Board 6.9 нет простого способа аппаратно отключить сторожевой таймер.
* Wiren Board 6.8 — соединить контакт WD с +5V.
* Wiren Board 6.7 — соединить контакт WD с GND.
* Wiren Board 6.3 – 6.6 и Wiren Board 5 соединить один из выводов разъема ON/OFF с GND.
 
После устранения причин перезагрузки аппаратный таймер надо включить.
 
На иллюстрациях ниже красными кружками показаны контакты, к которым нужно подключить контакт WD или контакт из разъёма ON/OFF. Фиолетовой стрелкой показан пример подключения.
 
<gallery mode="packed" heights="200px" caption="Способы отключения аппаратного таймера в разных версиях контроллера">
Image: Wiren Board EC LED1.jpg | Wiren Board 7.4 и новее. Зажать кнопку B1 или запаять перемычку Watchdog OFF
Image: wb7.2.1 watchdog-off.jpg | Wiren Board 7.2…7.3. Запаять перемычку Watchdog OFF
Image: wb6.8 watchdog-off.png | Wiren Board 6.8. Подключить WD к +5V
Image: WD-6.7.png | Wiren Board 6.7. Подключить WD к GND
Image: Watchdog_disable_wb6.png | Wiren Board 6. Подключить контакт ON/OFF к GND
Image: Watchdog_disable_wb5.png | Wiren Board 5. Подключить контакт ON/OFF к GND
</gallery>
 
== Программный ==
=== Как устроен ===
В качестве программного таймера используется сервис [https://manpages.debian.org/bullseye/watchdog/watchdog.8.en.html watchdog], который каждые 30 секунд смотрит, запущен ли указанный в конфигурации сервис. Если какой-то из отслеживаемых сервисов упадёт — watchdog отправит всем процессам сигнал SIGTERM, что приведёт к перезагрузке ОС. В логе при этом появится строчка вида: <code>systemd-journald[139]: Received SIGTERM from PID xxxx (watchdog)</code>.
 
Ещё этот сервис сообщает о нормальной работе операционной системы аппаратному таймеру через сброс его счётчика. А пока сервис не запущен в первые секунды включения контроллера — счётчик аппаратного таймера сбрасывает загрузчик.
 
=== Конфигурирование ===
По умолчанию отслеживается только sshd, вы можете добавлять свои сервисы, которые отвечают за бизнес-логику вашей системы автоматизации.
Чтобы отредактировать конфигурацию сервиса watchdog, нужно его корректно остановить, а пока сервис будет остановлен, счётчик аппаратного таймера будет сбрасывать процессор.
 
Например, добавим слежение за nginx:
# Подключитесь к контроллеру по [[SSH]].
# Остановите сервис:
#: <syntaxhighlight lang="bash">
systemctl stop watchdog
</syntaxhighlight>
# Внесите изменения в конфигурационный файл:
#: <syntaxhighlight lang="bash">
nano /etc/watchdog.conf
</syntaxhighlight>
# Добавьте новую запись с pidfile:
#: <syntaxhighlight lang="bash">
# Test if vital daemons are running
pidfile        = /var/run/sshd.pid
pidfile        = /var/run/nginx.pid
</syntaxhighlight>
# {{Wbincludes: Save nano}}
# Запустите сервис:
#: <syntaxhighlight lang="bash">
systemctl start watchdog
</syntaxhighlight>
 
=== Отключение ===
Если вы добавили слежение за каким-то сервисом, а он не запускается — контроллер будет загружать операционную систему, а потом перезагружаться.
 
Чтобы всё исправить, сразу после загрузки операционной системы остановите watchdog, на это у вас есть несколько секунд:
# Подключитесь к контроллеру через [[WB Debug Console|Debug Console]].
# Если у вас контроллер Wiren Board 7.2 и старее — включите контроллер переключателем.
# Дождитесь загрузки операционной системы и приглашения ''login''.
# Войдите в командную строку контроллера, для этого нажмите <kbd>Enter</kbd> и введите логин / пароль.
# Остановите сервис:
#: <syntaxhighlight lang="bash">
systemctl stop watchdog
</syntaxhighlight>
# Исправьте проблему с отслеживаемым сервисом, или уберите его из файла конфигурации <code>/etc/watchdog.conf</code>.
# Запустите сервис:
#: <syntaxhighlight lang="bash">
systemctl start watchdog
</syntaxhighlight>
 
Перезагрузки должны прекратиться.

Версия 18:54, 20 февраля 2024

Принцип работы

В контроллере есть два сторожевых таймера (англ. watchdog): программный и аппаратный, которые дополняют друг друга.

Программный контролирует работу отслеживаемых им сервисов, а аппаратный контролирует работу операционной системы, получая периодические сигналы от программного таймера.

Поэтому при циклической перезагрузке контроллера, подключитесь к Debug Console и смотрите вывод — там будут подсказки, что происходит.

Аппаратный

Как устроен

Аппаратный таймер отсчитывает заданное время и по переполнению счётчика перезагружает контроллер сбросом питания.

Реализация аппаратного таймера зависит от версии контроллера:

  • Wiren Board 7.4 и новее — сделан на Embedded Controller, считает до 60 секунд и сбрасывает питание контроллера.
  • Wiren Board 5, Wiren Board 6, Wiren Board 7 — сделан на специальной микросхеме-компараторе, считает до 15 секунд и сбрасывает питание контроллера.

В актуальном ПО контроллера таймер представлен устройством /dev/watchdog1.

Отключение

Если операционная система контроллера не загружается, а контроллер находится в циклической перезагрузке — нужно отключить аппаратный таймер. Процедура зависит от версии контроллера, корпус контроллера надо разобрать:

  • Wiren Board 7.4 и новее — нажать и держать кнопку кнопку B1 или запаять перемычку Watchdog OFF. Это блокирует работу Wiren Board Embedded Controller, поэтому вместе с отключением таймера у вас перестанут работать: входы Ax, кнопка включения и другие выполненные на нём функции.
  • Wiren Board 7.2…7.3 — запаять перемычку Watchdog OFF.
  • Wiren Board 6.9 нет простого способа аппаратно отключить сторожевой таймер.
  • Wiren Board 6.8 — соединить контакт WD с +5V.
  • Wiren Board 6.7 — соединить контакт WD с GND.
  • Wiren Board 6.3 – 6.6 и Wiren Board 5 соединить один из выводов разъема ON/OFF с GND.

После устранения причин перезагрузки аппаратный таймер надо включить.

На иллюстрациях ниже красными кружками показаны контакты, к которым нужно подключить контакт WD или контакт из разъёма ON/OFF. Фиолетовой стрелкой показан пример подключения.

Программный

Как устроен

В качестве программного таймера используется сервис watchdog, который каждые 30 секунд смотрит, запущен ли указанный в конфигурации сервис. Если какой-то из отслеживаемых сервисов упадёт — watchdog отправит всем процессам сигнал SIGTERM, что приведёт к перезагрузке ОС. В логе при этом появится строчка вида: systemd-journald[139]: Received SIGTERM from PID xxxx (watchdog).

Ещё этот сервис сообщает о нормальной работе операционной системы аппаратному таймеру через сброс его счётчика. А пока сервис не запущен в первые секунды включения контроллера — счётчик аппаратного таймера сбрасывает загрузчик.

Конфигурирование

По умолчанию отслеживается только sshd, вы можете добавлять свои сервисы, которые отвечают за бизнес-логику вашей системы автоматизации.

Чтобы отредактировать конфигурацию сервиса watchdog, нужно его корректно остановить, а пока сервис будет остановлен, счётчик аппаратного таймера будет сбрасывать процессор.

Например, добавим слежение за nginx:

  1. Подключитесь к контроллеру по SSH.
  2. Остановите сервис:
    systemctl stop watchdog
    
  3. Внесите изменения в конфигурационный файл:
    nano /etc/watchdog.conf
    
  4. Добавьте новую запись с pidfile:
    # Test if vital daemons are running
    pidfile         = /var/run/sshd.pid
    pidfile         = /var/run/nginx.pid
    
  5. Нажмите Ctrl+S для сохранения изменений, Ctrl+X — для выхода из редактора.
  6. Запустите сервис:
    systemctl start watchdog
    

Отключение

Если вы добавили слежение за каким-то сервисом, а он не запускается — контроллер будет загружать операционную систему, а потом перезагружаться.

Чтобы всё исправить, сразу после загрузки операционной системы остановите watchdog, на это у вас есть несколько секунд:

  1. Подключитесь к контроллеру через Debug Console.
  2. Если у вас контроллер Wiren Board 7.2 и старее — включите контроллер переключателем.
  3. Дождитесь загрузки операционной системы и приглашения login.
  4. Войдите в командную строку контроллера, для этого нажмите Enter и введите логин / пароль.
  5. Остановите сервис:
    systemctl stop watchdog
    
  6. Исправьте проблему с отслеживаемым сервисом, или уберите его из файла конфигурации /etc/watchdog.conf.
  7. Запустите сервис:
    systemctl start watchdog
    

Перезагрузки должны прекратиться.