Каждый сисадмин, в чьём хозяйстве имеется хотя бы одна «железяка», до которой так просто не дотянешься, рано или поздно задумывается на тему сторожевых таймеров, в оригинале именуемых watchdog'ами. Пресловутая железка может быть сервером, роутером, точкой доступа или ещё чем-нибудь, главных условий тут два: железка, во-первых, должна уметь «зависать» (если она никогда не виснет, то её хозяина можно поздравить: в сторожевом таймере он не нуждается) и, во-вторых, на то, чтобы железяку передёрнуть, должно уходить ненулевое количество усилий. Если периодически зависающий аппарат стоит у вас на столе или под столом, проблем особых вроде бы нет: доянулся до кнопочки, и готово. Если от кнопки вас отделяет сорок метров коридора и запертая дверь, то не исключено, что ходить туда-сюда вам быстро надоест. Если же проклятая «кнопка» расположена на другом конце города, или даже в другом городе, а то и в другой стране (да, такое тоже бывает) — то тут вам может помочь «дистанционно управляемая бабушка»: под этим собирательным названием скрываются, как правило, дежурные по помещениям, где размещено ваше оборудование. До них приходится дозваниваться, объяснять, кто вы и по какому поводу, где там находится зависший агрегат, как его найти и отличить от других, где там пресловутая кнопка и на сколько секунд её надо нажать. Квалификация такого дежурного часто оставляет желать много лучшего, к тому же в самый нужный момент его может не оказаться на месте; больше того, бывают и такие ситуации, когда никакого обслуживающего персонала в месте размещения вашей железки вообще не предусмотрено.
Впрочем, даже если вы — счастливый обладатель собственной серверной, вход в которую расположен в метре от вашего любимого вертящегося кресла, не стоит спешить радоваться. Законы Мёрфи никто не отменял, так что вероятность зависания сервера прямо пропорциональна его важности для пользователей, столь же прямо пропорциональна возможным убыткам, и, что совершенно характерно, опять-таки прямо пропорциональна вашему от него расстоянию. Можете быть уверены, что именно тогда, когда вы катаетесь на горных лыжах где-нибудь в Альпах или хотя бы в Приэльбрусье, а ваш помощник, набегавшись за день по дальним закоулкам вверенной вам сети, спит без задних ног у себя дома, совершенно не реагируя на телефонные звонки и прочие раздражители,— именно тогда, в полном соответствии с пресловутыми законами, на вашей площадке зависнет Именно Та Машина, Без Которой Не Работает Вообще Ничего. Если на эту страницу вы попали через поисковик — скорее всего, нечто подобное с вами только что произошло, иначе с чего бы вам искать в Интернете слово Watchdog.
Это слово в рассматриваемом нами околокомпьютерном контексте обычно переводят с английского словосочетанием «сторожевой таймер», что, впрочем, не совсем точно: на самом деле английское watchdog обозначает в буквальном смысле сторожевого пса, то есть такую собаку, которую посадили на цепь и заставили нести охранную службу, а в смысле переносном англосаксы называют так любого, кто исполняет функции наблюдателя-контролёра; для обозначения электронного устройства, автоматически передёргивающего зависший компьютер, официально применяется словосочетание watchdog timer, часто сокращаемое до одного слова watchdog. Принцип работы сторожевого таймера очень прост. Пока компьютер функционирует нормально, он через определённые промежутки времени должен каким-то способом сообщать устройству-сторожевому таймеру, что всё покамест в порядке; обычно при этом таймер просто сбрасывается и начинает отсчёт времени с нуля. Если же его вовремя не сбросить, то, досчитав до определённого момента, таймер либо замкнёт на полсекунды цепь кнопки Reset, либо, наоборот, разомкнёт на несколько секунд цепь питания компьютера, тем самым перезагрузив его. Например, можно настроить watchdog на перезагрузку компьютера через две минуты после начала отсчёта, а сам компьютер настроить на сброс таймера watchdog'а с минутным интервалом.
Сегодня мы расскажем, как превратить в watchdog любое из устройств серии UNX0xx и какие преимущества в виде возможностей дальнейшего расширения вы при этом получите. Мы предполагаем, что устройство, которое вам предстоит перезагружать, представляет собой компьютер под управлением ОС Linux или Windows, обладает портом USB и может быть настроено на периодический (например, один раз в минуту) запуск определённой команды. Обратите внимание, что на рынке, в принципе, можно найти устройства, специально предназначенные для использования в роли watchdog'а, но их стоимость «внезапно» оказывается выше, чем стоимость наших устройств.
Основной сценарий использования устройства видится примерно таким. Допустим, мы для нашей главной задачи — «передёргивания» пресловутой железки — будем использовать управляемую линию основной группы с номером 1; этот вариант применим к любому из наших универсальных контроллеров, а остальные три линии основной группы, как и слоты расширения, можно позже использовать, чтобы реализовать всевозможные дополнительные функции. Нам нужно сделать так, чтобы при старте (включении питания) контроллера начинался отсчёт времени; когда отсчёт достигает определённого значения (например, три минуты; этого должно хватить, чтобы ваш сервер, в частности, успел загрузиться после холодного старта), мы на некоторый заданный промежуток времени включаем нашу линию № 1, затем снова выключаем её и начинаем отсчёт времени с начала. Кроме того, определённая команда, поданная с управляющего компьютера (того самого, за которым наш сторожевой таймер должен следить) тоже сбрасывает отсчёт в начало.
Встроенные электромагнитные реле наших устройств, как и большинство других реле, которые вы, возможно, захотите использовать внешними, имеют как нормально-разомкнутые группы контактов (которые разомкнуты при обесточенной обмотке и замкнуты при подаче на обмотку питания), так и нормально-замкнутые (которые, наоборот, размыкаются при запитывании обмотки). Это позволяет нам большую часть времени держать обмотку обесточенной, экономя электроэнергию и ресурс реле. Для замыкания контура Reset'а мы будем использовать нормально-разомкнутые контакты, подключённые параллельно кнопке Reset, а для кратковременного обесточивания перезагружаемого компьютера — нормально-замкнутые контакты, вставленные в разрыв цепи питания.
Настройка устройства и компьютера
Реализовать вышеприведённый сценарий можно с помощью расширенных регистров, которые подробно описаны в руководствах по эксплуатации устройств UNC001 и UNC01x. Полный цикл работы мы реализуем на регистрах E45, E46 и E47 (напомним, что в шестнадцатеричной системе эти номера записываются как 2D, 2E и 2F). Регистр E45 будет отменять запланированное «передёргивание» если таковое запланировано, после чего планировать его снова — через три минуты от текущего момента. Регистр E46 будет представлять собственно «передёргивание», то есть при его выполнении будет включаться линия № 1 и будет запланировано её выключение через секунду (если мы решили «нажимать» Reset) или через десять секунд (если мы решили выключать и включать питание). Наконец, регистр E47 будет выключать линию № 1 и начинать отсчёт с начала.
Вычислим значения, которые необходимо поместить в регистры. Во всех трёх случаях это будет «сложное действие», так что в старшие два байта нужно занести F000
. В E45 (x2D) у нас будет действие «отменить отложеное выполнение E46 (0C2E
), подождать три (03
) минуты (02
), выполнить E46 (0E2E
)». Полностью значение регистра будет, следовательно, таким: F000 0C2E 0302 0E2E
. В E46 (x2E) действие будет включить линию № 1 основной группы (0001
), затем подождать одну (01
) секунду (01
), либо, если мы решили работать с питанием, а не с Reset'ом, то десять (0A
) секунд (01
), по истечении времени выполнить регистр E47 (x2F) (0E2F
), итого F000 0001 0101 0E2F
, либо F000 0001 0A01 0E2F
. Наконец, E47 (x2F) выключает линию № 1 (0002
), «ждёт» сотую долю секунды (0100
) и выполняет E45 (x2D), чтобы снова начать отсчёт таймера (0E2D
), итого F000 0002 0100 0E2D
. Команды uncctl
для настройки регистров устройства будут, соответственно, следующими:
# для передёргивания через замыкание Reset на 1 с.: uncctl -Y x2D "F000 0C2E 0302 0E2E" uncctl -Y x2E "F000 0001 0101 0E2F" uncctl -Y x2F "F000 0002 0100 0E2D" # для передёргивания через выключение питания на 10 с.: uncctl -Y x2D "F000 0C2E 0302 0E2E" uncctl -Y x2E "F000 0001 0A01 0E2F" uncctl -Y x2F "F000 0002 0100 0E2D"
Для того, чтобы запустить этот цикл при включении питания устройства, необходимо занести номер регистра E45 (то есть число 2D
16) в соответствующие биты регистра пользовательской конфигурации, например, так:
uncctl -G 2D000001
Следует учесть, что в зависимости от решаемой вами задачи в регистре пользовательской конфигурации могут потребоваться и другие биты; например, если вы используете 1-Wire, вам может потребоваться что-то вроде
uncctl -G 2DFC0001
Подробности о регистре пользовательской конфигурации вы найдёте в руководствах по эксплуатации наших устройств.
Наконец, нам потребуется научить управляющий компьютер сообщать устройству о том, что он (компьютер) ещё «жив» и перезагрузка ему не требуется. Для этого нужно заставить устройство выполнить регистр E45; соответствующая команда:
uncctl -A xE2D
В системах семейства Linux проще всего будет занести эту команду в crontab пользователя root (напомним, что для доступа к USB необходимы полномочия суперпользователя). Для этого, войдя в систему как root, дайте команду
crontab -e -u root
и в открывшемся редакторе текстов вставьте в crontab, например, следующую строку:
* * * * * /usr/local/bin/uncctl -A xE2D
Это заставит ваш crond запускать программу /usr/local/bin/uncctl с соответствующим параметром ежеминутно.
Выбор аппаратной части
Для выбора устройства сначала вам следует ответить на несколько вопросов:
- Какой будет использоваться способ перезагрузки зависшего компьютера? Варианты ответа в данном случае — «нажатие» на Reset (то есть замыкание соответствующих контактов) и кратковременное отключение питания.
- Если выбран способ с обесточиванием, то какова потребляемая вашим компьютером мощность? Собственно говоря, вас в данном случае интересует лишь, превышает эта мощность 300 Вт или нет. Узнать ответ на этот вопрос можно из документации на компьютер; кроме того, в большинстве случаев предельная потребляемая мощность указывается на блоке питания.
- Каков предпочтительный способ питания устройства UNC01x (от порта USB, от отдельного блока питания или непосредственно от сети 220 В)?
- Где вы хотите физически разместить устройство?
Рассмотрим для начала случай, когда предполагается перезагружать компьютер обесточиванием, при этом мощность компьютера превышает 300 Вт. Этот случай несколько особенный, поскольку требует использования внешнего реле, что резко сужает возможное поле выбора. Реле придётся от чего-то питать, так что наличие низковольтного блока питания в этом случае неизбежно; разумеется, при этом проще запитать от того же блока питания и устройство UNC0xx. Кроме того, коль скоро реле будет внешнее, устройство UNC0xx можно выбрать без встроенных реле; наиболее естественным кандидатом в этом случае становится устройство UNC010, хотя можно использовать и UNC011 с модулем UNC010/out. Это имеет смысл, если вы планируете задействовать встроенные реле для дополнительных функций; учтите, что управляемая линия теперь будет другая, так что в вышеприведённых примерах коды действий 0001
и 0002
придётся поменять, например, на 0101
и 0102
(первая линия первого модуля расширения); подробности — в руководстве по эксплуатации.
В качестве внешнего реле можно использовать 112.3748 или, например, PK-1P. При использовании UNC010 обмотка реле подключается к линии основной группы, при использовании UNC011 — к линии слота расширения; схемы подключения приведены в руководстве по эксплуатации устройств серии UNC010. Для питания реле и устройства можно использовать любой источник постоянного тока 12В не менее чем на 1А, например, такой.
Во всех остальных остальных случаях — как для перезагрузки Reset'ом, так и для передёгивания питания, если оно меньше 300 Вт, — целесообразно применять устройства со встроенными реле, что увеличивает пространство для манёвра. Так, UNC012 позволит обойтись без отдельного блока питания, поскольку запитывается непосредственно от сети 220В. Применяя UNC011, вы можете запитать его не от внешнего питания, а от порта USB (очевидно, этот вариант подходит только для передёргивания Reset'ом: выключив питание компьютера, от порта которого устройство запитано само, оно «подрубит сук, на котором сидит»). Кроме того, здесь вам вполне могут подойти устройства UNC002 (питание от USB) или UNC004 (питание от сети 220В), которые можно разместить внутри корпуса вашего компьютера.
Дополнительные возможности
Легко заметить, что пока мы задействовали всего одну управляемую линию и полностью проигнорировали все остальные возможности устройств, но использовать их никто не мешает.
Первый достаточно очевидный вариант — задействовать оставшиеся линии для управления питанием оборудования, стоящего поблизости от вашего компьютера. В частности, каждый сисадмин знает, что виснуть умеют не только компьютеры, но и всевозможные «активные устойства» — коммутаторы, точки доступа, модемы выделенных линий, наконец, маршрутизаторы (на самом деле, всё это компьютеры, но не у всех есть USB-порт, и нигде нет возможности выполнять произвольную программу раз в минуту). Типичный сценарий работы в такой ситуации — управляющий компьютер (он может быть, например, сервером, но может и не быть; нам часто приходилось видеть Unix-машины, работающие в качестве маршрутизатора), окружённый активным оборудованием. Устройство UNC0xx подключается к управляющему компьютеру и выполняет для него роль сторожевого таймера; при этом линии питания всех активных устройств в той же стойке находятся под контролем UNC0xx и могут быть удалённо (путём исполнения соответствующих команд на управляющем компьютере) выключены и включены обратно.
Управлять можно не только питанием сетевого и прочего компьютерного оборудования, но и, например, устройствами кондиционирования и вентиляции, что в сильно загруженных серверных временами оказывается весьма актуально. Часто в необслуживаемой серверной хочется установить видеонаблюдение, но применять для этого профессиональные следящие камеры с автономной подсветкой оказывается неоправданно дорого; если же включение и выключение света в серверной сделать дистанционным с помощью всё того же UNC0xx, для организации простейшего видеонаблюдения можно обойтись обычными дешевыми веб-камерами.
Наконец, не следует забывать о возможности подключения к нашим контроллерам устройств 1-Wire, среди которых хочется особенно отметить температурные датчики. Кстати, включение вентиляторов в вашей стойке можно автоматизировать в зависимости от температуры.
Не так давно один из наших пользователей прикрепил к двери 19-дюймового шкафа с оборудованием электромагнитный замок от домофона, подключил его к UNC011 (это можно сделать без реле, точнее «вместо» реле), к тому же контроллеру подключил зонд для ключей iButton, что позволило отпирать стойку с помощью домофонных ключей (необходимо только помнить, что на каждый такой ключ расходуется расширенный регистр, а их всего 48, причём три из них мы уже задействовали выше для реализации watchdog'а, ещё один уйдёт на последовательность «обесточить электромагнит, подождать пять секунд, включить электромагнит», так что контроллер не сможет помнить больше 44 ключей, но этого обычно достаточно.
Возможна ситуация, когда в вашей стойке с оборудованием не нашлось места или задачи ни для одного компьютера, то есть там только всевозможные маршрутизаторы и коммутаторы. Это не проблема: в качестве управляющего можно использовать Raspberry Pi, линейные размеры и энергопотребление которого столь незначительны, что вы их просто не заметите.