Из пользовательского пространства, как я могу определить, настроен ли программный сторожевой таймер Linux без выхода?

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

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

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

Изменить:

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

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

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

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

# /etc/init.d/mydaemon stop

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

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


person Tim Post♦    schedule 18.02.2009    source источник


Ответы (3)


АГА! Покопавшись в 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. Помните, что просто открытие устройства успешно запускает обратный отсчет. Если все, что вы делаете, это проверяете, поддерживает ли он магическое закрытие, и оно действительно есть, то закрытие магией. В противном случае обязательно учитывайте тот факт, что теперь у вас работает сторожевой пес.

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

person Tim Post♦    schedule 18.02.2009
comment
Подробные сведения о Magic Close и IOCTL в спецификации API подтверждают приведенные выше комментарии, но предоставляют более подробную справочную информацию. См., Например, this. Впервые нашел здесь. - person Donal Lafferty; 25.01.2012

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

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

person Javier    schedule 18.02.2009
comment
Я пишу DMD специально для использования на паравиртуализированных гостевых системах xen, которые также имеют некоторые функциональные возможности в стиле nagios (данные sysinfo записываются в xenbus, где они могут просматриваться привилегированным доменом). Пожалуйста, просмотрите дополнительные правки к вопросу, я не достаточно ясен. - person Tim Post♦; 18.02.2009

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

Это можно было бы считать недосмотром, но я думаю, что это не так.

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

person MarkR    schedule 20.02.2009
comment
Если softdog является загружаемым модулем, жизнь становится очень простой, поскольку он также принимает аргументы при загрузке (и да, выгрузка останавливает его). Проблема в том, что во встроенных системах (над которыми я работаю, как вы сказали) вы часто видите монолитные ядра со всем как статическими объектами. - person Tim Post♦; 21.02.2009
comment
Я думаю, что на самом деле это была небольшая оплошность, поэтому позже они изменили программный сторожевой таймер так, чтобы он подчинялся магическому закрывающему символу ... то есть записывая одну букву 'V' на устройство, а затем закрывая его, всегда останавливает обратный отсчет. - person Tim Post♦; 21.02.2009