Kernel/watchdog

Материал из ALT Linux Wiki
< Kernel
Версия от 21:41, 26 августа 2024; Vt (обсуждение | вклад) (ipmi_watchdog)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)

Для автоматического восстановления работоспособности системы после зависания может быть полезно настроить hardware watchdog. Watchdog заменяет зависании на перезагрузку, что может быть полезно в случае, если работа оборудования или системы нестабильна, но нужно минимизировать простой, а reset помогает.

Watchdog модули ядра имеют в имени "wdt" (сокращение от watchdog timer). Следует понимать что даже успешно загрузившийся модуль может фактически не работать (его reset сигнал не перезагружает систему) - тут все зависит от производителя оборудования. Лучшим hardware watchdog драйвером (на мой взгляд) является ipmi_watchdog, так как iPMI умеет делать power cycle, а не просто reset. Если его нет, то вот неплохой список с чего начать поиск рабочего драйвера: it87_wdt it8712f_wdt w83627hf_wdt w83877f_wdt w83977f_wdt.

Внимание! Важно, что watchdog делает ресет системе, это аналог внезапного нажатия кнопки ресет, это не мягкая перезагрузка как при shutdown! Поэтому, несохраненная информация может быть потеряна или может произойти сбой файловой системы. Ваш workflow должен учитывать эти риски, например, регулярно делайте резервное копирование. ⚠️


Пример настройки

  • Установите пакет watchdog он содержит user-space компонент, который будет пингать драйвер. По умолчанию сервис watchdog будет не запущен.
  • Перекройте blacklist-watchdog.conf от kmod и далее работайте с новым файлом - так как файл из /lib/modprobe.d обновится при апдейте системы:
 # cp /lib/modprobe.d/blacklist-watchdog.conf /etc/modprobe.d/
  • Добавьте в новый конфиг файл оставшиеся wdt модули, которые могли загрузиться, но быть при этом нерабочими, часто это iTCO_wdt. Посмотреть список уже загруженных wdt модулей: lsmod | grep wdt
  • Найдите рабочий watchdog драйвер.
  • Удалите найденный рабочий модуль из созданного выше blacklist-watchdog.conf. Например, для w83627hf_wdt, удалите или закомментируйте там строку blacklist w83627hf_wdt. Это важно сделать для следующего шага.
  • Добавьте найденный модуль в автозагрузку после старта системы. Для этого создайте новый conf файл в /etc/modules-load.d/ например, wdt.conf с содержимым w83627hf_wdt. После ребута systemd-modules-load.service его загрузит (если он не в блэклисте).
  • Загруженный модуль создаст устройство /dev/watchdog0.
  • Для проверки - команда wdctl /dev/watchdog0 должна показать информацию по устройству. (Это работает только до того как загружен watchdog сервис, так как он захватывает устройство.)
  • Пропишите в /etc/watchdog.conf строку:
 watchdog-device         = /dev/watchdog0
  • Протестируйте, что watchdog работает - ⚠ предварительно закройте все приложения, чтоб не потерять данные ⚠,

запустите sync, вручную запустите watchdog -F и остановите этот процесс нажав ^Z, после исчерпания watchdog-timeout система должна перезагрузиться.

  • Если всё прошло успешно, то разрешите и запустите watchdog сервис через systemctl.

ipmi-watchdog

После запуска watchdog сервиса wdctl больше не сможет показать информацию по устройству:

 # wdctl /dev/watchdog
 wdctl: cannot read information about /dev/watchdog: No such file or directory

Убедиться, что ipmi_watchdog запущен можно через ipmitool:

 # ipmitool mc watchdog get
 Watchdog Timer Use:     SMS/OS (0x44)
 Watchdog Timer Is:      Started/Running
 Watchdog Timer Logging: On
 Watchdog Timer Action:  Hard Reset (0x01)
 Pre-timeout interrupt:  None
 Pre-timeout interval:   0 seconds
 Timer Expiration Flags: None (0x00)
 Initial Countdown:      60.0 sec
 Present Countdown:      59.1 sec

На не запущенном устройстве соответствующие строки будут такие:

 Watchdog Timer Is:      Stopped
 Watchdog Timer Action:  No action (0x00)
 ...
 Present Countdown:      60.0 sec