Всем известно, что для защиты от сбоев электропитания нужно купить бесперебойник. Но сам по себе источник бесперебойного питания не решает проблему, а только отсрочивает негативные последствия. Действительно, если питание пропадет надолго, то после разрядки батарей ИБП ваши системы аварийно завершат работу. Избежать этого позволяют модели, имеющие обратную связь, но, чтобы использовать эти возможности нам потребуется система управления электропитанием и сегодня мы расскажем об открытом и бесплатном продукте — NUT (Network UPS Tools).
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе «Архитектура современных компьютерных сетей» вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Почему именно NUT? Ведь многие производители ИБП предлагают собственные утилиты, в т.ч. и под Linux, при этом они явно лучше знают свою продукцию. В теории это так, но практика вовсе не так радужна. Во-первых, качество «родного» ПО очень сильно отличается от вендора к вендору. Где-то это вполне неплохие решения, а где-то лютая мешанина скриптов, бинарников и устаревших технологий.
Кроме того, ИБП у вас может быть не один, причем разных производителей и устраивать зоопарк проприетарного ПО — не самый лучший вариант. Что касается второго аргумента, то существует UPS management protocol — RFC 9271, если бесперебойник его поддерживает, то все равно какое ПО мы будем использовать для работы с ним.
NUT — это открытое программное обеспечение, поддерживающее большое количество источников бесперебойного питания и предоставляющее единый интерфейс работы с ними, кроме того оно работает в клиент-серверном режиме что позволяет организовать сетевое управление электропитанием, это удобно, когда к одному бесперебойнику подключено несколько компьютеров. С полным списком поддерживаемых устройств вы можете ознакомиться на официальном сайте: https://networkupstools.org/stable-hcl.html
Структурно NUT состоит из трех основных частей:
- Драйвер — используется для связи с ИБП.
- Сервер (upsd) — при помощи драйвера связывается с ИБП и получает сообщения об его состоянии.
- Служба мониторинга (upsmon) — контролирует сервер и выполняет действия на основе полученной от сервера информации.
Важный момент! Сервер NUT никак не связывается с клиентами и не передает им никаких команд, все решения принимает клиент, который при помощи службы мониторинга получает с сервера состояние выбранного ИБП и сообщения от него, на основании которых затем предпринимаются некоторые действия.
Таким образом один сервер NUT может контролировать сразу несколько физически подключенных к нему через интерфейс обратной связи ИБП и предоставлять информацию об их состоянии клиентам через локальную сеть. Это позволяет реализовывать достаточно сложные схемы управления электропитанием, наподобие приведенной ниже:
Таким образом имея единственный сервер NUT мы получаем централизованную систему управления питанием, которая обеспечит корректное выключение всех подключенных к ИБП компьютеров, а затем самого ИБП. При возобновлении электропитания сначала включатся ИБП, а затем все подключенные к ним устройства (для этого они должны иметь соответствующие настройки в BIOS).
Установка NUT и настройка драйвера ИБП
Установка NUT проста, в Debian / Ubuntu существует одноименный метапакет, который устанавливает сразу и сервер, и клиент. В других системах обратитесь к документации по доступным пакетам.
apt install nut
Теперь подключим к серверу ИБП и перезагрузим систему, после чего попробуем автоматически определить его настройки при помощи служебного пакета nut-scanner:
nut-scanner
Утилита просканирует все доступные интерфейсы и выведет готовые параметры подключения для обнаруженных устройств, в нашем случае был найдет ИБП серии PowerCom Smart King Pro+ подключенный через USB.
Фактически это готовые опции для настройки драйвера, советуем сохранить их для использования в дальнейшем. Теперь откроем файл /etc/nut/ups.conf и в самый конец добавим секцию, аналогичную указанной выше. В квадратных скобках указываем желаемое имя, ниже следуют опции подключения. В минимальной конфигурации будет достаточно первых двух: driver и port. Если предполагается использовать несколько ИБП, то мы можем уточнить производителя и модель: vendorid и productid, а вот опцию bus — лучше не использовать, при переключении ИБП в другой разъем она изменится. В случае использования нескольких ИБП одной модели лучше использовать другую опцию — serial с указанием серийного номера устройства.
Также мы советуем изучить документацию производителя, многие из них указывают рекомендуемые конфигурации драйвера для работы с NUT, например, для PowerCom у нас вышло следующее:
[powercom1]
driver = usbhid-ups
port = auto
vendorid = 0d9f
productid = 0004
serial = AAA-BBBB-CCC
pollonly
Последняя опция как раз взята из рекомендаций производителя, без нее ИБП работал с NUT нестабильно, периодически отваливаясь, что требовало либо его переподключения, либо перезагрузки компьютера.
Теперь проверим работу драйвера:
upsdrvctl start
Если все сделано правильно, то вы увидите что-то подобное:
Как видим, драйвер запустился нормально и увидел наш ИБП, теперь остановим его, чтобы избежать конфликтов при дальнейшей настройке.
upsdrvctl stop
Если же драйвер запускается с ошибками попробуйте переключить ИБП в другой разъем или перезагрузить компьютер.
Настройка сервера NUT
Прежде всего откроем /etc/nut/nut.conf и установим режим работы:
MODE=netserver
Для сервера доступны режимы:
- standalone — сервер запущен локально и принимает соединения только на localhost, используется для управления локально подключенным ИБП, который не питает других ПК,
- netserver — сетевой режим, сервер принимает соединения по локальной сети, подходит для построения сетевой системы управления питанием.
Мы сразу будем настраивать сетевой режим, большинство настроек при этом не будут отличаться от локальных, поэтому вы также можете настроить и локальный режим по этой инструкции.
Теперь перейдем в /etc/nut/upsd.conf, в нем нам потребуется указать сетевые опции, а именно адрес и порт, на котором будет принимать подключения сервер:
LISTEN 127.0.0.1 3493
LISTEN 192.168.99.120 3493
Обратите внимание на регистр написания, название опции должно быть обязательно в верхнем регистре, для локального режима достаточно будет только указания первой строки.
Следующим шагом заведем пользователей в файле /etc/nut/upsd.users. Мы рекомендуем, как минимум, завести административного пользователя, который будет иметь права менять настройки UPS и пользователей для чтения данных состояния бесперебойника. Вы можете завести разные учетные данные для разных ПК или одну на всех — выбор остается за вами. В нашем случае содержимое файла выглядит так:
[upsadmin]
password = Pa$$word_1
actions = SET
instcmds = ALL[upsmon-m]
password = 123456789
upsmon master[upsmon-s]
password = 987654321
upsmon slave
В нашем случае мы завели трех пользователей: административного, пользователя локального клиента (master) и удаленных клиентов (slave).
Сохраним все изменения и попробуем запустить службу сервера и сразу проконтролируем ее статус:
systemctl start nut-server
systemctl status nut-server
Теперь можем получить данные о состоянии ИБП командой:
upsc powercom1@localhost
Где мы указываем имя нашего драйвера и имя или адрес узла, на котором запущена серверная часть NUT.
В выводе мы можем увидеть частоту и напряжение на входе и на выходе устройства, текущую нагрузку в процентах (ups.load) и статус бесперебойника, который может иметь следующие значения:
- OL — On Line — работа от сети
- OB — On Battery — работа от батареи
- LB — Low Battery — низкий заряд батареи
Как мы уже говорили, сам сервер не предпринимает никаких действий, а только получает данные от ИБП и предоставляет их клиентам, но именно состояние LB служит триггером для службы мониторинга инициирующим выключение устройств.
Настройка службы мониторинга в Linux
Начнем с локального сервера, клиентская часть здесь уже установлена, поэтому просто откроем файл /etc/nut/upsmon.conf и добавим в него строку:
MONITOR powercom1@localhost 1 upsmon-m 123456789 master
Разберем указанные опции: powercom1@localhost — указывают имя драйвера и сервер NUT, следующая за ними единица говорит о том, что питание устройства следует отключить, для отладки можно временно указать там ноль, в этом случае будут генерироваться все события и записи в логах, но отключение питания производиться не будет. Затем указываем имя пользователя и пароль, а также тип устройства — master, это говорит о том, что перед нами головное устройство и оно будет выключено только после того, как выключатся все подчиненные компьютеры.
Запустим службу мониторинга:
systemctl start nut-monitor
Остальные параметры можно оставить по умолчанию. Но следует обратить внимание на опции NOTIFYFLAG, которые описывают реакцию службы на те или иные события. По умолчанию, когда опция закомментирована, применяются действия SYSLOG и WALL, т.е. пишется событие в системный лог и отправляется сообщение всем залогиненым пользователям.
Дополнительно можно включить выполнение скрипта действием EXEC, сам скрипт общий для всех событий и указывается в опции NOTIFYCMD, само событие и реакцию на него следует определять в самом скрипте, но это уже выходит за рамки данной статьи, поэтому рекомендуем обратиться к документации.
На удаленных устройствах нам нет необходимости устанавливать все пакеты, достаточно только клиентского:
apt install nut-client
После чего откроем /etc/nut/nut.conf и укажем режим работы:
MODE=netclient
Затем в /etc/nut/upsmon.conf внесем строку:
MONITOR powercom1@192.168.99.120 1 upsmon-s 987654321 slave
Мы не будем подробно разбирать синтаксис, так как это сделали выше, отметим изменения. При указании драйвера и узла мы использовали IP-адрес сервера NUT (можно также его FQDN), а в конце строки указали slave, что обозначает подчиненный мониторинг, кроме состояния ИБП он отслеживает также команды от головного мониторинга (master). Понятно, что в качестве драйвера следует указывать именно тот ИБП, к которому физически подключен данный узел.
После чего точно также запускаем службу:
systemctl start nut-monitor
Для проверки получим сведения об ИБП:
upsc powercom1@192.168.99.120
Для просмотра подключенных клиентов выполните команду:
upsc -с powercom1@192.168.99.120
А теперь как это все работает, мы не будем углубляться в подробности, а представим максимально упрощенную схему, достаточную для понимания происходящих событий.
- Батареи ИБП разряжаются, и он переходит в состояние LB
- Мониторинг master-узла получает этот статус и выставляет флаг FSD (forced shutdown)
- Мониторинг slave-узлов видит этот флаг и инициирует выключение
- Master-узел ждет отключения подчиненных узлов и выставляет флаг POWERDOWNFLAG
- При необходимости master завершает свою работу и выключает ИБП
Последний момент очень важен, потому что если после того, как slave-узлы будут выключены, подача питания возобновится, то ИБП не выключится и повторного запуска подключенных устройств не произойдет. Поэтому master узел в обязательном порядке выключает ИБП, чтобы при его последующем включении произошел запуск всех подключенных к нему устройств.
Настройка службы мониторинга в Windows
Сервер NUT может управлять и Windows-клиентами, для этого нужно установить один из клиентов NUT, мы используем WinNUT-Client, он поставляется в виде MSI-пакета и проблем с его установкой возникнуть не должно. Настройки его также просты: указываем адрес и порт сервера, имя драйвера, логин и пароль.
Также советуем пробежаться по прочим вкладкам и настроить автозапуск приложения и выполнить, при желании, более тонкую подстройку. Кроме выполнения своей основной функции приложение также показывает основные параметры ИБП в виде графических индикаторов.
Как видим, настроить NUT просто, но данная статья и близко не затронула всех возможностей этой системы. Пока что мы организовали базовую систему централизованного управления электропитанием, но при желании ее можно бесконечно улучшать и дополнять, благо проект прекрасно документирован.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе «Архитектура современных компьютерных сетей» вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Когда возникает задача мониторить бесперебойники у рабочих станций? Запищал – заменил, конец. Чинить ИБП – дело неблагодарное, менять аккумуляторы – не все хотят возиться (или даже моветон).
Так думал и я, особенно после череды ИБП с отказавшей электроникой. Ситуацию усугублял софт от производителей. Он, как бы это помягче выразиться, барахло. Причем у всех – APC, Ippon, Powercom, TrippLite. Что серверный, что для рабочих станций. Пробовать платные версии после опыта с бесплатными – желания не возникло. А совсем весело, когда ИБП от разных производителей.
Но мониторить всё же надо. Плюсы очевидны: 1) можно поменять ИБП ДО того, как он издаст прощальный писк; 2) можно сразу увидеть, где сдохла батарея, а где электроника.
Минус же прост, как всегда: стоимость решения, в деньгах или человеко-часах.
Вот эту проблему и будем решать.
Если имеем зоопарк, то самый адекватный способ – это Network UPS Tools.
По нему мало информации про Windows, а ещё нет GUI. Но это мы решим.
Справедливости ради нужно отметить, что есть похожий проект на Python. Но мне лично кажется совершенно излишним использование Python (и подобные технические решения) там, где можно обойтись парой строк нативного скриптинга.
Disclaimer
- Это не «готовое решение».
- Это не предложение, а рассказ.
- Да, есть Zabbix, Cacti, etc, и это тяжеловесные решения для больших компаний, требующие выделенного сервера и всё равно какого-то промежуточного слоя для поддержки соответствующего протокола UPS.
- При всём вышеперечисленном, решение достаточно простое, достаточно лёгкое и стоит 0 валюты.
Разумеется, для сбора информации понадобятся UPS с инфо-портом. У меня возникли проблемы с COM-портом IPPON, всё остальное работает на ура.
Обычно для рабочих станций используется подключение ИБП по USB, этот случай и рассмотрим. Нужно установить NUT на все рабочие станции с ИБП.
Возможные проблемы при этом:
- > Драйвер libusb лучше ставить отдельно. Те, что в комплекте, понимает не все ИБП;
- Если libusb предлагает стандартное имя HID UPS Battery, нужно его изменить – со стандартным именем некоторые системы почему-то не видят UPS;
- если процессе установки появилось сообщение «Драйвер без цифровой подписи«, то его нужно повторно переустановить руками, иначе он слетает;
- если libusb не распознал модель UPS, то с первого раза драйвер ставится НЕКОРРЕКТНО! Об этом говорит ошибка «upsmon ERROR ACCESS DENIED», или драйвер просто слетает. Нужно: остановить службу NUT, удалить драйвер libusb, подождать, пока установится «USB устройство ввода», выбрать для него вручную драйвер libusb заново;
- Для NUT нужны сторонние библиотеки, которых в комплекте установки нет. Setup об этом говорит, но кто ж его читает
Плюс часто в системах уже есть софт с этими библиотеками. Точно нужны: libeay32.dll, ssleay32.dll, libgcc_s_dw2-1.dll (есть в папке NUT-bin), libusb.dll (есть в дистрибутиве libusb), msvcr71.dll (в составе Net Framework 1.1). Все эти файлы должны быть в папке Windows\System32;
- иногда нужно указать bus=«bus-0» для USB UPS в ups.conf;
- на быстрых машинах и на некоторых сетевых картах служба NUT стартует раньше, чем драйвер и/или сетевой интерфейс. При этом тип запуска «Автозагрузка (отложенный запуск)» приводит к ошибке «upsc ERROR DATA STALE». Решение: создать задачу, которая будет проверять наличие процесса upsd при появлении события с кодом 1 из источника «Network UPS Tools» и перезапускать службу Network UPS Tools скачать xml-файл задачи скачать скрипт (должен быть в папке NUT\others).
Примерный скрипт полуавтоматической установки NUT на клиенты:
N:\NUT-Installer-2.6.5-6.msi /qn
copy N:\dll\ssleay32.dll C:\Windows\System32 /Y
copy N:\dll\libeay32.dll C:\Windows\System32 /Y
copy N:\dll\libgcc_s_dw2-1.dll C:\Windows\System32 /Y
copy N:\dll\libusb.dll C:\Windows\System32 /Y
copy N:\etc\* "%programfiles%\NUT\etc"
rem добавляем IP-адрес клиента в конфиг NUT автоматически
SET IP=192.168.100.10
set ip_address_string="IP Address"
rem Uncomment the following line when using Windows 7 (with removing "rem")!
set ip_address_string="IPv4-адрес"
REM echo Network Connection Test
for /f "usebackq tokens=2 delims=:" %%f in (`ipconfig ^| findstr /c:%ip_address_string%`) do SET IP=%%f
ECHO LISTEN %IP% 3493 >> "%programfiles%\NUT\etc\upsd.conf"
rem Ставим драйвер libusb отдельно
N:\libusb-win32-bin-1.2.6.0\bin\inf-wizard.exe
rem Правим конфиги, там буквально две строки
notepad "%programfiles%\NUT\etc\ups.conf"
notepad "%programfiles%\NUT\etc\upsmon.conf"
pause
net use N: /delete /Y
Как понять, почему не работает NUT под Windows:
- проверяем, есть ли в процессах nut.exe
- если есть, то проверяем upsd.exe и upsmon.exe
- если upsd нет в процессах, идём в nut\sbin и запускаем руками:
- «upsd не может быть запущен, так как отсутствует dll» – проверяем dll в system32, перезагружаемся на всякий случай;
- «upsd error creating named pipe» – upsd уже запущен
- запускается и сразу закрывается – проверить ip-адрес в upsd.conf в секции LISTEN, особенно актуально, если на машине DHCP ;
- upsd запустился, но не видит UPS – установить или переустановить libusb, проверить libusb.dll в system32, переименовать устройство из HID UPS Battery;
- если upsd стартовал, идём в bin и выполняем upsc our_ups@localhost
- «upsc не может быть запущен, так как отсутствует dll» – проверяем библиотеки ;
- «upsc failed connection unknown error» – проверяем, запущен ли upsd и upsmon, внимательно проверяем секцию MONITOR в upsmon.conf, ещё раз проверяем библиотеки dll;
- «upsc error data stale» – либо UPS один раз запускался и больше не работает, тогда переустанавливаем драйвер libusb и переименовываем HID UPS Battery, либо служба NUT поднялась быстрее, чем стал виден сетевой интерфейс или USB UPS, перезапускаем службу;
- «upsmon error ACCESS DENIED» – переустанавливаем драйвер, как описано выше.
Для сервера мониторинга нужны:
- NUT в режиме standalone;
- любой web-сервер с php и mysql. Я использую Uniform Server
- MySQL-база и папка www из репозитория, и пара batch-скриптов оттуда же.
Базу SQL и www кладём в соответствующие каталоги веб-севера. Скрипты из batch_scripts копируем в папку установки NUT. Запускаем веб-сервер, переходим на localhost/index_ups.php. Добавляем любой из клиентских UPS в формате UPS_name@host. Запускаем скрипт get_ups_list_mysql.cmd. Проверяем. Enjoy.
Что мы можем увидеть полезного, помимо текущего состояния? Например:
- если минимальный вольтаж батареи приближается к 10 – лучше заменить её заранее;
- при нормальных значениях вольтажа отказ ИБП будет связан скорее всего, с отказом электроники (ваш, К.О.);
- нагрузка более 70 процентов нежелательна, 100 не нормальна, если не связана с событием self-test;
- минимальный заряд батареи менее 30% говорит о неисправности батареи либо о неверных настройках автоотключения при разряде на клиенте.
Несколько моментов:
- столбцы можно сортировать нажатием на заголовок;
- максимальные/минимальные значения выводятся через слеш к текущим, критические отмечаются красным;
- осторожнее с кнопкой «self-test».
Если у кого-то проблемы с установкой/работой NUT под Windows – пишите, разберёмся вместе.
Спасибо за внимание!
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Какой софт вы используете для мониторинга ИБП рабочих станций?
18.8% Софт от производителя22
29.06% Zabbix / Cacti / подобное34
24.79% Не использую, но после прочтения статьи решил, что надо бы29
4.27% Другое, рассказал в комментариях5
Проголосовали 117 пользователей. Воздержались 24 пользователя.
Установка пакетов и запуск утилиты
Конфигурационные файлы
Завершение работы системы
Графическая утилита мониторинга и управления ИБП
NUT (Network UPS Tools) — это набор утилит, который предоставляет поддержку для управления источниками бесперебойного питания (ИБП) в сетевом окружении. NUT позволяет мониторить состояние ИБП, управлять ими и автоматизировать действия, основанные на их состоянии.
NUT состоит из следующих основных частей:
-
драйверы — используются для связи с ИБП;
-
сервер (upsd) — основной процесс, который собирает данные от ИБП через драйверы;
- служба мониторинга (upsmon) — следит за состоянием сервера и выполняет определенные действия в зависимости от получаемых от него данных.
Важно!
Обязательно подключите физическое оборудование вашей сети (коммутаторы, маршрутизаторы, мосты и т. д.) к ИБП!
Установка пакетов и запуск утилиты
Откройте консоль и выполните команду (потребуются права администратора):
sudo dnf install nut nut-client nut-cgi nut-xml nut-devel
Для запуска и добавления сервисов в автозагрузку выполните (потребуются права администратора):
sudo systemctl --now enable nut-driver nut-server nut-monitor
Конфигурационные файлы
Конфигурационные файлы по умолчанию расположены в папке /etc/ups с доступом только для администратора. В каждом файле приведено подробное описание по настройке, неактивные строки закомментированы при помощи # .
Настройки для коммуникации с ИБП содержатся в файле ups.conf. Для редактирования откройте файл (потребуются права администратора):
sudo nano /etc/ups/ups.conf
Пример содержимого файла конфигурации:
[parus] driver = blazer_usb port = auto desc = "UPS Parus-Electro"
где:
-
parus— название ИБП в системе; -
blazer_usb— драйвер для ИБП с протоколом Megatec, подключаемый по USB (можно установить другой драйвер соответствующий протоколу используемого ИБП).
При изменении названия ИБП необходимо внести соответствующее изменение в файл upsmon.conf.
Для проверки обмена данными с ИБП можно запустить команду upsc <название ИБП>. Если соединение с ИБП установлено, будут выданы данные от ИБП parus:
Завершение работы системы
Настройки процедуры завершения работы системы при низком заряде батарей ИБП приведены в файле upsmon.conf.
По умолчанию система настроена на завершение работы:
SHUTDOWNCMD "/sbin/shutdown –h +0"
но можно заменить на гибернацию:
SHUTDOWNCMD "/usr/bin/systemctl hibernate"
Для выполнения гибернации нужен раздел или файл подкачки необходимого размера, чтобы в него смог уместиться нативный или сжатый образ оперативной памяти. ОС автоматически подстроит параметры виртуальной памяти под сохранение данных при переходе компьютера в данный режим.
Графическая утилита мониторинга и управления ИБП
Графическая утилита nut-monitor позволяет просматривать параметры ИБП и электросети, а также отправлять команды. Запустить ее можно из терминала:
nut-monitor
Для отправки команд отключите утилиту от ИБП и выполните повторное подключение с пользователем, указанным в конфигурационном файле upsd.users. По умолчанию пользователь admin, пароль NUTadminPASSW.
Эта информация оказалась полезной? ДА НЕТ
Дата последнего изменения: 15.11.2024
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.
В этой заметке мы рассмотрим пример настройки свободного программного обеспечения Network UPS Tools (NUT) для контролируемого выключения сервера виртуализации Hyper-V на базе ОС Windows Server 2022. В рассматриваемом примере NUT будет использоваться в связке с двумя ИБП APC Smart-UPS SURT6000XLI, в которые установлены ранее рассмотренные платы Инматикс ПСУ Спутник А21. То есть в нашем случае к двум блокам питания хоста виртуализации подключены два разных ИБП, а ПО NUT, установленное на хост, будет контролировать состояние обоих ИБП и в случае проблем с электропитанием на ИБП инициировать команду завершения работы виртуальных машин хоста и штатного выключения хостовой ОС.
Основную информацию о NUT можно найти на сайте проекта, где в разделе документации можно найти ссылку на полезный для нас документ «NUT Configuration Examples». Кроме того, не лишним будет ознакомление с документом на русском языке, опубликованном на сайте Инматикс «Завершение работы серверов и ПК» с примерами установки и настройки NUT в простых конфигурациях на ОС Linux Debian и Windows.
Инсталляционные сборки NUT существуют под множество разных операционных сред. Найти интересующий нас пакет под ОС Windows можно на сайте в разделе «Binary packages». Имеющийся на данный момент времени пакет NUT-Installer-2.6.5-6.msi является инсталлятором «не первой свежести», но он без нареканий устанавливается на ОС Windows Server 2022.
В ходе установки инсталлятор просит принять лицензионное соглашение GPLv2 и предлагает указать каталог установки (по умолчанию на 64-битной версии Windows Server устанавливается в каталог «C:\Program Files (x86)»). Чтобы в перспективе избежать потенциальных проблем NUT с путями, содержащими пробелы и спецсимволы, изменим каталог установки на «C:\», в результате чего установка будет выполнена в каталог «C:\NUT».
На этапе запроса об установке драйвера libUSB можем отключить опцию, так как в нашем случае подключение к ИБП будет выполняться не через USB, а по сети через драйвер snmp-ups, который входит в базовую поставку инсталлятора NUT под Windows.
По окончании процесса установки в системе появится служба «Network UPS Tools» с автоматическим типом запуска, но она будет остановлена.
Чтобы избежать некоторых ошибок запуска исполняемых файлов, входящих в состав NUT, нам потребуется докинуть несколько библиотек, необходимых для поддержки шифрования, которое, в частности, будет использоваться при работе с протоколом SNMPv3.
Найти эти библиотеки можно в подкаталоге «\Network UPS Tools\windows\libs» архива, который можно загрузить с сайта Инматикс по ссылке Network-UPS-Tools.zip.
Скопируем файлы библиотек по следующим путям:
1) libeay32.dll, msvcr120.dll, ssleay32.dll в каталог «C:\NUT\bin«;
2) libeay32.dll, msvcr120.dll, ssleay32.dll, libgcc_s_dw2-1.dll, libssl32.dll в каталог «C:\NUT\sbin«
Следующим шагом перед запуском службы «Network UPS Tools» будет настройка конфигурационных файлов NUT.
Настройка конфигурационных файлов NUT
Архитектурно в составе NUT можно выделить 3 базовые компоненты:
1) Компонента драйвера (driver), которая отвечает за связь с ИБП и управляется через файл ups.conf;
2) Серверная компонента (upsd), использующая драйвер для сообщений о состоянии ИБП, которая управляется через файл upsd.conf;
3) Компонента мониторинга (upsmon), которая контролирует сервер upsd и выполняет командные действия, такие как, например, выключение ОС. Управляется через файл upsmon.conf.
Приведу наглядный пример взаимодействия компонент NUT для хоста с несколькими блоками питания из документа «NUT Configuration Examples»:
Правим конфигурационные файлы в подкаталоге «etc» каталога установки NUT. В нашем случае это «C:\NUT\etc«.
В первую очередь отредактируем файл nut.conf.sample, указав режим работы NUT, сохраним и переименуем файл в nut.conf.
MODE=standalone
NUT может работать в режимах сервера (управляет выключением других устройств в сети), клиента (принимает команды от сервера NUT в сети), изолированном (все компоненты в рамках одного хоста). Справку по этому конфигурационному файлу можно получить в закомментированных строках nut.conf.sample, либо найти в файле \docs\man\nut.conf.html каталога установки NUT.
Настроим конфигурацию драйверов NUT. Для этого отредактируем файл ups.conf.sample и переименуем его в ups.conf. Справку по этому конфигурационному файлу можно получить в закомментированных строках ups.conf.sample, либо найти в файле \docs\man\ups.conf.html каталога установки NUT.
Есть разные варианты настройки драйвера и они зависят от типа подключения компьютера с NUT к ИБП и от модели ИБП. Перечень совместимых моделей ИБП и рекомендуемые параметры конфигурации для них можно найти в «Hardware compatibility list».
В нашем случае NUT будет подключаться к ИБП не напрямую через USB, а по сети по протоколу SNMP. Поэтому нам потребуется настроить драйвер snmp-ups. Простой пример настройки подключения к ИБП по протоколу SNMPv1:
[MYUPS-001]
driver = snmp-ups
port = my-ups-001.example.com
snmp_version = v1
community = public
pollfreq = 10
desc = "APC Smart-UPS 6000"
В нашем случае к компьютеру с NUT подключены 2 ИБП, доступ к которым мы сконфигурируем по протоколу SNMPv3. Результирующий файл ups.conf (без учёта комментариев):
[KOM-UP001]
driver = snmp-ups
mibs = ietf
port = kom-up001.holding.com
snmp_version = v3
secLevel = authPriv
secName = nut-user
authProtocol = SHA
authPassword = zN3s8fU!sO1sbPMsF
privProtocol = DES
privPassword = H5iXoLe5x4ZY52w-d
pollfreq = 10
desc = "APC Smart-UPS SURT6000XLI with NMC Sputnik"
[KOM-UP002]
driver = snmp-ups
mibs = ietf
port = kom-up002.holding.com
snmp_version = v3
secLevel = authPriv
secName = nut-user
authProtocol = SHA
authPassword = fR!sO1sbPMsFzN3s8
privProtocol = DES
privPassword = Le5x4ZYv2w-dH5iXo
pollfreq = 10
desc = "APC Smart-UPS SURT6000XLI with NMC Sputnik"
Использовать AES в качестве протокола аутентификации не получится, так как NUT не сможет подключиться к ПСУ Спутник в этом случае. По заверениям тех.поддержки Инматикс проблема здесь в NUT, так как с другими программами ПСУ Спутник успешно аутентифицирует AES. Поэтому в данном случае используем DES. Пример настройки SNMPv3 на стороне платы управления ИБП ПСУ Спутник:
При задании паролей для пользователя SNMPv3 лучше не злоупотреблять спец.символами, так как это может создать проблемы в работе NUT. Например, использование знака «#» точно вызывает ошибку загрузки драйвера snmp-ups в NUT, при том, что, например, символы «!» и «-» проблем не создадут.
Следующим шагом настроим серверную компоненту upsd таким образом, чтобы upsd не был доступен по сети и прослушивал только локальный порт 3493, переименовав файл upsd.conf.sample в upsd.conf и раскомментировав в нём строку:
LISTEN 127.0.0.1 3493
Далее настроим конфигурационный файл с пользователями, которые будут иметь доступ к серверу upsd, переименовав файл upsd.users.sample в upsd.users. Внесём в файл секцию с описанием пользователя, например, с именем «upsmon-user«:
[upsmon-user]
password = sImplePZsw0rd
upsmon master
Затем настроим конфигурационный файл компоненты мониторинга upsmon. Для этого переименуем файл upsmon.conf.sample в файл upsmon.conf и добавим/отредактируем/раскомментируем в нём следующие строки (прочие открытые строки следует закомментировать):
MONITOR KOM-UP001@localhost 1 upsmon-user sImplePZsw0rd master
MONITOR KOM-UP002@localhost 1 upsmon-user sImplePZsw0rd master
MINSUPPLIES 1
SHUTDOWNCMD "C:\\WINDOWS\\system32\\shutdown.exe -s -t 0"
NOTIFYCMD "C:\\NUT\\sbin\\upssched.exe"
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG "C:\\NUT\\killpower"
NOTIFYMSG ONLINE "UPS %s on line power"
NOTIFYMSG ONBATT "UPS %s on battery"
NOTIFYMSG LOWBATT "UPS %s battery is low"
NOTIFYMSG FSD "UPS %s: forced shutdown in progress"
NOTIFYMSG COMMOK "Communications with UPS %s established"
NOTIFYMSG COMMBAD "Communications with UPS %s lost"
NOTIFYMSG SHUTDOWN "Auto logout and shutdown proceeding"
NOTIFYMSG REPLBATT "UPS %s battery needs to be replaced"
NOTIFYMSG NOCOMM "UPS %s is unavailable"
NOTIFYMSG NOPARENT "upsmon parent process died - shutdown impossible"
NOTIFYFLAG ONLINE SYSLOG+EXEC
NOTIFYFLAG ONBATT SYSLOG+EXEC
NOTIFYFLAG LOWBATT SYSLOG+EXEC
NOTIFYFLAG FSD SYSLOG
NOTIFYFLAG COMMOK SYSLOG
NOTIFYFLAG COMMBAD SYSLOG
NOTIFYFLAG SHUTDOWN SYSLOG
NOTIFYFLAG REPLBATT SYSLOG
NOTIFYFLAG NOCOMM SYSLOG
NOTIFYFLAG NOPARENT SYSLOG
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5
Первые две строки определяют подключение компоненты мониторинга к драйверам, описанным нами в ups.conf с учётной записью, описанной нами в upsd.users. Третья строка с параметром MINSUPPLIES определяет минимально допустимое количество источников питания в состоянии ONLINE. На сервере с двумя блоками питания, подключенным к двум разным ИБП, логично определить значение этого параметра в 1. На сервере с 4 блоками питания, подключенными к разным источникам питания, это значение может быть, например, 2 или 3. Важным здесь также являются параметры NOTIFYFLAG. Обратите внимание на то, что для большинства разных состояний источников питания у нас определено лишь логирование (SYSLOG). И только для трёх состояний (ONLINE, ONBATT, LOWBATT) мы включаем логирование и запуск команды (SYSLOG+EXEC). Под командой здесь подразумевается исполняемый файл планировщика upssched.exe, ссылка на который описана в параметре NOTIFYCMD.
Чтобы лучше понять все описанные параметры, рекомендуется ознакомиться со справкой по этому конфигурационному файлу, которую можно получить в закомментированных строках исходного файла upsmon.conf.sample, либо найти в файле \docs\man\upsmon.conf.html каталога установки NUT.
Настроим конфигурационный файл вспомогательного планировщика upssched, который вызывается в NOTIFYCMD конфигурации компоненты upsmon. Для этого переименуем файл upssched.conf.sample в файл upssched.conf и внесём в него следующие строки (прочие открытые строки следует закомментировать):
CMDSCRIPT "PowerShell.exe -NoProfile -Command C:\\NUT\\sbin\\upssched-script.ps1"
PIPEFN "\"C:\\NUT\\upssched.pipe\""
LOCKFN "\"C:\\NUT\\upssched.lock\""
AT LOWBATT * EXECUTE ups-on-battery
AT ONBATT * START-TIMER ups-on-battery 3600
AT ONLINE * CANCEL-TIMER ups-on-battery
Данная конфигурация предполагает то, что после того, как любой из ИБП переходит в состояние работы от батарей (ONBATT) запускается таймер, ожидающий 1 час (3600 секунд). Это время может корректироваться в зависимости от возможностей ваших ИБП по времени автономной работы от батарей при пропадании входного напряжения. Если в течение указанного периода времени входное напряжение на ИБП вернётся и он перейдёт с батарей на питание от сети (возврат в статус ONLINE), то обратный отсчёт времени таймера будет прерван. Если обратный отсчёт времени таймера доработает до конца, то произойдёт вызов скрипта завершения работы (CMDSCRIPT) с передачей ему параметра «ups-on-battery». При этом, в любой из ситуаций, если с ИБП будет получен статус об исчерпании заряда батарей (LOWBATT), то будет выполнен вызов скрипта завершения работы (CMDSCRIPT) с передачей ему параметра «ups-on-battery».
Теперь в каталоге установки NUT в подкаталоге «sbin» создадим файл PowerShell скрипта, который будет дёргаться планировщиком upssched и выполнять завершение работы виртуальных машин Hyper-V и ОС самого хоста виртуализации, записывая при этом свои действия в event-лог хоста. Пример содержимого файла скрипта upssched-script.ps1:
<#
.SYNOPSIS
Helper script for the upssched.exe process from Network UPS Tools (NUT) for Windows.
The script can be placed in the sbin subdirectory of the NUT installation directory.
Don't forget to change the $NUTdir variable.
.DESCRIPTION
The upssched-script.ps1 script is called by the upssched.exe process.
The script uses the value of the MINPOWERSUPPLY variable from upsmon.conf file.
To obtain the status of the UPS connected to the system, the script calls the upsc.exe utility.
If the value of the MINPOWERSUPPLY variable is less than the number of UPSs in the 'OL' status, the script begins the system shutdown procedure.
When the $vmsshutdown variable is enabled before shutting down the system, a forced shutdown of all Hyper-V virtual machines is performed
The script was tested on Windows Server 2022 with PowerShell 5.1 and Network UPS Tools for Windows 2.6.5
.PARAMETER State
Specifies a marker for the current state of the UPS based on data from the upsmon process.
Valid values: ups-on-battery
.INPUTS
None. You cannot pipe objects to script.
.OUTPUTS
The script generates only information output about the operations performed
.EXAMPLE
PS> .\upssched-script.ps1 ups-on-battery
.EXAMPLE
PS> .\upssched-script.ps1 -State ups-on-battery
.EXAMPLE
PowerShell.exe -NoProfile -Command "C:\NUT\sbin\upssched-script.ps1 ups-on-battery"
.NOTES
Author: Aleksey.Maksimov@it-kb.ru
Version: 1.1 (2023-09-22)
Purpose: Helper script for the upssched.exe process from Network UPS Tools for Windows
#>
Param (
[Parameter (Mandatory=$true, Position=1)]
[string]$State
)
$NUTdir = "C:\NUT"
$upsmoncfg = $NUTdir + "\etc\upsmon.conf"
$upscexe = $NUTdir + "\bin\upsc.exe"
$vmsshutdown = $true
$writeevents = $true
$eventlogsrc = "Network UPS Tools Script"
If ($writeevents -eq $true) {
If ([System.Diagnostics.EventLog]::SourceExists($eventlogsrc) -eq $false) {
[System.Diagnostics.EventLog]::CreateEventSource($eventlogsrc, "Application")
}
}
Function Logger {
[CmdletBinding()]
param(
[Parameter(Mandatory=$true, Position=1)]
[string]$Message,
[Parameter(Mandatory=$false, Position=2)]
[string]$Color = "Gray"
)
Write-Host $Message -ForegroundColor $Color
If ($writeevents -eq $true) {
$EvtType = "Information"
If ($Color -eq "Yellow") { $EvtType = "Warning" }
Write-EventLog -LogName "Application" -Source "Network UPS Tools Script" -Category 0 -EventID 1 -EntryType $EvtType -Message $Message
}
}
If ($State -eq 'ups-on-battery') {
If (![System.IO.File]::Exists($upsmoncfg)) {
Logger -Message "The path to the upsmon.conf file is incorrect. `nScript stopped." -Color "Yellow"
Break
}
[int]$ACSourcesMin = ((Get-Content $upsmoncfg | Where-Object {$_.StartsWith("MINSUPPLIES")}).Trim()[-1]).ToString() -as [int]
Logger -Message "Retrieved the value of the MINPOWERSUPPLY variable from upsmon.conf : '$ACSourcesMin'"
If ($ACSourcesMin -lt 1) {
Logger -Message "The value of the MINPOWERSUPPLY variable in the upsmon.conf file is incorrect. `nScript stopped." -Color "Yellow"
Break
}
If (![System.IO.File]::Exists($upscexe)) {
Logger -Message "The path to the upsc.exe file is incorrect. `nScript stopped." -Color "Yellow"
Break
}
[int]$ACSourcesCurr = 0
$Sources = @(& $upscexe -l)
If ($Sources.Count -lt 1) {
Logger -Message "The 'upsc' program returned less than one UPS. `nScript stopped." -Color "Yellow"
Break
}
#Logger -Message "Retrieved the count of the UPS from 'upsc -l' : '$($Sources.Count)'"
ForEach ($Source in $Sources) {
$Status = @(& $upscexe $Source ups.status)
Logger -Message "Retrieved UPS status from 'upsc $Source ups.status' : '$Status'"
If ($Status -eq 'OL') { $ACSourcesCurr = $ACSourcesCurr + 1 }
}
#Logger -Message "Counted number of UPSs in ONLINE state : $ACSourcesCurr"
If ($ACSourcesCurr -lt $ACSourcesMin) {
Logger -Message "Counted number of UPSs in ONLINE state ($ACSourcesCurr) less than value of the MINPOWERSUPPLY variable in upsmon.conf ($ACSourcesMin)"
If ($vmsshutdown -eq $true) {
Logger -Message "Shutting down Hyper-V virtual machines..."
Get-VM | Where State -eq 'Running' | Stop-VM -Force;
}
Logger -Message "Shutting down the system..."
Stop-Computer -ComputerName localhost -Force;
}
Else {
Logger -Message "Counted number of UPSs in ONLINE state ($ACSourcesCurr) greater than or equal to value of the MINPOWERSUPPLY variable in upsmon.conf ($ACSourcesMin).`nThe script completed without shutting down the system"
}
}
В начале своей работы скрипт регистрирует в системном event-логе «Application» новый источник «Network UPS Tools Script«, который будет использоваться для записи событий, связанных с работой скрипта.
Затем из каталога установки NUT (указывается через переменную $NUTdir), предпринимается попытка чтения конфигурационного файла upsmon.conf и считывания значение параметра MINSUPPLIES.
Затем с помощью утилиты upsc.exe извлекается информация о всех подключенных к NUT ИБП в состоянии ONLINE.
Если оказывается, что штатно работающих от входящей электросети ИБП меньше, чем значение полученного ранее параметра MINSUPPLIES, то инициируется процедура завершения работы всех виртуальных машин Hyper-V, а затем самого хоста виртуализации.
Конфигурационные файлы подготовлены и теперь можем попробовать выполнить запуск службы «Network UPS Tools«, например с помощью PowerShell:
Start-Service "Network UPS Tools"
NUT регистрирует события в event-логе «Application«. В случае возникновения проблем при запуске службы в первую очередь стоит заглянуть в этот лог.
Замечено, что подключение драйвера snmp-ups к ИБП в некоторых случаях происходит с небольшой задержкой и несколько первичных попыток подключения в течение примерно первой минуты безуспешны. Это приводит к появлению ошибки «upsmon — Poll UPS failed — Data stale» в event-логе Application. Причём данное поведение не зависит от выбора версии протокола SNMP. То есть NUT не сразу подключается к плате управления и получает с неё актуальные данные. По имеющейся информации на более актуальных версиях NUT под Linux такое поведение не воспроизводится, поэтому можно предполагать, что связано с это с «шероховатостями» в реализации NUT под Windows. Есть ощущение, что ошибки появляются по той причине, что модуль upsmon запускается немного раньше, чем успевает пройти инициализацию каждый экземпляр драйвера snmp-ups. По логам можно заметить, что драйвер snmp-ups для второго ИБП загружается позже, чем начинает работу upsmon. После ряда экспериментов стало очевидно то, что это проявляется для разных ИБП и разных плат Спутник, но по сути на работу NUT негативно не влияет.
Кроме того, замечено, что иногда NUT 2.6.5 перестаёт писать в event-лог Application. Закономерности такого поведения мне выяснить не удалось. Похоже, что эта проблема проявляется плавающим образом. Наличие этой проблемы стало одним из аргументов, который побудил реализовать дополнительный функционал записи в event-лог в скрипте выключения upssched-script.ps1, который мы представили выше. По большому счёту на ключевую функциональность NUT эта проблема влияния не имеет.
Проверка состояния подключений NUT к ИБП
Убедиться в правильности настройки связи NUT с платами управления ИБП можно вызвав утилиту upsc (upsc (8)), передав ей в качестве параметра имя ИБП, которое мы указали ранее в конфигурации NUT:
"C:\NUT\bin\upsc" KOM-UP001
При успешно установленной связи драйвера NUT с платой управления ИБП мы должны получить вывод, отображающий текущие показатели работы ИБП
Запрос к ИБП можно конкретизировать. Например, чтобы запросить только текущий статус ИБП, можно выполнить:
"C:\NUT\bin\upsc" KOM-UP001 ups.status
В данном случае статус «OL» означает, что ИБП работает в штатном режиме от входящей электросети. «OB» означает работу от батарей. «LB» говорит о почти полном разряде батарей («LB OL» при низком заряде и питании от сети, «LB OB» при низком заряде и питании от батарей).
Тестирование сценариев отключения питания на ИБП
После того, как вся конфигурация NUT настроена и мы убедились в успешности подключения NUT к обоим ИБП, правильным будет отработать возможные сценарии с наступлением случаев, когда на любом одном или сразу двух ИБП пропадает входное напряжение.
Перечень проверок, которые покажут нам корректность работы настроенной конфигурации NUT:
1) Отключаем ввод на первом ИБП и ожидаем N минут (по значению указанному нами в upssched.conf). Все виртуальные машины и сам хост виртуализации должны продолжить работу.
2) Отключаем ввод на втором ИБП и ожидаем N минут. Все виртуальные машины и сам хост виртуализации должны продолжить работу.
3) Отключаем ввод на обоих ИБП и ожидаем N минут, после чего должно начаться выключение виртуальных машин, а затем самого хоста виртуализации.
4) Отключаем ввод на ИБП (на любом одном или на обоих сразу), ожидаем период времени, меньший чем N минут. Снова включаем ввод на ИБП. В event-логе должны появиться соответствующие уведомления, а процесс выключения ВМ и хоста не должен запуститься.
5) Отключение по событию слабого заряда батарей, наступающему до истечения N минут. То есть обрабатывается ситуация, когда оба ИБП работают от батарей и у одного любого наступает событие низкий заряд – инициируем выключение виртуальных машин и хоста виртуализации.
При проверке сценариев 3 и 5 следует убедиться в том, что гостевые ОС в виртуальных машинах штатным образом завершают свою работу.
Вариант поднятия версии NUT на Windows
Если есть какие-либо причины или выявленный проблемы, препятствующие использованию указанной готовой сборки NUT «не первой свежести» 2.6.5 на Windows, то можно попробовать обновить исполняемые файлы NUT до актуальной версии из сборок, которые доступны по ссылке «AppVeyor — nut-travis» с вкладки Artifacts:
Скачиваем и распаковываем архив NUT-for-Windows-x86_64-SNAPSHOT-2.8.*-master.7z.
Останавливаем службу NUT и убеждаемся, что все процессы NUT (nut.exe, upsd.exe, upsmon.exe, snmp-ups.exe) выгружены из памяти.
Всё содержимое архивного подкаталога «\NUT-for-Windows-x86_64-SNAPSHOT\mingw64» копируем с заменой файлов в каталог установки NUT.
При подобном тестировании одной из предыдущих сборок NUT (2.8.0.806) обнаружилось, что для работы обновлённого драйвера snmp-ups.exe потребуется библиотека libcrypto-1_1-x64.dll. Где взять эту библиотеку их состава OpenSSL? Ссылки на источники загрузки готовых библиотек можно найти здесь: «OpenSSL Wiki — Binaries» . Выбираем на этой странице како-либо из источников, например «ICS Download» и качаем с него архив библиотек OpenSSL 1.1 для x64 Windows. Из архива текущей версии, например openssl-1.1.1w-win64.zip, извлекаем интересующий нас файл библиотеки libcrypto-1_1-x64.dll в каталог с исполняемым файлом snmp-ups.exe (C:\NUT\bin).
Запускаем службу и наблюдаем за event-логом. Не исключено, что в более свежих версиях NUT потребуется корректировка выше описанных параметров конфигурационных файлов NUT.
Диагностика работы NUT
В некоторых случаях может возникнуть какая-либо проблема, причину которой не получается понять по регистрируемым событиям event-лога. В такой ситуации можно воспользоваться отладочным запуском исполняемых файлов NUT в интерактивном режиме.
1) Останавливаем службу «Network UPS Tools» и убеждаемся, что все процессы NUT (nut.exe, upsd.exe, upsmon.exe, snmp-ups.exe) выгружены из памяти.
2) Открываем первую консоль cmd.exe и запускаем в интерактивном режиме экземпляры драйвера с помощью утилиты upsdrvctl.exe:
"C:\NUT\bin\upsdrvctl.exe" -D start
Процедура отработает и в системе должно появится 2 процесса snmp-ups (по процессу на каждый ИБП) из ups.conf. Если требуется более подробный вывод информации, то можно менять ключ «-D» на «-DD» , «-DDD» и так далее. Оставляем эту консоль в запущенном состоянии.
3) Открываем вторую консоль cmd.exe и запускаем в интерактивном режиме процесс сервера NUT upsd.exe:
"C:\NUT\sbin\upsd.exe" -D
В этот момент процесс сервера должен подключиться к ранее запущенным в первой консоли экземплярам драйвера. Оставляем эту консоль в запущенном состоянии.
4) Открываем третью консоль cmd.exe и запускаем в интерактивном режиме процесс клиента NUT upsmon.exe:
"C:\NUT\sbin\upsmon.exe" -D
Процесс должен подключиться к ранее запущенному во второй консоли экземпляру сервера upsd и получить от него данные о состоянии ИБП. Оставляем эту консоль в запущенном состоянии.
После этого можно выполнять всевозможные тестирования и отладочные мероприятия, например выключить автомат ИБП и наблюдать за реакцией в открытых консолях с процессами upsd и upsmon будет.
Для отладки работы самой службы «Network UPS Tools» можно попробовать выполнить интерактивный запуск исполняемый файл службы. Для этого останавливаем службу NUT и запускаем приложение в командной строке в интерактивном режиме:
"C:\NUT\bin\nut.exe" -N
На консоль при этом будет выводиться больше информации, чем мы можем увидеть в событиях event-лога.
После прерывания процесса отладки через Ctrl+C потребуется дополнительно через Task Manager удалить процессы upsd.exe, upsmon.exe и snmp-ups.exe (процессы snmp-ups создаются на каждый ИБП отдельно).
Заключение
Проведённые испытания свободного ПО Network UPS Tools на хосте виртуализации c ОС Windows Server 2022, подключенном разными блоками питания к разным ИБП APC Smart-UPS, показали, что данное ПО вполне справляется с задачей контролируемого выключения виртуальных машин Hyper-V и хостовой ОС. То есть NUT может рассматриваться в качестве альтернативы теперь уже платному ПО APC PCNS (PowerChute Network Shutdown).
В рассматриваемом примере компоненты NUT взаимодействовали с платами управления ИБП ПСУ Спутник, но следует понимать, что NUT это универсальное средство и может использоваться с множеством других плат управления ИБП, позволяющих выполнять опрос состояния ИБП по протоколу SNMP (и не только).
Содержание
Настройка
Папка: /etc/nut/
В файле nut.conf задаётся режим работы:
Список необходимых процессов для работы:
-
Сервер
-
Клиент
Для проверки можно использовать команду:
ps -aux|grep ups
iptables
Настройки для IPTables
iptables -A INPUT -p tcp -i $LAN_IF -s $LAN --sport 3493 -j ACCEPT iptables -A OUTPUT -p tcp -o $LAN_IF -d $LAN --dport 3493 -j ACCEPT iptables -A INPUT -p tcp -i $LAN_IF -s $LAN --dport 3493 -j ACCEPT iptables -A OUTPUT -p tcp -o $LAN_IF -d $LAN --sport 3493 -j ACCEPT
Сервер — upsd
upsd отвечает за передачу данных от драйверов к клиентским программам по сети. Его следует запускать сразу после upsdrvctl в сценариях запуска вашей системы.
По возможности, upsd следует поддерживать в рабочем состоянии, поскольку это единственный источник информации о состоянии для клиентов мониторинга, таких как upsmon.
Установка:
apt-get install nut-server
Пакет nut-server включает в себя и upsmon
Состояние:
- nut-server_status.sh
-
#!/bin/bash netstat -tulpn|grep upsd service nut-server status
upsd.conf
- upsd.conf
-
MAXAGE 15 MAXCONN 8 STATEPATH /var/run/nut LISTEN 0.0.0.0 3493 #LISTEN 127.0.0.1 3493
Проверка:
netstat -an |grep 3493
upsd.users
- upsd.users
-
[admin] password = admin actions = SET instcmds = ALL [upsmaster] password = password upsmon master [upsslave] password = password upsmon slave
ups.conf
- ups.conf
-
[ИМЯ_ИБП] driver = upscode2 port = /dev/ttyS0 desc = "Описание ИБП"
Нужно обязательно дать права на файл устройства (порта), иначе будет ошибка:
upsd: Can't connect to UPS [ИМЯ_ИБП] (upscode2-ИМЯ_ИБП): No such file or directory
Пример:
chmod 0660 /dev/ttyS0 chown root:nut /dev/ttyS0
Для того, чтобы после перезагрузки были правильные права на файл, нужно создать файл 99-nut.rules
Примеры:
upsdrvctl
Клиент мониторинга — upsmon
Установка:
apt-get install nut-client
upsmon предоставляет важную функцию, которую вы ожидаете найти в ПО для мониторинга ИБП — это безопасное отключение при сбое питания.
В иерархии ПО NUT это клиент. Он отдельно описан в документации, так как он очень важен.
Вы настраиваете его, указывая все ИБП, информацию о которых необходимо получать, это делается в файле в upsmon.conf.
Каждый ИБП можно определить как один из двух возможных типов:
-
ведущий (master)
Этот ИБП подаёт питание на работающую систему, и эта система также отвечает за её отключение, когда батарея разряжена. Это происходит после безопасного отключения всех ведомых (slave) систем.
Если ваш ИБП подключён непосредственно к последовательному порту системы, процесс
upsmonв этой системе должен определить этот ИБП как ведущий (master).
В простом случае один компьютер подключён к одному ИБП. Это означает, что вы запускаете драйвер,upsdиupsmonв режиме ведущий (master). -
ведомый (slave)
Этот ИБП может подавать питание на работающую систему, но эта система не может выключить её напрямую.
Используйте этот режим, когда вы используете несколько компьютеров, которые подключены к одному ИБП. Очевидно, только один может быть подключён к последовательному порту на ИБП, и эта система является ведущей (master), а все остальные ведомые (slave).
- upsmon.conf
-
MONITOR ИМЯ_ИБП@СЕРВЕР 1 upsslave password slave MINSUPPLIES 1 SHUTDOWNCMD "/sbin/shutdown -h +0" POLLFREQ 5 POLLFREQALERT 5 HOSTSYNC 15 DEADTIME 15 RBWARNTIME 43200 NOCOMMWARNTIME 300 FINALDELAY 5 NOTIFYMSG ONLINE "UPS %s on line power" NOTIFYMSG ONBATT "UPS %s on battery" NOTIFYMSG LOWBATT "UPS %s battery is low" NOTIFYMSG FSD "UPS %s: forced shutdown in progress" NOTIFYMSG COMMOK "Communications with UPS %s established" NOTIFYMSG COMMBAD "Communications with UPS %s lost" NOTIFYMSG SHUTDOWN "Auto logout and shutdown proceeding" NOTIFYMSG REPLBATT "UPS %s battery needs to be replaced" NOTIFYMSG NOCOMM "UPS %s is unavailable" NOTIFYMSG NOPARENT "upsmon parent process died - shutdown impossible"
MINSUPPLIES — Число ИБП, которые поддерживают работоспособность системы.
Строка описания одного ИБП:
MONITOR СИСТЕМА PV ПОЛЬЗОВАТЕЛЬ ПАРОЛЬ ТИП
| СИСТЕМА | ИМЯ_ИБП@СЕРВЕР |
| PV | Число блоков питания, которые ИБП питает эту систему. Большинство обычных компьютеров имеют один блок питания, и ИБП питает его, поэтому это значение будет 1. Если нужно только контролировать ИБП, который на самом деле не подаёт питание на эту систему нужно использовать значение 0. Это полезно, когда вы хотите, чтобы upsmon только оправлял уведомления об изменениях статуса ИБП |
| ПОЛЬЗОВАТЕЛЬ | Имя пользователя |
| ПАРОЛЬ | Пароль пользователя |
| ТИП | Тип: master или slave |
Состояние:
- nut-client_status.sh
-
#!/bin/bash service nut-client status
Пример:
- upsmon.conf
-
MONITOR ИМЯ_ИБП@localhost 1 upsmaster password master MINSUPPLIES 1 SHUTDOWNCMD "/sbin/shutdown -h +0" POLLFREQ 5 POLLFREQALERT 5 HOSTSYNC 15 DEADTIME 15 POWERDOWNFLAG /etc/killpower RBWARNTIME 43200 NOCOMMWARNTIME 300 FINALDELAY 5
Другие клиенты
Клиенты общаются с upsd по сети и работают с с данными из драйверов. Существуют инструменты для доступа к командной строке и несколько специальных клиентов, которые можно запускать через ваш веб-сервер как программы CGI.
upsc
Это простой клиент, который отображает значения переменных, известных upsd и вашим драйверам ИБП. По умолчанию он перечислит каждую переменную или только одну, если вы укажете дополнительный аргумент. Это может быть полезно в сценариях оболочки для мониторинга чего-либо без написания собственного сетевого кода.
upsc — это быстрый способ узнать, правильно ли работают ваши драйверы и upsd.
upsc -L |
список всех настроенных ИБП |
upsc ИМЯ_ИБП |
список всех доступных переменных с их текущими значениями |
upsc ИМЯ_ИБП ИМЯ_ПЕРЕМЕННОЙ |
текущее значение переменной |
Для подавления сообщения:
Init SSL without certificate database
Нужно использовать следующую конструкцию:
upsc ИМЯ_ИБП ИМЯ_ПЕРЕМЕННОЙ 2>&1 | grep -v SSL
upslog
upslog будет записывать информацию о состоянии из upsd в файл через заданные промежутки времени. Вы можете использовать это для создания графиков или отчетов с помощью других программ.
Пример вывода протокола в файл с помощью upslog
- /etc/init.d/zzz_upslog
-
#!/bin/bash upslog -s ИМЯ_ИБП@ИМЯ_СЕРВЕРА -l/var/log/ups.log -i 30 -f \ "%TIME @Y@m@d @H@M@S% \ %VAR battery.charge% \ %VAR input.voltage% \ %VAR ups.load% \ [%VAR ups.status%] \ %VAR ups.temperature% \ %VAR input.frequency% \ %VAR battery.voltage% \ %VAR battery.voltage.high% \ %VAR battery.voltage.low% \ %VAR battery.voltage.nominal% \ %VAR input.current.nominal% \ %VAR input.voltage% \ %VAR input.voltage.fault% \ %VAR input.voltage.nominal% \ %VAR output.voltage% \ %VAR ups.delay.shutdown% \ %VAR ups.delay.start%"
upsrw
upsrw позволяет отображать и изменять переменные чтения / записи в оборудовании вашего ИБП. Не все устройства или драйверы реализуют это, поэтому это может не повлиять на вашу систему.
Драйвер, поддерживающий переменные чтения / записи, даст следующие результаты:
Для изменения значения переменных требуются прав администратора. Права пользователей задаются в upsd.users
Примеры
-
Поучение текущего значения переменной
battery.date:upsc ups_01 battery.date
-
Изменение значения переменной
battery.dateв ИБП APC (формат даты:DD/MM/YY):upsrw -s battery.date=30/07/21 -u admin -p password ups_01@localhost
upscmd
Некоторое оборудование и драйверы ИБП поддерживают понятие мгновенной команды — такой функции, как запуск теста батареи или выключение нагрузки. Вы можете использовать upscmd для вывода списка или вызова мгновенных команд, если ваше оборудование/драйверы их поддерживают.
upscmd требует прав администратора для запуска мгновенных команд. Чтобы определить пользователей и пароли в upsd, см. upsd.users
Список команд, которые поддерживаются данным ИБП:
upscmd -u admin -p password -l UPS_01@localhost
Калибровка батарей
Процесс калибровки нужно начинать когда батареи ИБП заряжены полностью!
ИБП должен быть нагружен, глупо калибровать его на «холостом ходу».
Если есть сомнения в качестве батарей, необходимо производить калибровку не на «боевой» нагрузке, а например использовать эквивалент нагрузки.
В ходе этого процесса ИБП работает от батареи и разряжает их до 25%, а затем возвращается на работу от сети. ИБП использует данные нагрузки и время для вычисления новой оценки времени работы.
Запуск калибровки:
upscmd -u admin -p password ups_01@localhost calibrate.start
Для наблюдения за состоянием ИБП удобно использовать следующие команды:
-
watch upsc UPS_01 battery.charge
-
watch upsc UPS_01 battery.runtime
Jason Healy, Director of Networks and Systems — Network UPS Tools (Last Updated Mar 18, 2008)
upssched
Веб мониторинг
Zabbix
Мониторинг через Zabbix, работает через Zabbix агент.
Шаблон и код на основе этого проекта https://github.com/delin/Zabbix-NUT-Template
| Параметр | Имя переменной | Примечания |
|---|---|---|
| Имя драйвера NUT | driver.name |
|
| Модель ИБП | ups.model |
|
| Нагрузка (%) | ups.load |
|
| Напряжение батарей (В) | battery.voltage |
|
| Напряжение на входе (В) | input.voltage |
|
| Напряжение на выходе (В) | output.voltage |
|
| Номинальная нагрузка (ВА) | ups.power.nominal |
|
| Производитель ИБП | ups.mfr |
|
| Расчётное время работы от батарей (Мин.) | battery.runtime |
|
| Состояние | ups.status |
Эта переменная может содержать несколько значений, вот пример:
ups.status: ALARM OL ups.alarm: FAN_FAIL
для этого введены переменные |
| Состояние, значение №2 | ups.status-2 |
|
| Состояние, значение №3 | ups.status-3 |
|
| Состояние, значение №4 | ups.status-4 |
|
| Состояние, значение №5 | ups.status-5 |
|
| Тревога | ups.alarm |
Эта переменная получает значение только при возникновении тревоги (alarm) поэтому для при ошибке:
Error: Variable not supported by UPS
возвращается |
| Тревога, значение №2 | ups.alarm-2 |
|
| Тревога, значение №3 | ups.alarm-3 |
|
| Тревога, значение №4 | ups.alarm-4 |
|
| Тревога, значение №5 | ups.alarm-5 |
|
| Тревога, значение №6 | ups.alarm-6 |
|
| Тревога, значение №7 | ups.alarm-7 |
|
| Тревога, значение №8 | ups.alarm-8 |
|
| Тревога, значение №9 | ups.alarm-9 |
|
| Тревога, значение №10 | ups.alarm-10 |
|
| Температура (°C) | ups.temperature |
|
| Уровень заряда батарей (В) | battery.charge |
|
| Частота на входе (Гц) | input.frequency |
Если переменная не поддерживается, возникает ошибка:
Error: Variable not supported by UPS
и возвращается значение
NA
Template NUT
Ссылка на Share.Zabbix.com

Плюс часто в системах уже есть софт с этими библиотеками. Точно нужны: libeay32.dll, ssleay32.dll, libgcc_s_dw2-1.dll (есть в папке NUT-bin), libusb.dll (есть в дистрибутиве libusb), msvcr71.dll (в составе Net Framework 1.1). Все эти файлы должны быть в папке Windows\System32;