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

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


Программный контролирует работу отслеживаемых им сервисов, а аппаратный контролирует работу операционной системы, получая периодические сигналы от программного таймера.
Представляет собой отдельную микросхему-компаратор, ведущую отсчёт времени. Если таймер досчитывает до заданного времени (около 15 секунд), происходит перезагрузка по питанию (выключение одной из линий питания на 3-4 секунды). В нормальном режиме таймер периодически сбрасывается подачей переменного сигнала, подаваемого на вход таймера с одного из выводов GPIO процессора.
Этот GPIO контролируется специальным сервисом Linux <code>watchdog</code>. Интерфейс сторожевого таймера <code>/dev/watchdog1</code>, конфигурация сервиса хранится в файле <code>/etc/watchdog.conf</code>.


Поэтому при циклической перезагрузке контроллера, подключитесь к [[WB Debug Console|Debug Console]] и смотрите вывод — там будут подсказки, что происходит.
==Отключение сторожевого таймера==
Сторожевой таймер иногда требуется отключить:
# Если вам нужно полностью выключить контроллер, не снимая с него питание (например, по событию от источника бесперебойного питания) - если сторожевой таймер будет работать, то контроллер даже после команды <code>halt</code> через некоторое время перезагрузится по питанию, и начнёт работать. При отключенном сторожевом таймере возобновление работы контроллера будет возможно только при ручном сбросе питания контроллера.
# Если вы неправильно настроили одну из важных служб контроллера, и он ушёл в циклическую перезагрузку: из-за неправильной конфигурации службы не будут запускаться, а сторожевой таймер будет замечать их отсутствие и перезапускать контроллер.


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


Реализация аппаратного таймера зависит от версии контроллера:
<!--T:2-->
* Wiren Board 7.4 и новее — сделан на [[Wiren_Board_Embedded_Controller|Embedded Controller]], считает до 60 секунд и сбрасывает питание контроллера.
Для отключения требуется [[Special:MyLanguage/Разбираем корпус контроллера|разобрать корпус контроллера]] и:
* Wiren Board 5, Wiren Board 6, Wiren Board 7 — сделан на специальной микросхеме-компараторе, считает до 15 секунд и сбрасывает питание контроллера.
* в Wiern Board 7.2 — запаять перемычку Watchdog OFF;
* в Wiren Board 6.9 нет простого способа аппаратно отключить сторожевой таймер;
* в Wiern Board 6.8 — соединить контакт WD с +5V;
* в Wiern Board 6.7 — соединить контакт WD с GND;
* в Wiren Board 6.3 – 6.6 и Wiren Board 5 соединить один из выводов разъема ON/OFF с GND.


В актуальном ПО контроллера таймер представлен устройством <code>/dev/watchdog1</code>.
На иллюстрациях красными кружками показаны контакты, к которым нужно подключить контакт WB или контакт из разъёма ON/OFF. Фиолетовой стрелкой показан пример подключения.


===Отключение===
<!--T:3-->
Если операционная система контроллера не загружается, а контроллер находится в циклической перезагрузке — нужно отключить аппаратный таймер.
<gallery mode="packed" heights="200px">
Процедура зависит от версии контроллера, [[Disassembling_the_controller_case|корпус контроллера надо разобрать]]:
Image: wb7.2.1 watchdog-off.jpg | Wiren Board 7.2. Запаять перемычку Watchdog OFF
* 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: wb6.8 watchdog-off.png | Wiren Board 6.8. Подключить WD к +5V
Image: WD-6.7.png | Wiren Board 6.7. Подключить WD к GND
Image: WD-6.7.png | Wiren Board 6.7. Подключить WD к GND
Строка 40: Строка 33:
</gallery>
</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>.


Ещё этот сервис сообщает о нормальной работе операционной системы аппаратному таймеру через сброс его счётчика. А пока сервис не запущен в первые секунды включения контроллера — счётчик аппаратного таймера сбрасывает загрузчик.
Чтобы отключить сторожевой таймер, остановите его службу:
<syntaxhighlight lang="bash">
systemctl stop watchdog
</syntaxhighlight>


=== Конфигурирование ===
Но после перезагрузки контроллера служба сторожевого таймера запустится снова.
По умолчанию отслеживается только sshd, вы можете добавлять свои сервисы, которые отвечают за бизнес-логику вашей системы автоматизации.
Чтобы отредактировать конфигурацию сервиса watchdog, нужно его корректно остановить, а пока сервис будет остановлен, счётчик аппаратного таймера будет сбрасывать процессор.


Например, добавим слежение за nginx:
Если вы исправили ошибки в работе ПО и хотите запустить обратно сторожевой таймер без перезагрузки контроллера, выполните
# Подключитесь к контроллеру по [[SSH]].
<syntaxhighlight lang="bash">
# Остановите сервис:
#: <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
systemctl start watchdog
</syntaxhighlight>
</syntaxhighlight>


