Linux Software Watchdog

Я пишу системный монитор для 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 должен делать дополнительные вещи (т.е. предупреждать пользователя по крайней мере).

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

3 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам