Настройка 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
upsmon 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
Заключение
На этом настройка завершена. Можно протестировать, банально выдернув ИБП из розетки.