DySprozin aka xjmjk
DySprozin aka xjmjk
1339 просмотров2 комментариев

Сторожим нашу репку: Watchdog

Введение
Как и другие одноплатные компьютеры, репка всё активней находит применение в разных областях, самой ответственной из которых, пожалуй, является автоматизация производственных процессов. За ним по важности бегут и догоняют умные дома разной степени навороченности: резко поглупевший выключатель или контроллер шлагбаума в районе полуночи способен доставить массу интересных впечатлений.

Самое простое решение лежит на поверхности и знает, пожалуй, каждый: «семь бед — один резет». Проблема только в том, что в сценариях использования одноплатников обычно не предполагается оперативного доступа к ним на случай зависания, а ехать десятки/сотни километров, чтобы перезагрузить железку — так себе перспектива.

Тут-то и выходит на сцену Watchdog — программа, либо внешнее устройство, которое способно отслеживать работу железки и в случае зависания отправлять ее в ребут. Здесь мы рассмотрим реализацию средствами самой репки.

Начальная настройка
На тему, как настроить watchdog в малинке, написано столько статей, что можно по сути просто брать любую и почти наверняка настроить всё верно. Тем не менее, в RepkaOS есть свои особенности, а потому пройдем весь путь с нуля.

Начнем с редактирования загрузочного конфига

root@Repka-Pi:~# vi /boot/config-5.19.16-sunxi64

Ищем там слово WATCHDOG - можно убедиться, что он уже активирован (если нет — ставим «y» и перезагружаемся)

CONFIG_WATCHDOG=y
CONFIG_WATCHDOG_CORE=y

Убедимся, что watchdog появился в списке девайсов:

root@Repka-Pi:~# ls -l /dev/watchdog*
crw------- 1 root root  10, 130 Mar 27 17:54 /dev/watchdog
crw------- 1 root root 248,   0 Mar 27 17:54 /dev/watchdog0

Итак, со стороны железа всё работает, осталось только приделать «лапки». Установим утилиту с незамысловатым названием watchdog:

root@Repka-Pi:~# apt install watchdog

Здесь мы не будем заниматься тонкой настройкой, однако одну строчку в конфиг добавим. Открываем /etc/watchdog.conf и прописываем в конец:

watchdog-timeout        = 15

Это означает отключать устройство, если оно 15 секунд не отвечает.

Теперь включаем автозагрузку watchdog и перезагружаемся:

root@Repka-Pi:~# systemctl enable watchdog && reboot

Проверка и разбор полетов
Существует множество способов сломать репку :) Мы выберем отказ SD-карты. Если запустить поиск по содержимому файлов с корня, то репка повисает намертво. Этим и воспользуемся:

root@Repka-Pi:~# grep -rli "IamTheDanger" /

Репка выдаст несколько строчек и перестанет реагировать на любые нажатия, не будет работать даже индикатор CapsLock на клавиатуре. Через 15 секунд экран должен погаснуть и репка перезагрузится. Если не перезагрузится, то попробуйте поменять строчку в конфиге:

#watchdog-device = /dev/watchdog

на

watchdog-device = /dev/watchdog0

Получилось? Отлично! Система стала чуточку отказоустойчивей :) Однако хотелось бы понять, была ли репка перезагружена штатно или имело место нештатная ситуация: сбой по питанию, принудительный ребут или, наконец, сработавший watchdog. Теоретически это можно определить чтением особых флагов вотчдога, но у меня с ними не получилось (чуть подробней в разделе «#нытинг»).

Мы же пойдем чуточку костыльным путем, но он будет достаточно точно определять штатность перезагрузки. Исходим из того, что процесс управления watchdog должен корректно запуститься и остановиться. Выполним команду

root@Repka-Pi:~# cat /var/log/syslog | grep -ia "Repka-Pi watchdog" | grep -E "(starting|stopping)"

Нам выдаст список событий запуска и остановки watchdog:

Mar 27 17:54:25 Repka-Pi watchdog[795]: starting daemon (5.15):
Aug 23 12:57:56 Repka-Pi watchdog[795]: stopping daemon (5.15)
Mar 27 17:54:23 Repka-Pi watchdog[794]: starting daemon (5.15):
Mar 27 17:54:24 Repka-Pi watchdog[795]: starting daemon (5.15):

На дату не обращаем внимания — логично, что при отключении репки она сбрасывается. Нас интересует, что перед последним «starting daemon» нет строчки «stopping daemon». Это означает, что процесс watchdog перед последней перезагрузкой не был корректно остановлен, с большой вероятностью ребут был нештатным. Немного доработаем нашу команду:

root@Repka-Pi:~# cat /var/log/syslog | grep -ia "Repka-Pi watchdog" | grep -E "(starting|stopping)" | tail -n 2 | head -1 | grep "stopping" && echo "reboot was OK" || echo "ALARM! reboot caused by watchdog"

Здесь мы добавили:

tail -n 2 - выводим последние 2 строки
head -1 - выбираем из них первую
grep "stopping" - проверяем, что была корректная остановка процесса

Попробуйте запустить — выдаст ошибку. Теперь корректно перезагрузите репку и попробуйте заново, сможете убедиться, что команда вернет «reboot was OK».

На этом пока всё, всем добра!

DySprozin aka xjmjk, 2023 год

#нытинг

Немого нытья «а вот в малииинке». Так вот, в малинке существует возможность командой vcgencmd get_rsts прочитать системный флаг RSTS, по которому можно определить, был ли watchdog причиной ребута.

Так же в гите удалось найти код, который считывает флаги watchdog:

https://raw.githubusercontent.com/torvalds/linux/master/tools/testing/selftests/watchdog/watchdog-test.c

К сожалению, в репке при любой перезагрузке эти флаги равны нулю.

Очень надеемся, что разработчики репки обратят на этот момент внимание и можно будет более нативно отслеживать причину перезагрузки.


Комментарии (2)

Для участия в обсуждении Вы должны быть авторизованным пользователем
Команда Репки
Команда Репки  

Обложка статьи - огонь :-)
Спасибо за классную и полезную статью!!!!

DySprozin aka xjmjk
DySprozin aka xjmjk  

Спасибо на добром слове :))

Темы

Навигация

ВойтиРегистрация