Настройка Network UPS Tools на Linux на примере ИБП Eaton 5E650iUSB


Описание


Сервис Linux NUT (Network UPS Tools) — это комплекс программ мониторинга и управления различными блоками бесперебойного питания (далее ИБП). Полный список поддерживаемых моделей можно получить, посмотрев список драйверов в файле /usr/share/nut/driver.list.


В руководстве описана настройка отключения ПК агентом NUT при потере напряжения в сети на примере ИБП Eaton 5E 650iUSB на Ubuntu-подобных дистрибутивах. Для использования под другие дистрибутивы используйте пакетный мененджер своего дистрибутива или соберите из исходных кодов. Новейшую версию Network UPS Tools можно скачать на GitHub по ссылке ссылке.


Установка NUT


Для начала следует установить NUT:


    root@hostname~# apt install nut

Сделаем резерную копию папки с файлами конфигурации NUT:


    root@hostname~# cp -r /etc/nut /etc/nut.orig

Теперь добавим директиву, указывающую, что ИБП подключен к данному компьютеру, а не к удаленному:


    root@hostname~# echo "MODE=standalone" > /etc/nut/nut.conf

Теперь подключим ИБП к компьютеру и посмотрим вывод команды lsusb:


    root@hostname~# lsusb

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
Bus 001 Device 003: ID 1a2c:2124 China Resource Semico Co., Ltd 
Bus 001 Device 002: ID 0463:ffff MGE UPS Systems UPS

Ищем, поддерживается ли ИБП сервисом NUT. Можно либо просмотреть его вручную либо вывести строки с упоминанием марки ИБП, например:


    root@hostname~# grep Eaton /usr/share/nut/driver.list
...
"Eaton" "ups"   "5"     "5E650iUSB"     "USB port"      "usbhid-ups"
...

Теперь, когда мы определились с драйвером, можно настраивать NUT.


Защита конфигурационных файлов


Следует выставить верные права доступа и владельцев для файлов конфигурации NUT


    root@hostname~# chown root:nut /etc/nut/*
    root@hostname~# chmod 640 /etc/nut/*

Настройка NUT


Настройка драйвера, способа подключения и времени выключения


Дописываем строки в конец файла /etc/nut/ups.conf или создаем новый с таким содержимым:


    root@hostname~# nano /etc/nut/ups.conf

# Имя ИБП в NUT. Именно по нему мы будем посылать команды ИБП
[eaton]
# Используемый драйвер
driver = usbhid-ups
# Порт подключения. Что то менять в ней нужно только для специфических ИБП
port = auto
# Время в секундах до автоматического отключения ПК
offdelay = 90
# Время автоматического включения в минутах после команды отключения ПК
ondelay = 5
# Описание ИБП
desc = "Eaton 5E 650iUSB"

Настройка доступа системной группы NUT к ИБП по USB


Чтобы NUT имел право на доступ к USB интерфейсу ИБП, нужно написать правило доступа для udev.


udev — подсистема управления устройствами Linux. Благодаря udev в папке /dev находятся только подключенные в данный момент устройства.


Выполним команду


    root@hostname~# lsusb

и найдем строку, соответствующую ИБП. В нашем примере это


Bus 001 Device 002: ID 0463:ffff MGE UPS Systems UPS

где после ID идет idVendor:idProduct (0463:ffff)


Теперь создадим файл с правилом для udev:


    root@hostname~# /etc/udev/rules.d/90-nut-ups.rules

# Eaton 5E650iUSB
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0463", ATTR{idProduct}=="ffff", MODE="0660", GROUP="nut"

После создания правила следует перезагрузить сервис udev:


    root@hostname~# service udev restart

После этого следует отключить и заново подключить USB кабель от ИБП. После этого выполним команду для проверки работоспособности udev правила:


root@hostname~# 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
    Using subdriver: MGE HID 1.39

Если вывод приблизительно такой, то все настроено правильно.


Настройка адресов и портов прослушивания подключений к NUT


Дописываем строки в конец файла /etc/nut/upsd.conf или создаем новый с таким содержимым:


    root@hostname~# nano /etc/nut/upsd.conf

# Прослушивать Loopback интерфейс на порту 3493
LISTEN 127.0.0.1 3493

Имейте в ввиду что LISTEN должно быть написано именно большими буквами, или работать ничего не будет.


Настройка профиля пользователя для доступа к NUT


Создаем пользователя upsmonitor без права логина и домашней папки, с UID меньше 1000, чтобы он считался служебным и его не было на экране входа пользователей в систему, и с GID'ом группы nut.


Узнаем GID группы nut:


    root@hostname~# cat /etc/group | grep nut:x:

  nut:x:134:

Теперь подберем UID для пользователя. Либо выберем такой, какой врядли используется какой либо программой, например, 339, либо выполняем:


root@hostname~# cat /etc/passwd | grep [число от 100 до 1000]

и если ничего не выводит, то UID свободен и его можно использовать для создания пользователя upsmonitor:


root@hostname~# useradd -d /dev/null -s /usr/sbin/nologin -u 339 -g 134 -p UPSPASS upsmonitor