=== Отключение ===
Если вы хотите навсегда отключить слежение сторожевого таймера за одним из сервисов, отредактируйте конфигурационный файл <code>/etc/watchdog.conf</code>, закомментировав строки соответствующих сервисов (в этом примере отключено слежение за nginх):
Если вы добавили слежение за каким-то сервисом, а он не запускается — контроллер будет загружать операционную систему, а потом перезагружаться.  
<syntaxhighlight lang="bash">
 
# Test if vital daemons are running
Чтобы всё исправить, сразу после загрузки операционной системы остановите watchdog, на это у вас есть несколько секунд:
pidfile = /var/run/syslogd.pid
# Подключитесь к контроллеру через [[WB Debug Console|Debug Console]].
pidfile = /var/run/sshd.pid
# Если у вас контроллер Wiren Board 7.2 и старее — включите контроллер переключателем.
pidfile = /var/run/mosquitto.pid
# Дождитесь загрузки операционной системы и приглашения ''login''.
#pidfile = /var/run/nginx.pid
# Войдите в командную строку контроллера, для этого нажмите <kbd>Enter</kbd> и введите логин / пароль.
# Остановите сервис:
#: <syntaxhighlight lang="bash">
systemctl stop watchdog
</syntaxhighlight>
</syntaxhighlight>
# Исправьте проблему с отслеживаемым сервисом, или уберите его из файла конфигурации <code>/etc/watchdog.conf</code>.
а затем выполните
# Запустите сервис:
<syntaxhighlight lang="bash">
#: <syntaxhighlight lang="bash">
systemctl restart watchdog
systemctl start watchdog
</syntaxhighlight>
</syntaxhighlight>
 
</translate>
Перезагрузки должны прекратиться.

Версия 10:09, 24 января 2022

Другие языки:

Сторожевой таймер (англ. watchdog) — аппаратно реализованная схема контроля за зависанием системы.

Представляет собой отдельную микросхему-компаратор, ведущую отсчёт времени. Если таймер досчитывает до заданного времени (около 15 секунд), происходит перезагрузка по питанию (выключение одной из линий питания на 3-4 секунды). В нормальном режиме таймер периодически сбрасывается подачей переменного сигнала, подаваемого на вход таймера с одного из выводов GPIO процессора. Этот GPIO контролируется специальным сервисом Linux watchdog. Интерфейс сторожевого таймера /dev/watchdog1, конфигурация сервиса хранится в файле /etc/watchdog.conf.

Отключение сторожевого таймера

Сторожевой таймер иногда требуется отключить:

  1. Если вам нужно полностью выключить контроллер, не снимая с него питание (например, по событию от источника бесперебойного питания) - если сторожевой таймер будет работать, то контроллер даже после команды halt через некоторое время перезагрузится по питанию, и начнёт работать. При отключенном сторожевом таймере возобновление работы контроллера будет возможно только при ручном сбросе питания контроллера.
  2. Если вы неправильно настроили одну из важных служб контроллера, и он ушёл в циклическую перезагрузку: из-за неправильной конфигурации службы не будут запускаться, а сторожевой таймер будет замечать их отсутствие и перезапускать контроллер.

Отключение сторожевого таймера аппаратным способом

Для отключения требуется разобрать корпус контроллера и:

  • в Wiern Board 7.2 — запаять перемычку Watchdog OFF;
  • в Wiren Board 6.9 нет простого способа аппаратно отключить сторожевой таймер;
  • в Wiern Board 6.8 — соединить контакт WD с +5V;
  • в Wiern Board 6.7 — соединить контакт WD с GND;
  • в Wiren Board 6.3 – 6.6 и Wiren Board 5 соединить один из выводов разъема ON/OFF с GND.

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

Отключение сторожевого таймера программным способом

Этим способом вы сможете только остановить циклическую перезагрузку из-за неправильной работы ПО. Добиться им полного выключения контроллера при наличии питания не получится.

Чтобы отключить сторожевой таймер, остановите его службу:

systemctl stop watchdog

Но после перезагрузки контроллера служба сторожевого таймера запустится снова.

Если вы исправили ошибки в работе ПО и хотите запустить обратно сторожевой таймер без перезагрузки контроллера, выполните

systemctl start watchdog

Если вы хотите навсегда отключить слежение сторожевого таймера за одним из сервисов, отредактируйте конфигурационный файл /etc/watchdog.conf, закомментировав строки соответствующих сервисов (в этом примере отключено слежение за nginх):

# Test if vital daemons are running
pidfile		= /var/run/syslogd.pid 
pidfile		= /var/run/sshd.pid
pidfile		= /var/run/mosquitto.pid
#pidfile		= /var/run/nginx.pid

а затем выполните

systemctl restart watchdog