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 — нажать и держать кнопку кнопку 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. Фиолетовой стрелкой показан пример подключения.
-
Способы отключения аппаратного таймера в разных версиях контроллера
![]()
Wiren Board 7.4. Зажать кнопку B1 или запаять перемычку Watchdog OFF
![]()
Wiren Board 7.2. Запаять перемычку Watchdog OFF
![]()
Wiren Board 6.8. Подключить WD к +5V
![]()
Wiren Board 6.7. Подключить WD к GND
![]()
Wiren Board 6. Подключить контакт ON/OFF к GND
![]()
Wiren Board 5. Подключить контакт ON/OFF к GND
Программный
Как устроен
В качестве программного таймера используется сервис watchdog, который каждые 30 секунд смотрит, запущен ли указанный в конфигурации сервис. Если какой-то из отслеживаемых сервисов упадёт — watchdog отправит всем процессам сигнал SIGTERM, что приведёт к перезагрузке ОС. В логе при этом появится строчка вида: systemd-journald[139]: Received SIGTERM from PID xxxx (watchdog) .
Ещё этот сервис сообщает о нормальной работе операционной системы аппаратному таймеру через сброс его счётчика. А пока сервис не запущен в первые секунды включения контроллера — счётчик аппаратного таймера сбрасывает загрузчик.
Конфигурирование
По умолчанию отслеживается только sshd, вы можете добавлять свои сервисы, которые отвечают за бизнес-логику вашей системы автоматизации.
Чтобы отредактировать конфигурацию сервиса watchdog, нужно его корректно остановить, а пока сервис будет остановлен, счётчик аппаратного таймера будет сбрасывать процессор.
Например, добавим слежение за nginx:
- Подключитесь к контроллеру по SSH.
- Остановите сервис:
systemctl stop watchdog
nano /etc/watchdog.conf
# Test if vital daemons are running pidfile = /var/run/sshd.pid pidfile = /var/run/nginx.pid
systemctl start watchdog
Отключение
Если вы добавили слежение за каким-то сервисом, а он не запускается — контроллер будет загружать операционную систему, а потом перезагружаться.
Чтобы всё исправить, сразу после загрузки операционной системы остановите watchdog, на это у вас есть несколько секунд:
- Подключитесь к контроллеру через Debug Console.
- Если у вас контроллер Wiren Board 7.2 и старее — включите контроллер переключателем.
- Дождитесь загрузки операционной системы и приглашения login.
- Войдите в командную строку контроллера, для этого нажмите Enter и введите логин / пароль.
- Остановите сервис:
systemctl stop watchdog
systemctl start watchdog
Перезагрузки должны прекратиться.
Установка и настройка Watchdog
Сторожевой таймер (Watchdog timer) — аппаратно реализованная схема контроля над зависанием системы. Представляет собой таймер, который периодически сбрасывается контролируемой системой. Если сброса не произошло в течение некоторого интервала времени, происходит принудительная перезагрузка системы. В некоторых случаях сторожевой таймер может посылать системе сигнал на перезагрузку («мягкая» перезагрузка), в других же — перезагрузка происходит аппаратно (замыканием сигнального провода RST или подобного ему).
Установка в Linux Ubuntu/Debian:
sudo apt-get install watchdog
Список некоторых файлов которые будут установлены в систему:
- /etc/init.d/watchdog
- /etc/init.d/wd_keepalive
- /etc/watchdog.conf
- /etc/default/watchdog
- /dev/watchdog
- /usr/sbin/watchdog
- /usr/sbin/wd_identify
- /usr/sbin/wd_keepalive
- /usr/share/doc/watchdog/
- /usr/share/man/man5/watchdog.conf.5.gz
- /usr/share/man/man8/watchdog.8.gz
- /usr/share/man/man8/wd_identify.8.gz
- /usr/share/man/man8/wd_keepalive.8.gz
Возможные параметры конфига /etc/watchdog.conf:
interval =
Интервал между двумя операциями записи в watchdog устройство. Значение по умолчанию составляет 10 секунд. Интервал больше минуты может быть использованы только параметром -f из командной строки.
logtick =
Если пишутся логи, можно пропускать запись событий каждое указанно количество интервалов. Например если logtick = 60 и interval 10, получится 600 секунд, то есть в логируемый файл будет добавляться запись не чаще одного раза в 10 минут.
max-load-1 =
Максимально разрешенное значение загрузки системы за 1 минуту при превышении которого система перезагрузится. 0 — отключает проверку.
max-load-5 =
Максимально разрешенное значение загрузки системы за 5 минуту при превышении которого система перезагрузится. 0 — отключает проверку.
max-load-15 =
Максимально разрешенное значение загрузки системы за 15 минуту при превышении которого система перезагрузится. 0 — отключает проверку.
min-memory =
Установка минимального количества виртуальной памяти которое должно быть свободно. 0 — проверка отключено.
max-temperature =
Установка максимально разрешенной температуры.
watchdog-device =
Установка имени устройства.
temperature-device =
Установка имени устройства температуры.
file =
Файловый режим, проверка файлов.
change =
Интервал времени для файлового режима.
pidfile =
Имя pid файла. Можно добавить отслеживаемый процесс, например «pidfile = /var/run/apache2.pid». В случае невозможности запуска процесса watchdog будет постоянно перезагружать систему.
ping =
Режим пинга, для проверки сетевых соединений. Опция может быть использована более одного раза.
interface =
Установка имени сетевого интерфейса.
test-binary =
Выполнение пользовательского теста.
test-timeout =
Тест может выполняться указанное количество секунд. 0 — неограничено.
repair-binary =
Выполняется при невозможности перезагрузки системы.
admin =
Адрес email для уведомлений, можно оставить значение пустым для отключения.
realtime =
Yes для невозможности выгрузки watchdog из оперативной памяти.
priority =
Установка приоритета для режима realtime.
Пример настройки с Intel TCO Watchog Timer.
Загрузка модуля:
sudo modprobe iTCO_wdt
В /etc/watchdog.conf должно быть раскоментировано/добавлено:
watchdog-device = /dev/watchdog interval = 10
В /etc/default/watchdog указать имя модуля:
watchdog_module="iTCO_wdt"
Можно добавить опцию отладки чтобы в syslog журнал писалась отладочная информация:
watchdog_options="-v"
sudo /etc/init.d/watchdog restart
Мониторить в реальном времени записи syslog можно командой:
tail -f /var/log/syslog
watchdog apache linux