Теперь добавим этого пользователя в файл профилей пользователей NUT /etc/nut/upsd.users:


root@hostname~# nano /etc/nut/upsd.users

# Имя пользователя
[upsmonitor]
# Пароль пользователя
password = UPSPASS
# Права пользователя на выполение системных действий, то есть выключения и т.д.
actions = SET
# Права на изменение доступных переменных ИБП с помощью команды upscmd
instcmds = ALL
# Использование этого пользователя как управляющего для NUT
upsmonitor master

Настройки мониторинга NUT


Дописываем строки в конец файла /etc/nut/upsmon.conf или создаем новый с таким содержимым:


root@hostname~# nano /etc/nut/upsmon.conf

# Подключаться к eaton на localhost через учетные данные пользователя upsmonitor
MONITOR eaton@localhost 1 upsmonitor UPSPASS master
# Количество подключенных ИБП
MINSUPPLIES 1
# Путь к программе NUT, которая будет вести широковещательную рассылку
NOTIFYCMD /sbin/upssched
# Частота опроса мониторинга в секундах во время работы от сети
POLLFREQ 5
# Частота опроса мониторинга в секундах во время работы от батареи
POLLFREQALERT 5
# Ожидание отключения дочерних процессов от NUT при завершении работы
HOSTSYNC 15
# Если NUT не может получить отклик от опроса ИБП в течении этого времени то помечает ИБП как "мертвый"
DEADTIME 15
# Специальный флаг, устраняющий проблему, когда питание восстановилось после команды выключения от ИБП к ПК
POWERDOWNFLAG /etc/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"
# Посылает сообщение о потере соединения с ИБП во все открытые терминалы, например, при случайном отключении USB шнура
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"
# Посылает сообщение во все открытые терминалы о завершении процесса программы мониторинга NUT upsmon
NOTIFYMSG NOPARENT   "upsmon parent process died - shutdown impossible"
# Выполнение действий по наступлению события, указанного после NOTIFYFLAG.
# SYSLOG это отправка сообщения о событии в логи ПК, в файл /var/log/syslog
# WALL это отправка сообщения о событии во все открытые терминалы
# EXEC это выполнение команды, определенной в файле /etc/nut/upsshed.conf, при наступлении события
NOTIFYFLAG ONLINE    SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT    SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT   SYSLOG+WALL+EXEC
NOTIFYFLAG FSD       SYSLOG+WALL+EXEC
NOTIFYFLAG COMMOK    SYSLOG+WALL+EXEC
NOTIFYFLAG COMMBAD   SYSLOG+WALL+EXEC
NOTIFYFLAG SHUTDOWN  SYSLOG+WALL+EXEC
NOTIFYFLAG REPLBATT  SYSLOG+WALL+EXEC
NOTIFYFLAG NOCOMM    SYSLOG+WALL+EXEC
NOTIFYFLAG NOPARENT  SYSLOG+WALL+EXEC
# Время вывода сообщения о необходимости замены батареи ИБП в секундах (12 часов)
RBWARNTIME 43200
# Если NUT не может святься с настроенными ИБП, то посылает событие NOCOMM каждые 300 секунд
NOCOMMWARNTIME 300
# Последний интервал ожидания перед выключением системы
FINALDELAY 5

Тест соединения


Посмотрим, что ИБП может сообщить о своем состоянии:


    root@hostname~# upsc eaton@localhost

battery.charge: 100
battery.runtime: 1964
battery.type: PbAc
device.mfr: EATON
device.model: 5E 650i
device.type: ups
driver.name: usbhid-ups
driver.parameter.offdelay: 60
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.synchronous: no
driver.version: 2.7.4
driver.version.data: MGE HID 1.39
driver.version.internal: 0.41
input.voltage: 228.0
outlet.1.status: on
outlet.desc: Main Outlet
outlet.id: 1
outlet.switchable: no
output.frequency: 50.0
output.frequency.nominal: 50
output.voltage: 226.0
output.voltage.nominal: 230
ups.beeper.status: enabled
ups.delay.shutdown: 60
ups.firmware: 03.08.0018
ups.load: 18
ups.mfr: EATON
ups.model: 5E 650i
ups.power.nominal: 650
ups.productid: ffff
ups.start.battery: yes
ups.status: OL
ups.timer.shutdown: -1
ups.vendorid: 0463

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


  • OL — система работает от сети;
  • OB — система работает от батареи;
  • LB — система работает от разряженной батареи.

Внутренние команды и переменные ИБП


ИБП можно давать команды напрямую из консоли, с помощью команды upscmd. Список доступных команд можно получить, выполнив команду:


    root@hostname~# upscmd -l eaton@localhost

Instant commands supported on UPS [eaton]:

beeper.disable - Disable the UPS beeper
beeper.enable - Enable the UPS beeper
beeper.mute - Temporarily mute the UPS beeper
beeper.off - Obsolete (use beeper.disable or beeper.mute)
beeper.on - Obsolete (use beeper.enable)
load.off - Turn off the load immediately
load.off.delay - Turn off the load with a delay (seconds)
shutdown.stop - Stop a shutdown in progress

