Столкнулся с существенным регрессом в 12-й версии SLES, связанным с поддержкой сторожевого таймера (устройство /dev/watchdog) на серверах IBM/Lenovo.
Вначале коротенький ликбез, если кто не в теме. Как это должно работать и зачем это нужно? Кто и так знает предмет, может спокойно пропустить следующий абзац.
В составе серверных и промышленных платформ имеется специальная схема – сторожевой таймер. Будучи активированным, он начинает отсчитывать заданное время (например, одну минуту). Если за это время к нему повторно не обратиться, то в конце интервала будет выполнена аппаратная перазагрузка. Если обратиться, то интервал начинает отсчитываться заново. Это нужно для того, чтобы автоматически восстановить работоспособность компьютера в случае зависания операционной системы или предоставляющего какой-то важный сервис программного обеспечения. Такое решение в обязательном порядке применяется в кластерах высокой готовности (HA) и других применениях, требующих постоянной готовности системы. Для компьютеров с архитектурой Intel используется несколько аппаратных интерфейсов сторожевого таймера, в зависимости от производителя системы, из них наиболее распространённым является Intel TCO (iTCO). В Linux драйверы сторожевого таймера реализованы как модули ядра, которые предоставляют программный интерфейс к нему в виде устройства /dev/watchdog.
В Intel-серверах IBM, которые теперь выпускаются фирмой Lenovo, за интерфейс к сторожевому таймеру отвечает аппаратный уровень Intel TCO и поддерживающий его модуль ядра Linux iTCO_wdt. В SLES версии 11 всё с этим было хорошо и работало автоматически, устройство /dev/watchdog, поддерживаемое драйвером iTCO_wdt, появлялось в системе при настройках по умолчанию. Однако, в 12-й версии SLES драйвер iTCO_wdt переписали, сократив его размер в 3 раза, и что-то сломали.
Теперь (в SLES12) происходит следующее. Модуль iTCO_wdt загружается, оставляет в системном журнале диагностику: “iTCO_wdt: unable to reset NO_REBOOT flag, device disabled by hardware/BIOS”, остаётся загруженным в память, но ничего не делает, и устройство /dev/watchdog не появляется. Ручная загрузка и выгрузка модуля ничего не меняет в этом поведении. Настройки BIOS и интегрированного сервисного модуля (IMM) тоже никак на это не влияют. Проблема совершенно одинаково проявляется на нескольких серверах IBM/Lenovo HS23 и x3250. Если на той же машине загрузить SLES11, всё работает отлично.
Обходным путём решения вопроса может являться прописывание в /etc/modules-load.d модуля softdog, предоставляющего интерфейс к сторожевому таймеру путём его программной эмуляции на уровне ядра ОС. Но по сути, это просто заглушка, никак не решающая вопрос возможного отказа самой операционной системы.
Хуже того, в одном из недавних промежуточных обновлений SLES12 драйвер softdog грузился по умолчанию. Хотя такое поведение очень скоро отключили обратно, но теперь мы не можем быть уверены, аппаратный или программный драйвер предоставляет вам сервис сторожевого таймера, пока не проверим конкретную версию Linux.
Я передал диагностическую информацию и описание ошибки разработчикам ядра из Novell и веду работу по инциденту со службой поддержки IBM/Lenovo, но уже два месяца ситуация не разрешается, хотя формально SLES12 является полностью поддерживаемой и рекомендуемой операционной системой для указанных серверов. Так что, если читатель вдруг столкнётся с неработоспособностью сторожевого таймера (приводящей, например, к невозможности запустить кластер) или с неполнотой реализации его функций, связанных с подменой аппаратного драйвера программным, то, по крайней мере, будет знать, где копать.
Автор: vadimr