Nut ups windows настройка

Всем известно, что для защиты от сбоев электропитания нужно купить бесперебойник. Но сам по себе источник бесперебойного питания не решает проблему, а только отсрочивает негативные последствия. Действительно, если питание пропадет надолго, то после разрядки батарей ИБП ваши системы аварийно завершат работу. Избежать этого позволяют модели, имеющие обратную связь, но, чтобы использовать эти возможности нам потребуется система управления электропитанием и сегодня мы расскажем об открытом и бесплатном продукте — NUT (Network UPS Tools).

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе «Архитектура современных компьютерных сетей» вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Почему именно NUT? Ведь многие производители ИБП предлагают собственные утилиты, в т.ч. и под Linux, при этом они явно лучше знают свою продукцию. В теории это так, но практика вовсе не так радужна. Во-первых, качество «родного» ПО очень сильно отличается от вендора к вендору. Где-то это вполне неплохие решения, а где-то лютая мешанина скриптов, бинарников и устаревших технологий.

Кроме того, ИБП у вас может быть не один, причем разных производителей и устраивать зоопарк проприетарного ПО — не самый лучший вариант. Что касается второго аргумента, то существует UPS management protocolRFC 9271, если бесперебойник его поддерживает, то все равно какое ПО мы будем использовать для работы с ним.

NUT — это открытое программное обеспечение, поддерживающее большое количество источников бесперебойного питания и предоставляющее единый интерфейс работы с ними, кроме того оно работает в клиент-серверном режиме что позволяет организовать сетевое управление электропитанием, это удобно, когда к одному бесперебойнику подключено несколько компьютеров. С полным списком поддерживаемых устройств вы можете ознакомиться на официальном сайте: https://networkupstools.org/stable-hcl.html

Структурно NUT состоит из трех основных частей:

  • Драйвер — используется для связи с ИБП.
  • Сервер (upsd) — при помощи драйвера связывается с ИБП и получает сообщения об его состоянии.
  • Служба мониторинга (upsmon) — контролирует сервер и выполняет действия на основе полученной от сервера информации.

Важный момент! Сервер NUT никак не связывается с клиентами и не передает им никаких команд, все решения принимает клиент, который при помощи службы мониторинга получает с сервера состояние выбранного ИБП и сообщения от него, на основании которых затем предпринимаются некоторые действия.

Таким образом один сервер NUT может контролировать сразу несколько физически подключенных к нему через интерфейс обратной связи ИБП и предоставлять информацию об их состоянии клиентам через локальную сеть. Это позволяет реализовывать достаточно сложные схемы управления электропитанием, наподобие приведенной ниже:

installing-and-configuring-nut-001.png

Таким образом имея единственный сервер NUT мы получаем централизованную систему управления питанием, которая обеспечит корректное выключение всех подключенных к ИБП компьютеров, а затем самого ИБП. При возобновлении электропитания сначала включатся ИБП, а затем все подключенные к ним устройства (для этого они должны иметь соответствующие настройки в BIOS).

Установка NUT и настройка драйвера ИБП

Установка NUT проста, в Debian / Ubuntu существует одноименный метапакет, который устанавливает сразу и сервер, и клиент. В других системах обратитесь к документации по доступным пакетам.

apt install nut

Теперь подключим к серверу ИБП и перезагрузим систему, после чего попробуем автоматически определить его настройки при помощи служебного пакета nut-scanner:

nut-scanner

Утилита просканирует все доступные интерфейсы и выведет готовые параметры подключения для обнаруженных устройств, в нашем случае был найдет ИБП серии PowerCom Smart King Pro+ подключенный через USB.

installing-and-configuring-nut-002.png

Фактически это готовые опции для настройки драйвера, советуем сохранить их для использования в дальнейшем. Теперь откроем файл /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

Если все сделано правильно, то вы увидите что-то подобное:

installing-and-configuring-nut-003.png

Как видим, драйвер запустился нормально и увидел наш ИБП, теперь остановим его, чтобы избежать конфликтов при дальнейшей настройке.

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

