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

Материал из Wiren Board
м (Fix typo)
 
(не показано 39 промежуточных версий 7 участников)
Строка 1: Строка 1:
<languages/>
{{DISPLAYTITLE:Watchdog в контроллерах Wiren Board}}
<translate>
== Принцип работы ==
<!--T:1-->
В контроллере есть два сторожевых таймера (англ. watchdog): программный и аппаратный, которые дополняют друг друга.  
'''Сторожевой таймер''' (англ. ''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-->
Реализация аппаратного таймера зависит от версии контроллера:
Для отключения требуется [[Special:MyLanguage/Разбираем корпус контроллера|разобрать корпус контроллера]] и соединить один из выводов разъема ON/OFF с GND.
* Wiren Board 7.4 и новее — сделан на [[Wiren_Board_Embedded_Controller|Embedded Controller]], считает до 60 секунд и сбрасывает питание контроллера.
* Wiren Board 5, Wiren Board 6, Wiren Board 7 — сделан на специальной микросхеме-компараторе, считает до 15 секунд и сбрасывает питание контроллера.


<!--T:3-->
В актуальном ПО контроллера таймер представлен устройством <code>/dev/watchdog1</code>.
{| class="wikitable"
! [[File:Watchdog_disable_wb5.png|550px|thumb|left|Wiren Board 5]]
! [[File:Watchdog_disable_wb6.png|550px|thumb|center|Wiren Board 6]]
|}


<!--T:4-->
===Отключение===
На иллюстрациях показано, какие выводы необходимо соединить для этого в контроллерах Wiren Board 5 и WirenBoard 6. Нужный вывод разъема ON/OFF отмечен красной стрелкой, выводы GND (можно использовать любой) отмечены красными кружками. Фиолетовой линией показан пример соединения.
Если операционная система контроллера не загружается, а контроллер находится в циклической перезагрузке — нужно отключить аппаратный таймер.
Процедура зависит от версии контроллера, [[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. Фиолетовой стрелкой показан пример подключения.
<syntaxhighlight lang="bash">
 
service wb-mqtt-serial stop #остановить драйвер
<gallery mode="packed" heights="200px" caption="Способы отключения аппаратного таймера в разных версиях контроллера">
service wb-mqtt-serial start #запустить драйвер
Image: Wiren Board EC LED1.jpg | Wiren Board 7.4 и новее. Зажать кнопку B1 или запаять перемычку Watchdog OFF
service wb-mqtt-serial restart #перезапустить драйвер
Image: wb7.2.1 watchdog-off.jpg | Wiren Board 7.2…7.3. Запаять перемычку Watchdog OFF
wb-mqtt-serial -c /etc/wb-mqtt-serial.conf -d #запустить драйвер в принудительном отладочном режиме с указанием пути к конфигурационному файлу
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>
</syntaxhighlight>


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

Текущая версия на 13:09, 12 апреля 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
    

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