Предисловие

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

Время шло и Orange Pi сначала заменилась на мини-ПК на атоме, а потом и старый ПК стал сервером.

Но давайте перейдём уже к сути и самой настройке ИБП на Debian-like Linux!

Кадр из мультфильма "Ледниковый период"

Кадр из мультфильма "Ледниковый период"

Базовая настройка NUT

Для начала установим NUT:

1
apt install nut

Подключаем наш ИБП к ПК и посмотрим, как он определяется в системе:

1
lsusb

Вот как выглядит вывод команды у меня:

1
2
3
4
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

1
2
3
4
maxretry = 3
[ups]
  driver = usbhid-ups
  port = auto

Скопируем список udev правил, чтобы разрешить пользователю без прав root использовать данное USB устройство:

1
cp /lib/udev/rules.d/62-nut-usbups.rules /etc/udev/rules.d/

В моём случае, в правилах уже был прописан мой ИБП, но если вашего там нет, то просто добавляем в конец файла правило, заменив ID на свои, которые можно посмотреть в выводе команды lsusb

1
ATTR{idVendor}=="0d9f", ATTR{idProduct}=="0004", MODE="664", GROUP="nut"

Перезапустим udev

1
systemctl restart udev

Необходимо отключить и снова подключить USB кабель к ПК, чтобы правило применилось.

Переведём NUT в standalone mode, для этого отредактируем файл /etc/nut/nut.conf и заменим стандартное значение на

1
MODE=standalone

Настроим сервер и создадим юзера, который сможет получать данные от ИБП

Заменим содержимое 2х файлов:

/etc/nut/upsd.conf на

1
2
3
# LISTEN <address> [<port>]
LISTEN 127.0.0.1 3493
LISTEN ::1 3493

и /etc/nut/upsd.users на

1
2
3
[upsmonitor]
password = 1234
upsmon master

Я понимаю, что год Канонизации Святого Доминика Григорием IX 2 в качестве пароля, так себе идея, но дальше localhost к NUT не подключиться.

Настроим мониторинг ИБП, который будет выключать ПК при низком заряде батареи, для этого отредактируем файл /etc/nut/upsmon.conf и добавим в него:

1
MONITOR ups@localhost 1 upsmonitor 1234 master

После этого запускаем сервисы

1
2
3
systemctl start nut-driver
systemctl start nut-server
systemctl start nut-client

Проверяем, что всё хорошо с помощью upsc ups (должен вывести информацию об ИБП).

Далее, сделаем, чтобы всё автоматически запускалось после рестарта:

1
2
systemctl enable nut-server
systemctl enable nut-client

Но вот с nut-driver так сделать не получится, так как получим ошибку:

1
2
3
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.

Казалось бы, может и не надо ему включать автозапуск? Но вот у меня без автозапуска драйвера не работает ¯\_(ツ)_/¯.

Ошибку легко исправить, просто немного отредактируем сервис с помощью команды

1
systemctl edit nut-driver

и добавим:

1
2
[Install]
WantedBy=multi-user.target

Теперь можно включить автозапуск и ошибки не будет:

1
systemctl enable nut-driver

Полезные команды

Для отладки, могут быть полезны следующие команды:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# информация ИБП
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, добавив туда

1
2
3
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, изменяем/добавляем:

1
2
3
4
5
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 со следующим содержанием:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#! /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

Перезапускаем сервис мониторинга

1
systemctl restart nut-monitor

Вы великолепны 🎉.


  1. IPPON Smart Power PRO 1000 ↩︎

  2. Хакеры подобрали пароль к моей почте. Но как они узнали, что я загадал год Канонизации Святого Доминика Григорием IX? Это 1234-й. ↩︎