Настройка NUT в pfSense и Debian Bullseye для автоматического выключения устройств при отключении электропитания.
Устройства и ПО:
- Ippon Back Comfo Pro II 1050 | Ippon Back Basic 2200 | Ippon Innova RT II 6000;
- Кабель USB Type A male | USB Type B male | USB to Serial (RS232);
- Raspberry Pi 3 model b | NanoPi Neo Core;
- Repositories pacgage Raspberry Pi OS | DietPi: NUT 2.7.4-13 # Версия используемого пакета NUT;
- pfSense 2.4.3-RELEASE-p1;
- Windows 10;
- WinNUT-2.0.0.4a # Форк офф. клиента под Windows;
- Windows NUT client 1.5.0 # Офф. клиент;
Варианты настройки и использования:
В роли сервера/клиента.
- v1 - pfSense (Master);
- v2 - Raspberry Pi 3 model b | NanoPi Neo Core (Master);
- Windows 10 (Slave);
v1 - pfSense:
Установка NUT:
Переходим в менеджер пакетов и устанавливаем nut.
System -> Package Manager -> Available Packages
Настройка NUT:
Зададим способ подключения к ИБП, отображаемое имя, выберем подходящий драйвер. Переопределим порог на автоматическое выключение устройств при достижении оставшегося % заряда. Опишем пользователей для подключения к серверу.
Services -> UPS -> UPS Settings
# - General Settings
UPS Type - Local USB
UPS Name - ippon
Notifcations - Enable E-Mail notifications (По желанию)
# - Driver Settings
Driver - blazer
Extra Arguments to driver (optional):
ignorelb # Переопределение стандартых параметров на свои;
override.battery.charge.low = 75 # Послать сигнал на выключение при достижении % заряда;
# override.battery.runtime.low = 60 # Или при расчете UPS остатка заряда в секундах;
# - Advanced settings
Additional configuration lines for upsd.users:
[comp]
password = pass
upsmon slave
После сохранения настроек можно перейти на вкладку UPS Status и просмотреть состояние и детальную информацию о подключенном ups.
Настройка Firewall и NAT:
Тут нам необходимо пробросить порт из pfSense (на нем работает nut) "127.0.0.1" в локальную сеть "192.168.5.1".
Firewall -> NAT -> Port Forward -> Add
# - Edit Redirect Entry
Interface - LAN
Protocol - TCP
Destination - LAN Address (192.168.5.1)
Destination port range - 3493
Redirect target IP - 127.0.0.1
Redirect target port - 3493
Description - Nut-Server
Проверка соединения с сервером nut: [Windows NUT client]
Эта небольшая программа поможет наглядно отобразить текущее состояние UPS. Есть минус, она не работает как служба, но можно добавить в автозапуск через планировщик. Также есть возможность завершения работы Windows по достижению % заряда батареии.
Показать изображение:
Настройка:
Settings -> Connection
UPS host: 192.168.5.1 # Задаем имя хоста или ip-адрес;
UPS port: 3493 # Указываем стандартный порт;
UPS name: ippon # Имя;
Delay: 5000 # Задержка;
-> Misc
Minimize to tray: * # Свернуть программу в трей;
Shutdown if battery lover then: 0% # Уровень заряда, по достижению которого, хост будет выключен;
Нам она понадобится для наглядной проверки соединения с сервером NUT.
Windows Client Settings: [ WinNUT - GitHub | Google Code ]
Это облегченный порт клиента "upsmon". К его возможностям относятся: ведение логов, отображение настраиваемых уведомлений, автовыключение компьютера и, самое главное, работа в качестве фоновой службы.
Показать изображение:
Настройка upsmon.conf:
Значения переменных такие же, как и в офф. клиенте. Обратим внимание лишь на:
- Открываем настройки,
Configuration File Path -> Edit
- Значения параметров,
MONITOR ippon@192.168.5.1 1 comp pass slave # Сервер NUT;
FINALDELAY 5 # Задержка перед выключением системы;
На этом все. Осталось проверить работу сервиса в логах "WinNUTUpsMon.log".
v2 - Raspberry Pi 3 model b | NanoPi Neo Core:
Полезные источники:
Структура NUT:
- ups - Взаимодействует с ИБП. Называется драйвер. Настраивается модель ИБП, иногда вольтаж.
- upsd - Собирает данные с драйверов и смотрит в сеть. В ней настраиваются пользователи для управления ИБП и возможности подключения клиентов с upsmon.
- upsmon - Опрашивает upsd, рассылает уведомления пользователям и принимает решение о выключении хоста. В ней настраивается возможность подключения к upsd.
Вспомогательные программы:
- upsc - Взаимодействие с сервером через cli;
- upsdrvctl - Контроллер драйвера ИБП;
- upscmd - Администрирование ИБП;
- upssched - Помощник по таймеру для планирования событий от upsmon.
Конфигурационные файлы: [ Перевод на RUS | NUT Manual ]
- nut.conf - Задается тип работы nut;
- ups.conf - Конфигурация драйвера и способа подключения к ИБП;
- upsd.conf - Конфигурация сервера;
- upsd.users - Описание клиентов и пользователей;
- upsmon.conf - Конфигурация клиента, для соединения с сервером;
- upssched.conf - Логика отработки событий через скрипт upssched;
Подключение UPS:
Проверим подключенные устройства. Нас интересует "Cypress Semiconductor USB to Serial" или "QinHeng Electronics CH340 serial converter". Узнаем его vendor:[product] ID.
# lsusb
Bus 001 Device 004: ID 0665:5161 Cypress Semiconductor USB to Serial
Bus 008 Device 002: ID 1a86:7523 QinHeng Electronics CH340 serial converter
- Выводим дополнительную информацию.
# lsusb -vd 0665:5161
Устанавливаем Network UPS Tools:
Установятся nut-server и nut-client.
# apt install nut
Настраиваем менеджер устройств UDEV:
Прописав vendor:[product] ID UPS.
В моем случае UPS автоматически определился драйвером. Я этот шаг пропустил.
# nano /etc/udev/rules.d/98-nut-usb.rules
# Ippon Back Comfo Pro II 1050
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0665", ATTR{idProduct}=="5161", GROUP="nut", MODE="0660"
- Перечитаем правила udev устройств,
# udevadm control --reload-rules
# udevadm trigger
# service udev restart
Указываем тип работы nut:
Для master системы "MODE=netserver", для slave "MODE=netclient".
# nano /etc/nut/nut.conf
MODE=netserver
Узнать имя необходимого драйвера для UPS: [link]
Или же ореинтироваться по этому списку.
# cat /usr/share/nut/driver.list | grep -iw ippon
Настраиваем способ подключения и конфигурацию драйвера ups: [ ups.conf | blazer_usb | blazer_ser ]
Настройка подключения:
* COM-порт -> /dev/ttyS0 | blazer_ser;
* COM to USB -> /dev/ttyUSB0 | blazer_ser;
* USB-порт -> auto | blazer_usb.
- Настройка прав: В зависимости от способа подключения.
# ls -l /dev/ttyUSB0
# usermod -a -G dialout nut
# ls -l /dev/ttyS0
# usermod -a -G tty nut
# id nut
# reboot
Драйвер upsdrvctl:
# nano /etc/nut/ups.conf
[ippon]
driver = blazer_usb
port = auto
desc = "Ippon Back Comfo Pro II 1050"
default.battery.voltage.low = 10.4
default.battery.voltage.high = 13.6
ignorelb # Драйвер игнорирует флаг низкого уровня заряда батареи;
override.battery.charge.low = 90 # Когда батарея считается разряженной;
ondelay = 3 # Время ожидания перед включением UPS (minutes);
offdelay = 120 # Время ожидания перед выключением UPS (seconds);
Очень важно - правильно задать в "ups.conf" вольтаж батареи:
Иначе при статусе "OB", заряд батареи не будет уменьшаться по мере расхода и будет показываться всегда 100%. Для подбора значений ставим комментарий напротив параметров отвечающих за вольтаж и выполняем команду upsdrvctl start
. Драйвер попытается выставить подходящие значения самостоятельно.
Полученные значения подставляем в конфиг:
- Ippon Back Basic 2200:
default.battery.voltage.high = 26
default.battery.voltage.low = 20.8
- Ippon Innova RT II 6000:
default.battery.voltage.low = 166.4
default.battery.voltage.high = 208
Дополнительные настройки ИБП:
После пропадания питания и отправки команды клиентам на выключение ОС, ИБП будет ждать указанное время,
после которого сам выключится. Также и для включения, только в обратном порядке.
Необходимо засечь время требуемое для полного выключения всех устройств и прибавить +10(20) секунд.
Полученное время добавить в "ups.conf" в параметр "offdelay =". Параметр "override.ups.delay.shutdown =" не работает, его определяет "offdelay".
Время выключения/включения ИБП после отсутствия/появления питания:
ups.delay.shutdown: 30 # Время в секундах, после которого ИБП выключится;
ups.delay.start: 180 # Время в секундах, после которого ИБП включится;
Запускаем демон upsd:
# upsdrvctl start
- Подключаемся к серверу nut и выводим его параметры;
# upsc ippon | upsdrvctl ippon@localhost
- Если все ок, то останавливаем демон и идем дальше;
# upsdrvctl stop
Описываем какие ip:port будет слушать демон upsd:
Github Issue - В моем примере, если в конфиге не прописать "LISTEN 0.0.0.0", то демон, после включения или перезагрузки "rp3" почему-то автоматически не стартует. В ручную все ок! Мне, путем перебора всевозможных вариантов, удалось решить именно таким способом.
# systemctl status nut-server.service
- Ошибки вида,
not listening on 192.168.6.2 port 3493
no listening interface available
По умолчанию, сервер NUT работает на 3493 порту. Если требуется нестандартный порт, то после ip-адреса указывется требуемый порт.
# nano /etc/nut/upsd.conf
LISTEN 0.0.0.0 # Использовать все ip-адреса на локальном хосте;
# LISTEN 127.0.0.1 # Для того чтобы расположенный на этом же сервере nut-client смог подключиться;
# LISTEN 192.168.6.2 # ip-адрес сервера nut;
- Стартуем сервер,
# systemctl start nut-server.service | # service nut-server start
- Проверяем,
# service nut-server status
# netstat -ltun | grep 3493
Если спустя 1-3 дня связь с UPS теряется, то поможет редактирование параметра "MAXAGE", в конфиге "/etc/nut/upsd.conf", поставив значение "= 20 или 35".
Настройка пользователей:
# nano /etc/nut/upsd.users
[admin]
password = pass
actions = SET
instcmds = ALL
[pve5]
password = pass
upsmon slave
[sbc0]
password = pass
upsmon master
[sbc1]
password = pass
upsmon slave
[ws]
password = pass
upsmon slave
Настраиваем демон клиента upsmon:
Задав логику работы с событиями от ИБП. Клиент находится на том же хосте ("sbc0") где и сервер nut.
# nano /etc/nut/upsmon.conf
MONITOR ippon@localhost 1 sbc0 pass master (или slave) # Список систем, которые вы хотите контролировать;
MINSUPPLIES 1 # Укажите число источников питания, которые поддерживают работоспособность вашей системы;
SHUTDOWNCMD "/sbin/shutdown -h +0" # upsmon запускает эту команду, когда необходимо остановить систему;
# NOTIFYCMD /bin/notifyme # upsmon вызывает эту команду для отправки сообщения, когда что-то случается;
POLLFREQ 5 # Частота опроса во время нормальной деятельности, измеряемая в секундах;
POLLFREQALERT 5 # Частота опроса в секундах, когда ИБП работает от батареи;
HOSTSYNC 15 # Как долго upsmon будет ждать, прежде чем отсоединится другой upsmon;
DEADTIME 15 # Интвервал ожидания, по истечению которого stale ИБП помечается как "dead";
POWERDOWNFLAG /etc/killpower # Файл-флаг, выполняющий принудительное выключение ИБП на master-системе;
# NOTIFYMSG * # Изменение текста сообщения, посылаемого upsmon после определенных событий;
# NOTIFYFLAG # Изменение поведения upsmon при уведомлении о случившихся событиях;
RBWARNTIME 43200 # RBWARNTIME - Время вывода сообщения о необходимости замены аккумулятора (в секундах);
NOCOMMWARNTIME 300 # Время отсутствия оповещающих сообщений (в секундах);
FINALDELAY 5 # Последний интервал ожидания перед выключением системы;
- Рестартуем демон клиента,
# /etc/init.d/nut-client restart [status]
Локальный клиент "upsmon" на хосте "sbc0" готов к использованию. Осталось настроить остальных клиентов. В pfSense, необходимо лишь задать опцию "UPS Type" как "Remote NUT Server" в разделе "Services -> UPS -> UPS Settings" и прописать учетные данные slave клиента [pfsense] и адрес сервера nut. Под Windows аналогично.
Управление демонами:
- Systemd:
# systemctl enable nut-server.service
# systemctl enable nut-client.service
# systemctl enable nut-monitor.service
- Расположение .service systemd:
/etc/systemd/system/multi-user.target.wants/nut-server.service
- /etc/init.d/
- Добавить в автозагрузку;
# update-rc.d nut-server defaults
# update-rc.d nut-client defaults
- Удалить из автозагрузки;
# update-rc.d nut-server remove
# update-rc.d nut-client remove
Возможные значения параметра "ups.status":
# upsc ippon ups.status
OL - ИБП работает от сети;
OB - ИБП работает от батареи;
LB - батарея разряжена;
RB - необходима замена батареи;
CHRG - батарея заряжается;
DISCHRG - батарея разряжается;
BYPASS - ИБП работает в режиме питания от сети в обход батареи;
OVER - ИБП перегружен;
TRIM - ИБП уменьшает повышенное напряжение сети;
BOOST - ИБП усиливает пониженное напряжение сети.
Команды для работы с сервисами NUT:
- Список настроенных UPS:
# upsc -L
- Просмотреть значение параметра бипера:
# upsc ippon ups.beeper.status
- Просмотреть список доступных команд:
# upscmd -l ippon@localhost
- Сделать быстрый тест батареи:
# upscmd -u admin -p 'pass' ippon@localhost test.battery.start.quick
- Остановить тест:
# upscmd -u admin -p 'pass' ippon@localhost test.battery.stop
- Запустить тест на выключение (аналогично тому, когда UPS переходит в состояние LB - батарея разряжена):
# upsmon -c fsd
- Поиск UPS:
# nut-scanner
UPSSCHED + Synology NAS:
"UPSSCHED" - ("Распиcание для UPS") был создан, чтобы пользователи могли запускать программы в моменты времени, соответствующие событиям, отслеживаемым "upsmon". Первоначальная цель заключалась в том, чтобы разрешить отключение после определенного периода работы от батареи, но возможны и другие варианты использования.
"UPSSCHED" следует запускать из "upsmon" через "NOTIFYCMD". Вы никогда не должны запускать его напрямую во время обычных операций.
Настройка UPSSCHED:
"UPSSCHED" нужно вызывать как "NOTIFYCMD" в вашем "upsmon.conf". Он определяет, что происходит, на основе переменных среды "UPSNAME" и "NOTIFYTYPE". Вам никогда не придется иметь дело с ними напрямую.
Установите флаг "EXEC" для событий, которые вы хотите видеть в "upssched". Например, чтобы убедиться, что "upssched" узнает о событиях "ONLINE", "ONBATT" и "LOWBATT", флаги будут выглядеть так.
Конфигурация клиента - upsmon.conf:
# Возможные значения для <notify type>:
- ONLINE: UPS подключен;
- ONBATT: UPS работает от батареии;
- LOWBATT: Низкий/критический заряд батареи UPS;
- FSD: UPS начало завершения работы (FSD = "Принудительное завершение");
- COMMOK: Установлено соединение с UPS;
- COMMBAD: Потеря связи с UPS;
- SHUTDOWN: Система на этапе остановки;
- REPLBATT: Батарея UPS испорчена и нуждается в замене;
- NOCOMM: UPS недоступен (не возможно соединиться для мониторинга);
# Возможные значения для <flags>:
- SYSLOG - Вывод сообщения в системный журнал;
- WALL - Вывод сообщения всем пользователям системы через wall;
- EXEC - Выполните команду NOTIFYCMD;
- IGNORE - Ничего не делать. Если вы используете это, не используйте другие флаги;
Чтобы проверить автоматическое выполнение команд из "upssched-cmd" при наступлении событий, можно воспользоваться "COMMOK" и "COMMBAD".
# nano /etc/nut/upsmon.conf
- Пользователь, от которого будет запускаться upsmon:
# RUN_AS_USER nut
- Вызываем upssched как NOTIFYCMD:
NOTIFYCMD /sbin/upssched
- Действия над событиями UPS:
NOTIFYFLAG ONLINE EXEC
NOTIFYFLAG ONBATT EXEC
NOTIFYFLAG LOWBATT EXEC
Планировщик над событиями - upssched.conf:
- Проверяем права на создание файла от пользователя nut.
# sudo -u nut touch /run/nut/push.file
- Определяем обработчик для определенного типа уведомления о событии на upsname UPS.
<AT> <notifytype> <upsname> <command>
- EXECUTE | START-TIMER | CANCEL-TIMER
# nano /etc/nut/upssched.conf
CMDSCRIPT /bin/upssched-cmd
PIPEFN /run/nut/upssched.pipe
LOCKFN /run/nut/upssched.lock
AT ONBATT ippon@localhost START-TIMER synology-nas 20
AT ONLINE ippon@localhost CANCEL-TIMER synology-nas
- Или,
AT LOWBATT ippon@localhost EXECUTE synology-nas
Действия над событиями - upssched-cmd:
Настраиваем команды, которые будут выплняться при наступлении определенного события.
# nano /bin/upssched-cmd
synology-nas)
sshpass -p pass dbclient admin@ip_address "sudo poweroff"
;;
- Проверка команды:
# sudo -u nut upssched-cmd synology-nas
Настройка Synology NAS:
- Включение SSH доступа:
Панель управления -> Терминал и SNMP:
* Включить службу SSH;
* Порт: 22
- Создание группы для NUT (с возможностью выключения)
Пользователь и группа -> Группа -> Создать:
* Название группы: nut
* Свойства группы: Poweroff via SSH
* Участники группы: admin
Подключаемся по SSH:
admin@nas:/$ sudo su | $ sudo -i
root@nas:~# vi /etc/sudoers
- i
%nut ALL=NOPASSWD: /sbin/halt, /sbin/reboot, /sbin/poweroff
- wq!
Теперь эти команды можно выполнить от обычного пользователя состоящего в группе nut и также без ввода пароля:
admin@nas:/$ sudo poweroff