Введение
Как и другие одноплатные компьютеры, репка всё активней находит применение в разных областях, самой ответственной из которых, пожалуй, является автоматизация производственных процессов. За ним по важности бегут и догоняют умные дома разной степени навороченности: резко поглупевший выключатель или контроллер шлагбаума в районе полуночи способен доставить массу интересных впечатлений.
Самое простое решение лежит на поверхности и знает, пожалуй, каждый: «семь бед — один резет». Проблема только в том, что в сценариях использования одноплатников обычно не предполагается оперативного доступа к ним на случай зависания, а ехать десятки/сотни километров, чтобы перезагрузить железку — так себе перспектива.
Тут-то и выходит на сцену 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
К сожалению, в репке при любой перезагрузке эти флаги равны нулю.
Очень надеемся, что разработчики репки обратят на этот момент внимание и можно будет более нативно отслеживать причину перезагрузки.
Обложка статьи - огонь :-)
Спасибо за классную и полезную статью!!!!
Спасибо на добром слове :))