Настройки **beeper.* управляют сигнализацией ИБП в случае потери напряжения в сети, load.off выключает ПК немедленно, load.off.delay задержка в секундах до выключения ПК, shutdown.stop** — команда прерывания процесса отключения ПК.


В некоторых ИБП присутствуют и другие опции, например, тест батареи или shutdown.return, в случае использования которой компьютер будет выключен, но ИБП пошлет сигнал включения ПК как только восстановится питание в сети. Чтобы это сработало, в БИОСе ПК дожна быть включена соответствующая функция, которая обычно находится где то в районе настроек питания.


Для примера выключим писк ИБП, когда пропадает питание в сети:


    root@hostname~# upscmd -u upsmonitor -p UPSPASS eaton@localhost beeper.disable

Чтобы включить, замените beeper.disable на beeper.enable.


Настройка планировщика задач NUT upssched


Дописываем строки в конец файла /etc/nut/upssched.conf или создаем новый с таким содержимым:


    root@hostname~# nano /etc/nut/upssched.conf

# Скрипт, откуда будут выполнятся команды по событиям
CMDSCRIPT /etc/nut/cmd.sh
PIPEFN /tmp/upspipe
LOCKFN /tmp/upslock
# Условия выполнения команд из case конструкции в скрипте /etc/nut/cmd.sh
AT COMMBAD * EXECUTE commbad
AT COMMOK * EXECUTE commok
AT NOCOMM * EXECUTE nocomm
# Указание включить ПК после восстановления питания. Можно удалить или закомментировать если не поддерживается ИБП
AT ONBATT * EXECUTE powerout
# Запуск таймера, после окончания которого выполнится команда shutdownnow из cmd.sh
AT ONBATT * START-TIMER shutdownnow 90
AT LOWBATT * EXECUTE shutdowncritical
AT ONLINE * CANCEL-TIMER shutdownnow
AT ONLINE * EXECUTE powerup

Теперь теперь нужен скрипт /etc/nut/cmd.sh. Создадим его, выставим права и заполним его:


    root@hostname~# touch /etc/nut/cmd.sh
    root@hostname~# chmod 666 /etc/nut/cmd.sh
    root@hostname~# nano /etc/nut/cmd.sh

#!/bin/sh
# logger посылает указанный текст в syslog
case $1 in
      commbad)
      logger  "UPS communications failure"
      ;;
      commok)
      logger  "UPS communications restored"
      ;;
      nocomm)
      logger  "UPS communications cannot be established"
      ;;
      powerout)
      # Выключает ПК с задержкой в указанное количество секунд
      logger "UPS on battery. Shutdown in 90 seconds...."
      upscmd -u upsmonitor -p UPSPASS eaton@localhost shutdown.return
      ;;
      shutdownnow)
      logger "UPS has been on battery for 120 seconds. Starting orderly shutdown"
      # Запуск принудительного выключения ПК
      upsmon -c fsd
      ;;
      shutdowncritical)
      logger "UPS battery level CRITICAL. Shutting down NOW!!!!"
      # Запуск принудительного выключения ПК
      upsmon -c fsd
      ;;
      powerup)
      logger "UPS on line. Shutdown aborted."
      # Прерывание процесса выключения ПК
      upscmd -u upsmon -p pass mustek@localhost shutdown.stop
      ;;
      *)
      logger "Unrecognized command: $1"
      ;;
esac

Заключение


На этом настройка завершена. Можно протестировать, банально выдернув ИБП из розетки.

Комментарии (3)


  1. legolegs
    14.03.2019 21:46

    В убунте действительно необходимо так много настраивать? В федоре мне было достаточно ups.conf, upsd.users и вписать `MONITOR ....` в upsmon.conf.

    Самое сложно было понять, какой драйвер мне нужен, потому для моего IPPON был нужен не тот драйвер, что значился в `/usr/share/nut/driver.list`.

    Вторым по сложности было понять, что хотя у меня так
    image
    NUT создан, чтобы уметь и такое:
    image

    На третьем месте по сложности была гибернация.


  1. melichronsoul Автор
    15.03.2019 09:44

    Как сказать… Во всех инструкциях, к чему либо, в сети никогда не уделяется внимания деталям. Всегда «это вы догадаетесь, это сами погуглите» etc. Так что так много текста и комментариев для понимания процесса. По поводу картинки, да, это умеет но пока не настраивал таким образом. Как только столкнусь с этим, допишу в статью как настроить сервер и клиентов NUT


  1. Sleuthhound
    15.03.2019 10:27

    root@hostname~# useradd -d /dev/null -s /usr/sbin/nologin -u 339 -g 134 -p UPSPASS upsmonitor


    Сколько раз настраивал NUT и никогда не создавал пользователя в системе, достаточно было указать его в upsd.users

    И upssched тоже можно не настраивать, достаточно в upsmon.conf прописать
    SHUTDOWNCMD "/sbin/shutdown -h +0"