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

Материал из Wiren Board
м (Fix typo)
(не показано 25 промежуточных версий 6 участников)
Строка 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/Разбираем корпус контроллера|разобрать корпус контроллера]] и соединить один из выводов разъема ON/OFF с GND.
* Wiren Board 5, Wiren Board 6, Wiren Board 7 — сделан на специальной микросхеме-компараторе, считает до 15 секунд и сбрасывает питание контроллера.


В актуальном ПО контроллера таймер представлен устройством <code>/dev/watchdog1</code>.
<!--T:3-->
{| class="wikitable"


===Отключение===
! [[Файл:WD-6.7.png|400px|thumb|left|Wiren Board 6.7-6.8]]
Если операционная система контроллера не загружается, а контроллер находится в циклической перезагрузке — нужно отключить аппаратный таймер.
! [[File:Watchdog_disable_wb6.png|400px|thumb|center|Wiren Board 6]]
Процедура зависит от версии контроллера, [[Disassembling_the_controller_case|корпус контроллера надо разобрать]]:
! [[File:Watchdog_disable_wb5.png|400px|thumb|left|Wiren Board 5]]
* 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.


После устранения причин перезагрузки аппаратный таймер надо включить.
<!--T:4-->
На иллюстрациях показано, какие выводы необходимо соединить для этого в контроллерах Wiren Board 5 и WirenBoard 6. Нужный вывод разъема 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
<syntaxhighlight lang="bash">
Image: wb7.2.1 watchdog-off.jpg | Wiren Board 7.2…7.3. Запаять перемычку Watchdog OFF
service watchdog stop
Image: wb6.8 watchdog-off.png | Wiren Board 6.8. Подключить WD к +5V
</syntaxhighlight>
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>.


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


=== Конфигурирование ===
Если вы хотите навсегда отключить слежение сторожевого таймера за одним из сервисов, отредактируйте конфигурационный файл <code>/etc/watchdog.conf</code>, закомментировав строки соответствующих сервисов (в этом примере отключено слежение за nginх):
По умолчанию отслеживается только sshd, вы можете добавлять свои сервисы, которые отвечают за бизнес-логику вашей системы автоматизации.
<syntaxhighlight lang="bash">
Чтобы отредактировать конфигурацию сервиса 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
# Test if vital daemons are running
pidfile         = /var/run/sshd.pid
pidfile = /var/run/syslogd.pid
pidfile         = /var/run/nginx.pid
pidfile = /var/run/sshd.pid
pidfile = /var/run/mosquitto.pid
#pidfile = /var/run/nginx.pid
</syntaxhighlight>
</syntaxhighlight>
# {{Wbincludes: Save nano}}
а затем выполните
# Запустите сервис:
<syntaxhighlight lang="bash">
#: <syntaxhighlight lang="bash">
service watchdog restart
systemctl start watchdog
</syntaxhighlight>
</syntaxhighlight>
 
</translate>
=== Отключение ===
Если вы добавили слежение за каким-то сервисом, а он не запускается — контроллер будет загружать операционную систему, а потом перезагружаться.
 
Чтобы всё исправить, сразу после загрузки операционной системы остановите 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>
 
Перезагрузки должны прекратиться.

Версия 11:23, 1 декабря 2021

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

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

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

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

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

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

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

Для отключения требуется разобрать корпус контроллера и соединить один из выводов разъема ON/OFF с GND.

Wiren Board 6.7-6.8
Wiren Board 6
Wiren Board 5

На иллюстрациях показано, какие выводы необходимо соединить для этого в контроллерах Wiren Board 5 и WirenBoard 6. Нужный вывод разъема ON/OFF отмечен красной стрелкой, выводы GND (можно использовать любой) отмечены красными кружками. Фиолетовой линией показан пример соединения.

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

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

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

service watchdog stop

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

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

service watchdog start

Если вы хотите навсегда отключить слежение сторожевого таймера за одним из сервисов, отредактируйте конфигурационный файл /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

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

service watchdog restart