скопировано отсюда
Описание
Сервис 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