NUT: боремся с network unreachable


С достаточно интересной ситуацией с NUT столкнулись мы недавно на одном из серверов. К этому серверу был подключен источник бесперебойного питания через USB и передавал в систему статистики такие данные, как напряжение в сети и нагрузка на питание. Для отключения сервера в случае отсутствия электропитания этот ИБП не использовался из-за слабого аккумулятора, который выдерживал только несколько минут работы сервера при половинной нагрузке. Все работало нормально более года, но в начале прошлой недели сервер стал все время выбрасывать в консоль сообщения о том, что ИБП перестал быть доступным. Поскольку данный сервер перезагружается редко, мы решили, что проблема заключается в том, что кто-то отключил ИБП от сервера, а затем подключил, но NUT после этого бесперебойник не нашел. Ни перезагрузка NUT, ни всего сервера не дали никаких результатов. Кстати, если кто-нибудь, как и я, не может найти правильное имя сервиса NUT для перезагрузки, то вот оно:

service nut-server restart

Перезагрузка сервиса, что правда, в моем случае давала какой-то upsd fail, не уточняя при этом, что же именно произошло. В Интернете я нашел советы по поводу того, что проблема может быть в драйвере, но в нашем случае это исключено, так как ИБП успешно передавал данные ранее, а с тех пор в системе ничего не изменилось. Пытаюсь получить список подключенных ИБП в надежде на то, что мой стал именоваться как-то иначе:

upsc -l

В ответ получаю неожиданное сообщение:

Error: Connection failure: Network is unreachable

Как может быть сеть недостижима, если все работает в рамках localhost? Что-то тут не так. Ничего путного в сети не нашел, только несколько старинных советов пересобрать NUT. Для меня пересборка — крайняя мера. В последний раз я пересобирал nginx, когда выяснилось, что версии со встроенным mod_pagespeed нет в природе. Начал искать дальше. Никакие эксперименты с localhost и 127.0.0.1 ничего не давали. Начал смотреть дальше и наткнулся на интересную строку в параметрах ИБП (/etc/nut/ups.conf):

port = auto

Если бы ИБП был подключен через COM-порт, то нам явно нужно было бы прописать путь к нему. COM-порта на моем сервере нет, но я решил попробовать точно так же, но с USB:

port = /dev/bus/usb/002/004

Цифры в двух последних блоках — это пример. У вас они будут отличаться. Какие именно цифры нужно указать, можно выяснить при помощи lsusb:

Bus 002 Device 004: ID 0764:0501 Cyber Power System, Inc.

Смотрим, где у меня 002 и 004 в выводе lsusb, после чего сравниваем с примером /etc/nut/ups.conf выше и делаем так же у себя.

После этого достаточно перезапустить сам NUT-server командой, которую я приводил выше, после чего никаких upsd fail вы больше не увидите, а upsc -l снова будет выдавать список зарегистрированных ИБП. О причинах возникновения данной ошибки мало чего могу сказать, так как на нашем сервере из USB-устройств есть только ИБП и клавиатура, которую явно трудно распознать как ИБП, да и по коду устройства она под драйвер ИБП как-то не подходит. Загадка осталась, но решение найдено, что уже хорошо.


20.07.2015, 22:28
  linux, nut, upsd, ИБП.
Просмотров: 5395.