Предисловие Ссылка на заголовок
Несколько лет назад, для резервного питания роутера и Orange Pi, я покупал ИБП Powercom WOW-700U . Хороший, дешёвый девайс, имеет USB порт, автоматически включается при появлении напряжения, не ест из розетки лишнего электричества, так как тип ИБП “резервный”, что очень хорошо, когда он должен быть включён 24/7, в отличии от моего основного ИБП1, который не прочь покушать ~50 Ватт из-за своей “интерактивной” технологии.
Время шло и Orange Pi сначала заменилась на мини-ПК на атоме, а потом и старый ПК стал сервером.
Но давайте перейдём уже к сути и самой настройке ИБП на Debian-like Linux!

Кадр из мультфильма “Ледниковый период”
Базовая настройка NUT Ссылка на заголовок
Для начала установим NUT:
apt install nutПодключаем наш ИБП к ПК и посмотрим, как он определяется в системе:
lsusbВот как выглядит вывод команды у меня:
Bus 001 Device 002: ID 8087:8009 Intel Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 019: ID 0d9f:0004 Powercom Co., Ltd
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubТеперь необходимо сказать NUT, что у нас для него есть ИБП, для этого добавим в конец файла /etc/nut/ups.conf
maxretry = 3
[ups]
driver = usbhid-ups
port = autoСкопируем список udev правил, чтобы разрешить пользователю без прав root использовать данное USB устройство:
cp /lib/udev/rules.d/62-nut-usbups.rules /etc/udev/rules.d/В моём случае, в правилах уже был прописан мой ИБП, но если вашего там нет, то просто добавляем в конец файла правило, заменив ID на свои, которые можно посмотреть в выводе команды lsusb
ATTR{idVendor}=="0d9f", ATTR{idProduct}=="0004", MODE="664", GROUP="nut"Перезапустим udev
systemctl restart udevНеобходимо отключить и снова подключить USB кабель к ПК, чтобы правило применилось.
Переведём NUT в standalone mode, для этого отредактируем файл /etc/nut/nut.conf и заменим стандартное значение на
MODE=standaloneНастроим сервер и создадим юзера, который сможет получать данные от ИБП
Заменим содержимое 2х файлов:
/etc/nut/upsd.conf на
# LISTEN <address> [<port>]
LISTEN 127.0.0.1 3493
LISTEN ::1 3493и /etc/nut/upsd.users на
[upsmonitor]
password = 1234
upsmon masterЯ понимаю, что год Канонизации Святого Доминика Григорием IX 2 в качестве пароля, так себе идея, но дальше localhost к NUT не подключиться.
Настроим мониторинг ИБП, который будет выключать ПК при низком заряде батареи, для этого отредактируем файл /etc/nut/upsmon.conf и добавим в него:
MONITOR ups@localhost 1 upsmonitor 1234 masterПосле этого запускаем сервисы
systemctl start nut-driver
systemctl start nut-server
systemctl start nut-clientПроверяем, что всё хорошо с помощью upsc ups (должен вывести информацию об ИБП).
Далее, сделаем, чтобы всё автоматически запускалось после рестарта:
systemctl enable nut-server
systemctl enable nut-clientНо вот с nut-driver так сделать не получится, так как получим ошибку:
The unit files have no installation config (WantedBy, RequiredBy, Also, Alias
settings in the [Install] section, and DefaultInstance for template units).
This means they are not meant to be enabled using systemctl.Казалось бы, может и не надо ему включать автозапуск? Но вот у меня без автозапуска драйвера не работает ¯\_(ツ)_/¯.
Ошибку легко исправить, просто немного отредактируем сервис с помощью команды
systemctl edit nut-driverи добавим:
[Install]
WantedBy=multi-user.targetТеперь можно включить автозапуск и ошибки не будет:
systemctl enable nut-driverПолезные команды Ссылка на заголовок
Для отладки, могут быть полезны следующие команды:
# информация ИБП
upsc ups
# запуска драйвера вручную
upsdrvctl start
# или запуск драйвера от root
upsdrvctl -u root start
# какие команды принимает ИБП
upscmd -l ups
# какие параметры на запись принимает ИБП
upsrw upsБазовая настройка завершена Ссылка на заголовок
Вот так вот, “легко” и “просто”, можно настроить ИБП на Linux, который будет выключать комп при низком заряде батареи, процент указан в параметре battery.charge.low ИБП.
В моём случае там установлено значение 10%, но ИБП отключается уже на 30% и поэтому ПК никогда не завершит работу успешно. Поэтому переходим к…
Немного продвинутая настройка Ссылка на заголовок
Я хочу, чтобы ИБП отключался через 2 минуты после того, как пропало электричество.
Для этого, сначала отредактируем файл /etc/nut/upsmon.conf, добавив туда
NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
NOTIFYCMD /usr/sbin/upsschedТеперь, при пропаже/появление электричества, будет запускаться /usr/sbin/upssched
which upssched, что у вас такой же путь до upssched, что и у меня.Редактируем настройки upssched в /etc/nut/upssched.conf, изменяем/добавляем:
CMDSCRIPT /usr/bin/upssched-cmd
PIPEFN /var/run/nut/upssched.pipe
LOCKFN /var/run/nut/upssched.lock
AT ONBATT * START-TIMER shutdown-timer 120
AT ONLINE * CANCEL-TIMER shutdown-timerПри пропаже электричества, будет запускаться таймер на 120 сек и по истечению времени, запускать скрипт /usr/bin/upssched-cmd, а при появлении электричества, таймер будет останавливаться.
Создадим скрипт /usr/bin/upssched-cmd со следующим содержанием:
#! /bin/sh
case $1 in
shutdown-timer)
logger -t upssched-cmd "Shutdown timer reached, calling upsmon -c fsd."
/usr/sbin/upsmon -c fsd
;;
upsgone)
logger -t upssched-cmd "The UPS has been gone for awhile"
;;
*)
logger -t upssched-cmd "Unrecognized command: $1"
;;
esacПерезапускаем сервис мониторинга
systemctl restart nut-monitorВы великолепны 🎉.