2009-02-18 3 views
14

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

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

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

Edit:

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

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

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

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

# /etc/init.d/mydaemon stop 

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

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

ответ

17

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

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

+2

Подробная информация о Magic Close и IOCTL в спецификации API подтверждают комментарии выше, но предоставляют больше подробностей фона. См. [This] (http://www.mjmwired.net/kernel/Documentation/watchdog/watchdog-api.txt), например. Сначала найдено [здесь] (http://stackoverflow.com/a/2020516/939250). –

3

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

то, что вам нужно, это мониторинг демон демон (DMD). проверить «Monit»

+1

Я пишу DMD, специально для использования на паравиртуализированных гостей xen, которые также имеют некоторые функции стиля nagios (данные sysinfo записываются в xenbus, где его можно наблюдать в привилегированном домене). См. Дополнительные изменения в вопросе, я был недостаточно ясен. –

-2

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

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

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

+1

Если softdog является загружаемым модулем, жизнь становится очень легкой, так как она также принимает аргументы при загрузке (и да, разгрузка останавливает ее). Проблема в том, что на встроенных системах (над которыми я работаю, как вы сказали) вы часто видите монолитные ядра со всем как статические объекты. –

+1

Я думаю, что это было, на самом деле, немного надзорным, поэтому они позже сменили мягкий сторожевой таймер, чтобы повиноваться волшебному близкому персонажу, т. Е. Написание одного «V» на устройство, а затем его закрытие всегда останавливает обратный отсчет. –