Иногда бывает apache падает по той или иной причине, не всегда есть возможность оперативно проверить и подключится что случилось, в такие моменты хорошо подойдет watchdog apache.
Вобщем накатал простой скрипт передергивания apache (watchdog)если он отдает ответ отличный от 200:
Watchdog (сторожевой таймер) в Linux
Watchdog (сторожевой таймер) — аппаратно реализованная схема контроля над зависанием системы.
Сторожевые таймеры используются в системах, которые должны работать без надзора человека. Такие системы должны быть само восстанавливающимися без участия оператора.
В контроллерах JetHome JetHub на базе процессоров Amlogic поддерживается драйвер аппаратного watchdog meson_wdt .
Проверка устройств
При корректно запущенном модулей watchdog в системе /dev должны быть видны устройства /dev/watchdog и /dev/watchdog0 :
$ ls -l /dev/watchdog* crw-rw---- 1 root root 10, 130 2019-01-01 00:00 /dev/watchdog crw-rw---- 1 root root 10, 130 2019-01-01 00:00 /dev/watchdog0
Установка сервиса Watchdog
В прошивках начиная с версии Armbian 22.02 watchdog предустановлен, ручная установка не требуется.
Для установки сервиса watchdog выполните следующие команды:
sudo apt-get update sudo apt-get install watchdog
Создайте папку для лог-файлов watchdog:
sudo mkdir -p /var/log/watchdog
Проверьте настройки для сервиса в файле /etc/default/watchdog :
# Start watchdog at boot time? 0 or 1 run_watchdog=1 # Start wd_keepalive after stopping watchdog? 0 or 1 run_wd_keepalive=1 # Load module before starting watchdog watchdog_module="none" # Specify additional watchdog options here (see manpage). watchdog_options="-s -v -c /etc/watchdog.conf"
Конфигурационные файлы
Внесите необходимые изменения в конфигурационный файл /etc/watchdog.conf :
- Раскомментируйте использование устройства /dev/watchdog (иначе сервис watchdog не будет использовать аппаратный таймер для перезагрузки контроллера).
- Установите необходимые проверки и таймауты.
Ниже приведен пример конфигурационного файла, с установленным таймаутом 15 секунд на зависание:
Примечание
Значение watchdog-timeout определяет через какое время после аварии сервиса watchdog аппаратный таймер перезагрузит контроллер.
$ cat /etc/watchdog.conf #ping = 172.31.14.1 #ping = 172.26.1.255 #interface = eth0 #file = /var/log/messages #change = 1407 # Uncomment to enable test. Setting one of these values to '0' disables it. # These values will hopefully never reboot your machine during normal use # (if your machine is really hung, the loadavg will go much higher than 25) #max-load-1 = 24 #max-load-5 = 18 #max-load-15 = 12 # Note that this is the number of pages! # To get the real size, check how large the pagesize is on your machine. #min-memory = 1 #allocatable-memory = 1 #repair-binary = /usr/sbin/repair #repair-timeout = 60 #test-binary = #test-timeout = 60 # The retry-timeout and repair limit are used to handle errors in a more robust # manner. Errors must persist for longer than retry-timeout to action a repair # or reboot, and if repair-maximum attempts are made without the test passing a # reboot is initiated anyway. #retry-timeout = 60 #repair-maximum = 1 watchdog-device = /dev/watchdog # Defaults compiled into the binary #temperature-sensor = #max-temperature = 90 # Defaults compiled into the binary #admin = root #interval = 1 #logtick = 1 #log-dir = /var/log/watchdog # This greatly decreases the chance that watchdog won't be scheduled before # your machine is really loaded realtime = yes priority = 1 # Check if rsyslogd is still running by enabling the following line #pidfile = /var/run/rsyslogd.pid watchdog-timeout = 15
Автозапуск и проверка сервиса
Для включения автозапуска сервиса выполните следующие команды:
sudo systemctl enable watchdog sudo systemctl start watchdog
Проверка работоспособности сервиса:
service watchdog status
● watchdog.service - watchdog daemon Loaded: loaded (/lib/systemd/system/watchdog.service; enabled; vendor pres> Active: active (running) since Mon 2022-02-21 17:29:24 UTC; 17h ago Process: 2718 ExecStartPre=/bin/sh -c [ -z "$watchdog_module>" ] || [ "$w> Process: 2720 ExecStart=/bin/sh -c [ $run_watchdog != 1 ] || exec /usr/sbin> Main PID: 2722 (watchdog) Tasks: 1 (limit: 977) Memory: 516.0K CPU: 3min 33.528s CGroup: /system.slice/watchdog.service └─2722 /usr/sbin/watchdog -s -v -c /etc/watchdog.conf Feb 22 10:52:23 jethubj100 watchdog[2722]: still alive after 62076 interval(s) Feb 22 10:52:24 jethubj100 watchdog[2722]: still alive after 62077 interval(s) Feb 22 10:52:25 jethubj100 watchdog[2722]: still alive after 62078 interval(s) Feb 22 10:52:26 jethubj100 watchdog[2722]: still alive after 62079 interval(s) Feb 22 10:52:27 jethubj100 watchdog[2722]: still alive after 62080 interval(s) Feb 22 10:52:28 jethubj100 watchdog[2722]: still alive after 62081 interval(s) Feb 22 10:52:29 jethubj100 watchdog[2722]: still alive after 62082 interval(s)
Настроенный и запущенный сервис watchdog постоянно сбрасывает аппаратный сторожевой таймер.
Если он не сможет этого сделать (например, в случае если зависла система или наступило любое другое настроенное в конфигурации условие), таймер сработает и перезагрузит контроллер.
Проверка сторожевого таймера
Будьте осторожны: команды в этом разделе приводят к панике ядра и полной остановке работы контроллера.
Используйте их только в тестовой среде!
Следующая команда приводит к искусственному сбою ядра linux. Если watchdog работает правильно, то он автоматически перезагрузит систему после таймаута:
echo c > /proc/sysrq-trigger
[63168.053150] sysrq: Trigger a crash [63168.053204] Kernel panic - not syncing: sysrq triggered crash [63168.056648] CPU: 3 PID: 65544 Comm: bash Not tainted 5.15.24-meson64 #trunk.0045.jethome.0 [63168.064838] Hardware name: JetHome JetHub J100 (DT) [63168.069670] Call trace: [63168.072082] dump_backtrace+0x0/0x200 [63168.075706] show_stack+0x18/0x68 [63168.078982] dump_stack_lvl+0x68/0x84 [63168.082605] dump_stack+0x18/0x34 [63168.085882] panic+0x164/0x324 [63168.088901] sysrq_handle_crash+0x1c/0x20 [63168.092869] __handle_sysrq+0x8c/0x160 [63168.096577] write_sysrq_trigger+0x88/0x120 [63168.100719] proc_reg_write+0xac/0xf8 [63168.104340] vfs_write+0xbc/0x398 [63168.107618] ksys_write+0x68/0xf0 [63168.110895] __arm64_sys_write+0x1c/0x28 [63168.114776] invoke_syscall+0x44/0x108 [63168.118485] el0_svc_common.constprop.3+0x94/0xf8 [63168.123143] do_el0_svc+0x24/0x88 [63168.126420] el0_svc+0x20/0x50 [63168.129439] el0t_64_sync_handler+0x90/0xb8 [63168.133579] el0t_64_sync+0x180/0x184 [63168.137206] SMP: stopping secondary CPUs [63168.141091] Kernel Offset: disabled [63168.144533] CPU features: 0x00001001,00000846 [63168.148845] Memory Limit: none [63168.151871] ---[ end Kernel panic - not syncing: sysrq triggered crash ]--- AXG:BL1:d1dbf2:a4926f;FEAT:E0DC318C:2000;POC:F;EMMC:0;READ:0;0.0;CHK:0; sdio debug board detected TE: 33151
Пауза 15 секунд (в соответствии с значением watchdog_timeout в конфигурационном файле), далее:
BL2 Built : 10:43:22, May 26 2021. axg g28b9431 - jenkins@walle02-sh set vcck to 1100 mv set vddee to 950 mv Board ID = 9 CPU clk: 1200MHz DDR low power enabled DDR3 chl: Rank0 16bit @ 912MHz bist_test rank: 0 1b 02 34 24 0b 3d 17 00 2f 27 0e 40 00 00 00 00 00 00 00 00 00 00 00 00 761 - PASS Rank0: 1024MB(auto)-2T-13 AddrBus test pass! eMMC boot @ 0 sw8 s storage init finish emmc switch 3 ok Authentication key not yet programmed get rpmb counter error 0x00000007 emmc switch 0 ok Load FIP TMP HDR from eMMC, src: 0x0000c200, des: 0x05100000, size: 0x00004000, part: 0 0001c000Load BL31 from eMMC, src: 0x0001c200, des: 0x05104000, size: 0x0002ac00, part: 0 bl2z: ptr: 05127358, size: 00001e18 Load FIP HDR from eMMC, src: 0x0000c200, des: 0x01700000, size: 0x00004000, part: 0 Load BL3x from eMMC, src: 0x00010200, des: 0x01704000, size: 0x0008e400, part: 0 NOTICE: BL31: v1.3(release):110e239 NOTICE: BL31: Built : 19:07:23, Jul 2 2018 NOTICE: BL31: AXG normal boot! NOTICE: BL31: BL33 decompress pass [Image: axg_v1.1.3326-d0bacc8 2018-07-05 11:21:34 jenkins@walle02-sh] OPS=0x43 25 0b 43 00 88 fc 1a 07 8d 24 0c 3a b2 65 16 59 bl30:axg ver: 9 mode: 0 bl30:axg thermal0 [0.015862 Inits done] secure task start! high task start! low task start! ERROR: Error initializing runtime service opteed_fast U-Boot 2022.01-armbian (Feb 08 2022 - 06:07:00 +0000) jethubj100
© Copyright 2023, JetHome. Обновлено: 26.01.2023 16:59:03 UTC.