Сторожевой таймер
Поскольку моё устройство будет трудиться вдали от заботливых сисадминских рук, мне понадобилось задействовать аппаратный watchdog, дабы в случае чего система помогла себе сама. Работает это просто как бревно: аппаратный счётчик инициализируется некоторым значением и отсчитывает назад, как только значение обнулится, произойдёт аппаратный сброс процессора. Чтобы этого не произошло, мы должны программно с приемлемым интервалом реинициализировать счетчик.
Функции watchdog таймера на Raspberry Pi реализованы модулем bcm2708_wdog. А использовать его мы будем посредством сервиса watchdog:
# ставим сервис
sudo apt-get install watchdog
# указываем используемый модуль
sudo nano /etc/default/watchdog
# меняем watchdog_module="none"
# на watchdog_module="bcm2708_wdog"
# указываем используемое устройство
sudo nano /etc/watchdog.conf
# раскомментируем строку:
# watchdog-device = /dev/watchdog
# убедимся, что сторожевой таймер запущен в режиме
# реального времени, иначе могут быть проблемы:
# realtime = yes
# priority = 1
# закомментируем строки, которые потенциально могут
# вызвать проблемы, вроде этой:
# pidfile = /var/run/syslogd.pid
# как видно, здесь ещё много чего интересного
# можно настроить, например реакцию на перегрузку
# (строки max-load-*)
# настраиваем модуль
sudo nano /etc/modprobe.d/watchdog.conf
# добавляем options bcm2708_wdog heartbeat=15
# параметр heartbeat указывает число секунд,
# которое должно пройти до аппаратного сброса
# перезапускаем сервис
sudo service watchdog restart
Итак, сторожевой таймер работает, но хотелось бы как-то убедиться в этом воочию. Есть много способов проверки:
Форк-бомба. Цепная реакция с рекурсивным порождением дочерних процессов. Классическая реализация на Bash: (: (){ :|:& };
. Будет работать только если мы науськали нашего пса дергать сброс при перегрузке системы (раскомментировали строки max-load-* в конфиге). Если нет, можно попробовать запустить вочдог не в realtime и взорвать форк-бомбу, но должного эффекта придётся прилично подождать.
Модуль panic.ko. Более действенный способ, если не лень собирать, сработает в любом случае, ибо «убъёт систему окончательно и бесповоротно» (шутка).
Тупо убить процесс сервиса (sudo killall watchdog). В таком случае работа с устройством /dev/watchdog будет завершена некорректно, туда просто перестанут поступать сигналы реинициализации, и через указанные нами 15 секунд произойдёт аппаратный сброс. Ввиду своей лени этот способ я и применил. Сработало.