installing-and-configuring-nut-004.png

Теперь можем получить данные о состоянии ИБП командой:

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

installing-and-configuring-nut-005.png

А теперь как это все работает, мы не будем углубляться в подробности, а представим максимально упрощенную схему, достаточную для понимания происходящих событий.

  • Батареи ИБП разряжаются, и он переходит в состояние LB
  • Мониторинг master-узла получает этот статус и выставляет флаг FSD (forced shutdown)
  • Мониторинг slave-узлов видит этот флаг и инициирует выключение
  • Master-узел ждет отключения подчиненных узлов и выставляет флаг POWERDOWNFLAG
  • При необходимости master завершает свою работу и выключает ИБП

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

Настройка службы мониторинга в Windows

Сервер NUT может управлять и Windows-клиентами, для этого нужно установить один из клиентов NUT, мы используем WinNUT-Client, он поставляется в виде MSI-пакета и проблем с его установкой возникнуть не должно. Настройки его также просты: указываем адрес и порт сервера, имя драйвера, логин и пароль.

installing-and-configuring-nut-006.png

Также советуем пробежаться по прочим вкладкам и настроить автозапуск приложения и выполнить, при желании, более тонкую подстройку. Кроме выполнения своей основной функции приложение также показывает основные параметры ИБП в виде графических индикаторов.

installing-and-configuring-nut-007.png

Как видим, настроить 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.

image

Что мы можем увидеть полезного, помимо текущего состояния? Например:

  • если минимальный вольтаж батареи приближается к 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».

Network UPS Tools (NUT) Setup on Windows

На этапе запроса об установке драйвера libUSB можем отключить опцию, так как в нашем случае подключение к ИБП будет выполняться не через USB, а по сети через драйвер snmp-ups, который входит в базовую поставку инсталлятора NUT под Windows.

Network UPS Tools (NUT) and libUSB

По окончании процесса установки в системе появится служба «Network UPS Tools» с автоматическим типом запуска, но она будет остановлена.

Network UPS Tools service in Windows Server 2022

Чтобы избежать некоторых ошибок запуска исполняемых файлов, входящих в состав 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»:

NUT Configuration Examples - Server with multiple power supplies

Правим конфигурационные файлы в подкаталоге «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 на стороне платы управления ИБП ПСУ Спутник:

NMC PSU Sputnik SNMP v3 Configuration for NUT

При задании паролей для пользователя 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«. В случае возникновения проблем при запуске службы в первую очередь стоит заглянуть в этот лог.

Network UPS Tools (NUT) events in Windows Server eventlog 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 с платой управления ИБП мы должны получить вывод, отображающий текущие показатели работы ИБП

Check NUT connection to UPS over upsc tool

Запрос к ИБП можно конкретизировать. Например, чтобы запросить только текущий статус ИБП, можно выполнить:

"C:\NUT\bin\upsc" KOM-UP001 ups.status

Check UPS status over upsc tool in NUT

В данном случае статус «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:

Fresh NUT exe files for Windows

Скачиваем и распаковываем архив 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-лога.

Run Network UPS Tools (NUT) service in debug mode on Windows

После прерывания процесса отладки через Ctrl+C потребуется дополнительно через Task Manager удалить процессы upsd.exe, upsmon.exe и snmp-ups.exe (процессы snmp-ups создаются на каждый ИБП отдельно).

Close NUT processes in Windows Task Manager

Заключение

Проведённые испытания свободного ПО 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

для этого введены переменные ups.status-2ups.status-5, если эти переменные не содержат значений то возвращается 0

Состояние, значение №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

возвращается 0, также она может содержать несколько значений, для этого введены переменные ups.alarm-2ups.alarm-10

Тревога, значение №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

MS Windows

Ссылки

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Kerio control windows 10 torrent
  • Как найти com порты на windows 10
  • Низкая яркость экрана ноутбука windows 11
  • Срок действия вашей лицензии windows 10 истекает как убрать сообщение если виндовс активирован
  • Расположение программы фотографии windows 10