- PVSM.RU - https://www.pvsm.ru -
Сервис Linux NUT (Network UPS Tools) — это комплекс программ мониторинга и управления различными блоками бесперебойного питания (далее ИБП). Полный список поддерживаемых моделей можно получить, посмотрев список драйверов в файле /usr/share/nut/driver.list.
В руководстве описана настройка отключения ПК агентом NUT при потере напряжения в сети на примере ИБП Eaton 5E 650iUSB на Ubuntu-подобных дистрибутивах. Для использования под другие дистрибутивы используйте пакетный мененджер своего дистрибутива или соберите из исходных кодов. Новейшую версию Network UPS Tools можно скачать на GitHub по ссылке ссылке [1].
Для начала следует установить 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/*
Дописываем строки в конец файла /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 интерфейсу ИБП, нужно написать правило доступа для 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
Если вывод приблизительно такой, то все настроено правильно.
Дописываем строки в конец файла /etc/nut/upsd.conf или создаем новый с таким содержимым:
root@hostname~# nano /etc/nut/upsd.conf
# Прослушивать Loopback интерфейс на порту 3493
LISTEN 127.0.0.1 3493
Имейте в ввиду что LISTEN должно быть написано именно большими буквами, или работать ничего не будет.
Создаем пользователя 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
Дописываем строки в конец файла /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: и могут принимать значения:
ИБП можно давать команды напрямую из консоли, с помощью команды 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.
Дописываем строки в конец файла /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
На этом настройка завершена. Можно протестировать, банально выдернув ИБП из розетки.
Автор: melichronsoul
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/nastrojka-linux/311614
Ссылки в тексте:
[1] ссылке: https://github.com/networkupstools/nut
[2] Источник: https://habr.com/ru/post/443736/?utm_campaign=443736
Нажмите здесь для печати.