Предисловие Ссылка на заголовок
Несколько лет назад, для резервного питания роутера и 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
Вы великолепны 🎉.