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

Материал из Wiren Board
м (Fix typo)
(не показаны 23 промежуточные версии 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. Фиолетовой стрелкой показан пример подключения.
В версии Wiren Board 6.9 нет простого способа аппаратно отключить сторожевой таймер.


<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>


== Программный ==
Чтобы отключить сторожевой таймер, остановите его службу:
=== Как устроен ===
<syntaxhighlight lang="bash">
В качестве программного таймера используется сервис [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>.
service watchdog stop
</syntaxhighlight>


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


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


Например, добавим слежение за nginx:
Если вы хотите навсегда отключить слежение сторожевого таймера за одним из сервисов, отредактируйте конфигурационный файл <code>/etc/watchdog.conf</code>, закомментировав строки соответствующих сервисов (в этом примере отключено слежение за nginх):
# Подключитесь к контроллеру по [[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
# 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:27, 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 (можно использовать любой) отмечены красными кружками. Фиолетовой линией показан пример соединения.

В версии Wiren Board 6.9 нет простого способа аппаратно отключить сторожевой таймер.

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

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

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

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