NUT — это Network UPS Tools или набор программных компонентов, предназначенных для мониторинга силовых устройств, таких как источники бесперебойного питания (ИБП), блоки распределения питания, солнечные контроллеры и блоки питания серверов.
В среде Linux — NUT — это стандарт де-факто для управления ИБП, который позволяет производить мониторинг ИБП не только с сервера к которому подключен ИБП, но и по сети, а так же выполнят ряд действий при наступлении определенных условий. Например, в случае когда заряд батарей ИБП истощается NUT может произвести корректное завершение работы серверов и уведомить об этом системного администратора.
Как настроить NUT на Linux и Windows серверах ? Читаем ниже.
Исходные данные:
1. В локальной сети организации есть 2 сервера под управлением Debian 8.9 (jessie) и 1 сервер под управлением Windows Server 2012 R2;
2. Есть ИБП компании APC, модель Smart-UPS 1000. ИБП подключен по USB к одному из серверов Debian 8.9 (jessie);
Задача:
На сервере Debian 8.9 к которому подключен ИБП установить серверную часть NUT и настроить клиентскую часть NUT на этом сервере и других серверах. В случае перехода питания серверов на ИБП и истощения заряда батарей ИБП нужно произвести корректное завершение работы всех серверов.
Распределение IP адресов во внутренней сети компании между серверами:
192.168.100.1 (srv1.mycompany.ru) — Сервер Debian 8.9 (jessie) к которому подключен APC Smart-UPS 1000 по USB — на нем будет серверная часть NUT и клиентская;
192.168.100.2 (srv2.mycompany.ru) — Сервер Debian 8.9 (jessie) — на нем будет клиентская часть NUT;
192.168.100.3 (srv3.mycompany.ru) — Сервер Windows 2012 R2 — на нем будет клиентская часть NUT;
Настройка серверной части NUT.
1. Проверим факт обнаружения нашего ИБП ядром Linux с помощью утилиты lsusb:
Для ИБП марки APC Smart-UPS значения idVendor и idProduct будут 051d и 0002 соответственно.
# lsusb -vd 051d:0002 Bus 004 Device 003: ID 051d:0002 American Power Conversion Uninterruptible Power Supply Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x051d American Power Conversion idProduct 0x0002 Uninterruptible Power Supply bcdDevice 0.06 iManufacturer 3 American Power Conversion iProduct 1 Smart-UPS 1000 FW:652.18.I USB FW:7.3 iSerial 2 AS0811123791 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 34 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 11 1 bmAttributes 0xe0 Self Powered Remote Wakeup MaxPower 30mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 0 No Subclass bInterfaceProtocol 0 None iInterface 0 HID Device Descriptor: bLength 9 bDescriptorType 33 bcdHID 1.10 bCountryCode 33 US bNumDescriptors 1 bDescriptorType 34 Report wDescriptorLength 1064 Report Descriptors: ** UNAVAILABLE ** Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0006 1x 6 bytes bInterval 100 Device Status: 0x0001 Self Powered
2. Установка NUT (серверной части на хосте 192.168.100.1):
apt-get install nut
Далее отредактируем файл /etc/nut/ups.conf и приведем его к виду:
[apc] driver = usbhid-ups port = auto
Этой минимальной конфигурации хватит для нашего ИБП.
Как Вы уже догадались в файле /etc/nut/ups.conf описываются все наши ИБП, а так же драйвер и их параметры для работы с NUT.
Нашему ИБП мы присвоили имя apc и будем использовать драйвер usbhid-ups.
Драйвер usbhid-ups гарантировано работает с ИБП Smart-UPS компании APC.
Более детально со списком драйверов и списком ИБП каких фирм может работать NUT описано на этой странице. Список параметров драйвера usbhid-ups можно посмотреть на этой странице.
3. Настройка драйвера NUT для работы с нашим ИБП.
Далее нам нужно установить права на наше USB устройство чтобы драйвер NUT смог работать с ним.
Для этого создадим правило /etc/udev/rules.d/90-nut-ups.rules для udev со следующим содержимым:
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="051d", ATTR{idProduct}=="0002", MODE="0660", GROUP="nut"
Далее нужно перечитать все правила, для этого выполним:
udevadm control --reload-rules udevadm trigger
Для тех кто хочет понять в чем тут дело, объясняю:
При выводе информации по нашему ИБП с помощью lsusb мы можем увидеть строку «Bus 004 Device 003»:
# lsusb -vd 051d:0002 Bus 004 Device 003: ID 051d:0002 American Power Conversion Uninterruptible Power Supply Device Descriptor: ...
Она говорит, что ядро Linux при подключении нашего ИБП по USB присвоило ему номер шины обмена данными 4 и id устройства 3, само наше устройство соответственно будет находится по такому пути /dev/bus/usb/004/003 а владельцем будут пользователь root и группа root с правами 664 (crw-rw-r—), но для работы драйвера NUT этого не достаточно, драйвер в таком случае не сможет управлять устройством.
С помощью файла /etc/udev/rules.d/90-nut-ups.rules и утилиты udevadm мы задали правило для сервиса udev который управляет периферией, получая от Linux ядра разного рода уведомления. По этому правилу для нового устройства с определенным idVendor и idProduct владельцем будет назначаться группа nut.
Если интересно, то запросить информацию у udev по нашему устройству можно так:
udevadm info -a -p $(udevadm info -q path -n /dev/bus/usb/004/003)
4. Теперь запустим все драйвера NUT описанные в /etc/nut/ups.conf с помощью команды:
upsdrvctl start
Если в файле /etc/nut/ups.conf у Вас описаны несколько ИБП, то остановить конкретный драйвер или запустить его можно так:
Остановить драйвер для ИБП с именем apc # upsdrvctl stop apc Запустить драйвер для ИБП с именем apc # upsdrvctl start apc
5. Теперь опишем права доступа к нашему серверу NUT для доступа клиентских ОС по сети, за это отвечает файл /etc/nut/upsd.conf
LISTEN 192.168.100.1 3493 LISTEN 127.0.0.1 3493
Директива LISTEN задает адрес и порт на котором будет принимать соединения демон upsd (Сервер NUT).
ВНИМАНИЕ! Директивы ACL, ACCEPT, REJECT в файле /etc/nut/upsd.conf больше не используется и является устаревшей.
6. Теперь опишем пользователей и пароли для подключения клиентских устройств к серверу NUT, за это отвечает файл /etc/nut/upsd.users:
[admin] password = MASTERPASSWORD actions = SET instcmds = ALL [local_mon] password = xxx_local_passwd upsmon master [srv2_mon] password = xxx_srv1_passwd upsmon slave [srv3_mon] password = xxx_srv2_passwd upsmon slave
В секции [admin] мы описали пользователя для управления NUT через утилиту upscmd, а так же разрешили менять все параметры самого ИБП (строка actions = SET и instcmds = ALL).
Если нужно разрешить пользователю admin менять только определенные параметры, то их нужно описать в опции instcmds, например так:
[admin] password = MASTERPASSWORD actions = SET instcmds = test.battery.start instcmds = test.battery.stop
Секции [local_mon] [srv2_mon] и [srv3_mon] описывают пользователей для клиентских ОС, на них будет стоять клиентская часть NUT.
В этих секциях мы указали индивидуальные пароли (опция password) и статус этих пользователей (опция upsmon).
Для пользователя local_mon мы указали в опции upsmon значение master, это сделано не спроста, дело в том что на том же ПК, где у нас будет работать сервер NUT мы настроим и клиентскую часть NUT и когда сервер NUT отправит всем клиентам сигнал о критическом состоянии батарей ИБП, то master должен выключиться самым последним из серверов, дождавшись выключения всех slave серверов.
ВНИМАНИЕ! Директива allowfrom в файле /etc/nut/upsd.users больше не используется и является устаревшей.
7. Настроим режим работы NUT на сервере 192.168.100.1 (работа в режиме сервера), для этого в файле /etc/nut/nut.conf напишем:
MODE=netserver
8. Запустим сервер NUT:
/etc/init.d/nut-server restart
И проверим его статус:
# /etc/init.d/nut-server status ● nut-server.service - Network UPS Tools - power devices information server Loaded: loaded (/lib/systemd/system/nut-server.service; enabled) Active: active (running) since Sun 2017-12-24 23:26:32 +05; 1s ago Process: 21736 ExecStart=/sbin/upsd (code=exited, status=0/SUCCESS) Main PID: 21737 (upsd) CGroup: /system.slice/nut-server.service └─21737 /lib/nut/upsd Dec 24 23:26:32 srv1.mycompany.ru systemd[1]: Starting Network UPS Tools - power devices information server... Dec 24 23:26:32 srv1.mycompany.ru upsd[21736]: listening on 127.0.0.1 port 3493 Dec 24 23:26:32 srv1.mycompany.ru upsd[21736]: listening on 192.168.100.1 port 3493 Dec 24 23:26:32 srv1.mycompany.ru upsd[21736]: Connected to UPS [apc]: usbhid-ups-apc Dec 24 23:26:32 srv1.mycompany.ru upsd[21737]: Startup successful
Проверим открытые порты:
# netstat -ltun | grep 3493 tcp 0 0 192.168.100.1:3493 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:3493 0.0.0.0:* LISTEN
Настройка клиентской части NUT на серверах.
1. Настроим клиент мониторинга (upsmon), который будет заниматься слежением за состоянием ИБП и правильным завершением работы сервера при отсутствии электричества и полном разряде батарей. (Первый клиент у нас будет на том же хосте, что и сервер NUT, то есть на 192.168.100.1):
Для этого отредактируем файл /etc/nut/upsmon.conf и приведем его к виду:
MONITOR apc@localhost 1 local_mon xxx_local_passwd master POWERDOWNFLAG /etc/killpower SHUTDOWNCMD "/sbin/shutdown -h +0" NOTIFYFLAG ONLINE SYSLOG+EXEC NOTIFYFLAG ONBATT SYSLOG+EXEC NOTIFYFLAG LOWBATT SYSLOG+EXEC
Директиву NOTIFYCMD в которой как правило задают запуск планировщика upssched, а далее настраивают upssched.conf мы не используем. Если Вам нужно настроить уведомления на email или в мессенджеры и кастомизировать процедуру выключения, то тогда нужно настраивать планировщик. Но нам это пока не нужно.
Самое интересное здесь — это директива
MONITOR apc@localhost 1 local_mon xxx_local_passwd master
В ней описывается подключение к нашему серверу NUT, формат здесь простой:
MONITOR <имя_ИБП>@<адрес_сервера_NUT> <количество_ИБП_в_системе> <логин> <пароль>
<имя_ИБП> — берется с сервера NUT из файла /etc/nut/ups.conf, в нашем случае apc;
<адрес_сервера_NUT> — думаю тут все понятно, для локального клиента это localhost;
<количество_ИБП_в_системе> — как правило это 1, если Вам нужно контролировать переход на питание от ИБП, но выключать этот сервер по сигналу NUT Вы не хотите, то установите этот параметр в 0;
<логин> и <пароль> — думаю тут тоже все понятно, данные берутся с сервера NUT из файла /etc/nut/upsd.users;
Так же нужно остановиться на директиве POWERDOWNFLAG и разъяснить как происходит отключение системы в случае когда заряд батарей ИБП истощается.
Итак, в режиме работы от батарей, перед самым их истощением, ИБП генерирует сообщение «battery low». Демон upsmon получает это сообщение от сервера NUT (от upsd) и обрабатывает этот сигнал, вызывая команду описанную в опции SHUTDOWNCMD для корректной остановки системы. Более детально данный процесс можно описать следующей последовательностью:
1. ИБП генерирует событие «battery low»;
2. upsmon получает данный сигнал от сервера NUT и инициирует выключение ПК;
3. Создается специальный файл POWERDOWNFLAG, являющийся признаком того, что система находится в режиме отключения в связи с истощением батарей ИБП;
4. Выполняется команда SHUTDOWNCMD;
5. RC-сценарий использует проверку флага POWERDOWNFLAG для предотвращения так называемой «энергетической гонки» (power race);
«Энергетической гонкой» называется ситуация, когда ИБП переходит в режим работы от сети вскоре после генерации сигнала «battery low», в процессе останова системы. В этом случае компьютер, настроенный на автоматическое включение после сбоя электропитания окажется заложником собственной «осторожности», ведь фактически никакого сбоя не произойдет. Многие современные ИБП имеют механизмы разрешения такой ситуации и дополнительного анализа POWERDOWNFLAG флага на стороне ОС как правило не нужно, но знать про это необходимо.
Теперь перезапустим клиента NUT командой
/etc/init.d/nut-client restart
И проверим его статус:
# /etc/init.d/nut-client status ● nut-monitor.service - Network UPS Tools - power device monitor and shutdown controller Loaded: loaded (/lib/systemd/system/nut-monitor.service; enabled) Active: active (running) since Sun 2017-12-24 23:56:49 +05; 9s ago Process: 30612 ExecStart=/sbin/upsmon (code=exited, status=0/SUCCESS) Main PID: 30615 (upsmon) CGroup: /system.slice/nut-monitor.service ├─30614 /lib/nut/upsmon └─30615 /lib/nut/upsmon Dec 24 23:56:49 srv1.mycompany.ru upsmon[30612]: UPS: apc@localhost (master) (power value 1) Dec 24 23:56:49 srv1.mycompany.ru upsmon[30612]: Using power down flag file /etc/killpower Dec 24 23:56:49 srv1.mycompany.ru upsmon[30614]: Startup successful Dec 24 23:56:49 srv1.mycompany.ru upsmon[30615]: Init SSL without certificate database Dec 24 23:56:49 srv1.mycompany.ru systemd[1]: nut-monitor.service: Supervising process 30615 which is no...its. Dec 24 23:56:49 srv1.mycompany.ru systemd[1]: Started Network UPS Tools - power device monitor and shutd...ler. Hint: Some lines were ellipsized, use -l to show in full.
Проверить подключение к серверу и вывести все параметры ИБП можно командой:
upsc apc@localhost
Посмотреть значение какого-то конкретного параметра можно указав дополнительно его имя:
upsc apc@localhost ups.beeper.status
Кроме того, как я писал выше есть более сложный клиент (upscmd), который позволяет не только просматривать настройки, но и выполнять команды.
Список доступных команд можно увидеть вот так:
upscmd -l -u admin -p MASTERPASSWORD apc
2. Теперь настроим клиент мониторинга NUT (upsmon) на сервере под управлением Debian Linux (хост 192.168.100.2):
apt-get install nut-client -y
Отредактируем файл /etc/nut/upsmon.conf и приведем его к виду:
MONITOR [email protected] 1 srv2_mon xxx_srv1_passwd slave POWERDOWNFLAG /etc/killpower SHUTDOWNCMD "/sbin/shutdown -h +0" NOTIFYFLAG ONLINE SYSLOG+EXEC NOTIFYFLAG ONBATT SYSLOG+EXEC NOTIFYFLAG LOWBATT SYSLOG+EXEC
Отредактируем файл /etc/nut/nut.conf и приведем его к виду:
MODE=netclient
Теперь перезапустим клиента NUT командой
/etc/init.d/nut-client restart
И проверим подключение к серверу NUT путем вывода всех параметров ИБП командой:
upsc [email protected]
3. Теперь настроим клиента мониторинга NUT (upsmon) на серверe под управлением Windows Server 2012 R2 (хост 192.168.100.3):
Скачиваем инсталлятор NUT под Windows с официального сайта и устанавливаем.
Скачиваем OpenSSL 1.0.2q (x86) или новее, но обязательно x86 версию (Win32 OpenSSL v1.0.2q Light) и устанавливаем, в процессе установки когда нас спросят копировать файлы библиотеки в системную паку — отказываемся, далее копируем 3 файла (ssleay32.dll, libssl32.dll и libeay32.dll) из «C:\OpenSSL-Win32\» в «C:\Program Files (x86)\NUT\bin\»
Переименовываем файл «C:\Program Files (x86)\NUT\etc\nut.conf.sample» в «C:\Program Files (x86)\NUT\etc\nut.conf» и пишем в конце файла:
MODE=netclient
Далее переименовываем файл «C:\Program Files (x86)\NUT\etc\upsmon.conf.sample» в «C:\Program Files (x86)\NUT\etc\upsmon.conf» и приводим его к виду:
MONITOR [email protected] 1 srv3_mon xxx_srv2_passwd slave SHUTDOWNCMD "shutdown /s /t 00" POWERDOWNFLAG "C:\\killpower"
Открываем консоль cmd с правами Администратор и рестартуем службу:
net stop "Network UPS Tools" net start "Network UPS Tools"
И наконец там же из cmd проверяем подключение к серверу NUT путем вывода всех параметров ИБП командой:
"C:\Program Files (x86)\NUT\bin\upsc.exe" [email protected]
На этом все, до скорых встреч. Если у Вас возникли вопросы или Вы хотите чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.
Профессионально занимаюсь системным администрированием Linux -серверов и баз данных (MySQL, POstgreSQL) на протяжении последних 24 лет.
Здравствуйте.
При запуске строки:
«C:\Program Files (x86)\NUT\bin\upsc.exe» [email protected].1
сервис выдает ошибку: отсутствует библиотека libeay32.dll
нашел библиотеку в пакете openssl-1.0.2q-x64_86-win64
скопировал в bin после чего ошибка при запуске приложения 0xc000007b
OS: Windows Server 2012 R2
Здравствуйте,
скорее всего Вы скачали не ту версию OpenSSL (нужна разрядность x86, а не x64), я дописал ссылку и разъяснение в статью:
Здравствуйте.
Михаил, благодарю Вас за статью она мне помогла)).
Большое спасибо за статью!
Как раз пришёл второй сервак и остро встала необходимость настройки упс по сети.
Отличная статья, спасибо!
Скажите, а как настроить сервер nut в системе windows 10, можно по аналогии с linux или там есть какие-то нюансы?
Добрый день, по windows 10 не подскажу, не настраивал там nut. Скорее всего нюансы будут.
Все хорошо, все настроил, все работает, ошибки не выдает, на когда ИБП отключаем из розетки, по истечению разряда батарее, мастер не дает команду slave, чтобы они отключались и сам мастер не отключается, просто ИБП вырубается и все, И да NUT и мастер находятся на pfsense
nguvu.org/pfsense/network%20ups%20tools%20(nut)/pfsense-ups-nut/
forum.netgate.com/topic/120102/proxmox-ceph-zfs-pfsense-и-все-все-все
Михаил, спасибо. Особенно за пояснения про usb правило — не мог понять, почему команды изменения параметров не применяются
Здравствуйте.
Есть опыт использования NUT. Работает отлично — сервера уведомляются и завершают работу. Есть задача при переходе на батареи отключать определенные розетки с нагрузкой (дисковые массивы) через определенное время. Как это сделать? Пару недель сношаюсь с связкой PowerChuteBuisnessEdition и PowerChuteNetworkShutdown и все больше смотрю в сторону NUT.
Добрый день. У меня упс немного другой модели, Smart-UPS C 1000. После запуска «upsdrvctl start» получаю: Network UPS Tools — UPS driver controller 2.7.4 Network UPS Tools — Generic HID driver 0.41 (2.7.4) USB communication driver 0.33 interrupt pipe disabled (add ‘pollonly’ flag to ‘ups.conf’ to get rid of this message) Using subdriver: APC HID 0.96 У меня что-то не будет работать? Гугл по этому поводу мало чего находит. Может что-то с правами тут? root@pve:/etc/nut# ls -la /etc/nut итого 56 drwxr-xr-x 2 root nut 4096 мар 2 14:18 . drwxr-xr-x 98 root root 4096 мар 2 12:28 .. -rw-r—— 1… Подробнее »
pollonly — это настройка сугубо драйвера usbhid-ups, расшифровывается как — если этот флаг установлен, то драйвер будет игнорировать прерывания, которые он получает от ИБП (не рекомендуется, но необходимо установить, если эти отчеты прерываются на вашем ИБП).
Во первых есть такая команда (выполняется на master):
она позволяет проверить отработку сбоя по питанию, если ее запустить на master то начнется процесс выключения всех slave и потом master
Во вторых после настройки master и slave Вы можете отключить от UPS питание от сети 220 и посмотреть что будет происходить, при правильной настройке NUT через определенное время должны корректно выключиться все slave и master — это и будет проверкой правильности настройки NUT.
Михаил, добрый вечер.
Спасибо за объяснения.
В выходные затестирую отключение используя приведённую Вами команду, всё никак руки до этого не доходили. А то ведь и не знаю, а всё ли работает как надо.
Спасибо за статью, все доходчиво и понятно.
Один момент напряг: Windows клиент — комплект OpenSSL доступный в настоящее время: Win32 OpenSSL v1.1.1L Light не содержит перечисленных с статье библиотек. Но есть решение: на портале NUT на github https://github.com/networkupstools/nut/pull/455 есть исправленный пакет для установки на windows: https://github.com/networkupstools/nut/files/1172041/NUT-Installer-2.6.5-6_fixed_dll.zip
Он размещает необходимые библиотеки где нужно.
NUT клиент у меня заработал.
Сисадмин. Когда выкладываете в интернет подобные статьи, то не забывайте перепроверять построчно, что вы написали. Иначе может сложиться мнение, что у вас всё «работает» так же как и написано:
«Остановить драйвер для ИБП с именем apc
# upsdrvctl stop apc
Или запустить драйвер для ИБП с именем apc
# upsdrvctl stop apc»
Ну а так, статья вроде годная.
Это опечатка. Спасибо — исправил.
Поставил все, но проблема в отображении вольтажа входящего и исходящего шкала начинается с -20в и заканчивается +20в а напряжение 230в соответственно шкала не показывает верное значение… как настроить данный параметр?(( гугления ничего не дали… или я просто нуб)
Выглядит так — https://ibb.co/6v957X1
Хотел спросить:
Как после выключения ESXi выполнить скрипты что бы выключить СХД?
Добрый день. Предположу, что на СХД могут находиться диски разных ВМ с разных ESXi. А если так, то нужное условие — это как минимум выключение всех нод ESXi
Подходов может быть масса, например делать проверки на внешнем сервере и в случае выполнения всех условий выключать СХД. Или если СХД построена на базе какого-то Linux то можно внутри ее ОС делать проверки и отправлять ее на выключение.Еще есть масса всяких аппаратных watchdog устройств которые делают сетевые проверки и в случае удачи/неудачи выполняют какие-то действия.