Linux Software Watchdog - PullRequest
       15

Linux Software Watchdog

14 голосов
/ 18 февраля 2009

Я пишу системный монитор для Linux и хочу включить некоторые функции сторожевого таймера. В ядре вы можете настроить сторожевой таймер так, чтобы он продолжал работать, даже если / dev / watchdog закрыт. Другими словами, если мой демон нормально выйдет и закроет / dev / watchdog, система все равно перезагрузится через 59 секунд. Это может или не может быть желательным поведением для пользователя.

Мне нужно, чтобы мой демон знал об этой настройке, потому что это повлияет на то, как я буду обрабатывать SIGINT. Если настройка включена, мой демон должен (предпочтительно) начать упорядоченное завершение работы при выходе или (по крайней мере) предупредить пользователя о том, что система вскоре перезагрузится.

Кто-нибудь знает способ получения этого параметра из пространства пользователя? Я не вижу ничего в sysconf (), чтобы получить значение. Кроме того, мне нужно знать, включен ли программный сторожевой таймер для начала.

Edit:

Linux предоставляет очень простой сторожевой интерфейс. Процесс может открыть / dev / watchdog, как только устройство откроется, ядро ​​начнет 60-секундный отсчет для перезагрузки, если только некоторые данные не будут записаны в этот файл, в этом случае часы сбрасываются.

В зависимости от того, как настроено ядро, закрытие этого файла может остановить или не остановить отсчет времени. Из документации:

Сторожевой таймер можно остановить без вызывая перезагрузку, если устройство / dev / watchdog закрыт правильно, если ваше ядро ​​не скомпилировано с опция CONFIG_WATCHDOG_NOWAYOUT включен.

Мне нужно иметь возможность определить, был ли CONFIG_WATCHDOG_NOWAYOUT установлен в демоне пространства пользователя, чтобы я мог по-разному обрабатывать выключение указанного демона. Другими словами, если этот параметр высокий, просто:

# /etc/init.d/mydaemon stop

... перезагрузит систему через 59 секунд, потому что больше ничего не записывается в / dev / watchdog. Поэтому, если оно установлено высоким, мой обработчик для SIGINT должен делать дополнительные действия (то есть, по крайней мере, предупреждать пользователя).

Я не могу найти способ получить этот параметр из пространства пользователя :( Любая помощь приветствуется.

Ответы [ 3 ]

17 голосов
/ 18 февраля 2009

AHA! Покопавшись в ядре linux/watchdog.h и drivers/watchdog/softdog.c, я смог определить возможности интерфейса softdog ioctl(). Глядя на возможности, которые он объявляет в struct watchdog_info:

static struct watchdog_info ident = {
                .options =              WDIOF_SETTIMEOUT |
                                        WDIOF_KEEPALIVEPING |
                                        WDIOF_MAGICCLOSE,
                .firmware_version =     0,
                .identity =             "Software Watchdog",
        };

Это поддерживает магическое закрытие, которое (кажется) отменяет CONFIG_WATCHDOG_NOWAYOUT. Поэтому при нормальном завершении я должен записать один символ 'V' в /dev/watchdog , затем закрыть его, и таймер перестанет считать.

Простой ioctl() в дескрипторе файла для /dev/watchdog, запрашивающий WDIOC_GETSUPPORT, позволяет определить, установлен ли этот флаг. Псевдокод:

int fd;
struct watchdog_info info;

fd = open("/dev/watchdog", O_WRONLY);
if (fd == -1) {
   perror("open");
   // abort, timer did not start - no additional concerns
}

if (ioctl(fd, WDIOC_GETSUPPORT, &info)) {
    perror("ioctl");
    // abort, but you probably started the timer! See below.
}

if (WDIOF_MAGICCLOSE & info.options) {
   printf("Watchdog supports magic close char\n");
   // You have started the timer here! Handle that appropriately.
}

При работе с аппаратными сторожевыми системами вам может потребоваться открыть с O_NONBLOCK, чтобы ioctl(), а не open() блоков (следовательно, обнаружение занятой карты).

Если WDIOF_MAGICCLOSE не поддерживается, следует просто предположить, что программный сторожевой таймер настроен на NOWAYOUT. Помните, что просто , открыв , устройство успешно начнет обратный отсчет. Если все, что вы делаете, это проверяет, поддерживает ли оно магическое закрытие, и оно делает, тогда магическое закрытие В противном случае, убедитесь, что у вас есть работающий сторожевой таймер.

К сожалению, нет реального способа узнать наверняка, не запустив его, по крайней мере, я не смог найти.

3 голосов
/ 18 февраля 2009

сторожевой таймер защищает систему от жесткой блокировки из-за сбоя программного обеспечения или аппаратного сбоя.

Вам нужен демон мониторинга демона (dmd). отметьте 'monit'

0 голосов
/ 20 февраля 2009

Я думаю, что драйверы сторожевого устройства действительно предназначены для использования на встроенных платформах (или, по крайней мере, с хорошо управляемыми), где разработчики могут контролировать, какое ядро ​​используется.

Это можно считать упущением, но я думаю, что это не так.

Еще одна вещь, которую вы могли бы попробовать: если сторожевой таймер был построен как загружаемый модуль, его выгрузка, вероятно, прервет выключение?

...