Watchdog в контроллерах Wiren Board
Принцип работы
В контроллере есть два сторожевых таймера (англ. 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, 8.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:
- Подключитесь к контроллеру по SSH.
- Остановите сервис:
systemctl stop watchdog
- Внесите изменения в конфигурационный файл:
nano /etc/watchdog.conf
- Добавьте новую запись с pidfile:
# Test if vital daemons are running pidfile = /var/run/sshd.pid pidfile = /var/run/nginx.pid
- Нажмите Ctrl+S для сохранения изменений, Ctrl+X — для выхода из редактора.
- Запустите сервис:
systemctl start watchdog
Отключение
Если вы добавили слежение за каким-то сервисом, а он не запускается — контроллер будет загружать операционную систему, а потом перезагружаться.
Чтобы всё исправить, сразу после загрузки операционной системы остановите watchdog, на это у вас есть несколько секунд:
- Подключитесь к контроллеру через Debug Console.
- Если у вас контроллер Wiren Board 7.2 и старее — включите контроллер переключателем.
- Дождитесь загрузки операционной системы и приглашения login.
- Войдите в командную строку контроллера, для этого нажмите Enter и введите логин / пароль.
- Остановите сервис:
systemctl stop watchdog
- Исправьте проблему с отслеживаемым сервисом, или уберите его из файла конфигурации
/etc/watchdog.conf
. - Запустите сервис:
systemctl start watchdog
Перезагрузки должны прекратиться.