[[ Настройка Network UPS Tools на Ubuntu Server 24.04 ]]

Ubuntu

Настройка Network UPS Tools на Ubuntu Server 24.04

Ubuntu 24.04 LTS
nut 2.8.1
ИБП PowerCom WOW-1000U

NUT (Network UPS Tools) - набор программных компонентов, предназначенных для работы с ИБП (UPS) и др. подобными устройствами.

Подключил домашний сервер к ИБП, управление через USB.
Теперь надо выполнить настройку автоматического выключения, когда пропадает питание от сети.



Установка

sudo apt-get install nut



Определяем драйвер

Подключаем USB кабель, если еще не подключен.
Смотрим lsusb

$ lsusb
...
Bus 001 Device 003: ID 0d9f:0004 Powercom Co., Ltd HID UPS Battery  <----- ИБП
 
# Подробно
$ lsusb -d 0d9f:0004 -v

Смотрим dmesg

$ dmesg
usb 1-2: USB disconnect, device number 3                      <----------------------------- disconnect
usb 1-2: new low-speed USB device number 5 using xhci_hcd
usb 1-2: New USB device found, idVendor=0d9f, idProduct=0004, bcdDevice= 0.02
usb 1-2: New USB device strings: Mfr=3, Product=1, SerialNumber=2
usb 1-2: Product: HID UPS Battery
usb 1-2: Manufacturer: POWERCOM Co.,LTD
usb 1-2: SerialNumber: 004-0D9F-000
hid-generic 0003:0D9F:0004.0004: hiddev1,hidraw2: USB HID v1.00 Device [POWERCOM Co.,LTD HID UPS Battery] on usb-0000:00:14.0-2/input0

Пока не будет загружен драйвер, ИПБ будет постоянно переподключаться.
Поэтому, если выполнить lsusb в этот момент - устройство может не отобразиться.

Запуск авто-сканирование

$ nut-scanner 
nut-scanner 
Cannot load USB library (libusb-1.0.so) : file not found. USB search disabled.     <--------- Библиотека USB не найдена
Cannot load SNMP library (libnetsnmp.so) : file not found. SNMP search disabled.
Cannot load XML library (libneon.so) : file not found. XML search disabled.
Cannot load AVAHI library (libavahi-client.so) : file not found. AVAHI search disabled.
Cannot load IPMI library (libfreeipmi.so) : file not found. IPMI search disabled.
Cannot load NUT library (libupsclient.so) : file not found. NUT search disabled.

Что бы починить поиск libusb-1.0.so установим пакет libusb-1.0-0-dev

sudo apt-get install libusb-1.0-0-dev

Можно создать ссылку вручную и без установки пакета

ln -s libusb-1.0.so.0.4.0 /usr/lib/x86_64-linux-gnu/libusb-1.0.so
но в дальнейшем libusb-1.0-0-dev понадобиться для сборки драйвера

$ nut-scanner 
Cannot load SNMP library (libnetsnmp.so) : file not found. SNMP search disabled.
Cannot load XML library (libneon.so) : file not found. XML search disabled.
Cannot load AVAHI library (libavahi-client.so) : file not found. AVAHI search disabled.
Cannot load IPMI library (libfreeipmi.so) : file not found. IPMI search disabled.
Cannot load NUT library (libupsclient.so) : file not found. NUT search disabled.
Scanning USB bus.
[nutdev1]
        driver = "usbhid-ups"
        port = "auto"
        vendorid = "0D9F"
        productid = "0004"
        product = "HID UPS Battery"
        serial = "004-0D9F-000"
        vendor = "POWERCOM Co.,LTD"
        bus = "003"
        device = "007"
        busport = "002"
        ###NOTMATCHED-YET###bcdDevice = "0002"

Отлично, устройство было найдено и есть нужный драйвер.



Настройка

Установим режим standalone, который подразумевает запуск трех компонентов driver, upsd, upsmon.

  • driver (nut-driver@.service) - загружает драйвер ИБП
  • upsd (nut-server.service) - загружает демон, обеспечивающий сетевой интерфейс для взаимодействие с ИБП
  • upsmon (nut-monitor.service) - загружает демон мониторинга, который следит за состоянием ИБП, отсылает уведомления и выполняет команды.

/etc/nut/nut.conf

MODE=standalone



DRIVER

Настройка драйвера.
По сути результат nut-scanner, только сокращенный, например убрана привязка к физическому порту bus и т.п.

/etc/nut/ups.conf

maxretry = 3

[wow1000u]                           <----- Имя ИБП (может быть произвольное)
driver = "usbhid-ups"                <----- Драйвер
port = "auto"
desc = "UPS PowerCom WOW-1000U"      <----- Описание (может быть произвольное)
ignorelb                             <----- Разрешить переопределять некоторый параметры
override.battery.charge.low = 30     <----- Переопределяем значение низкого уровня заряда (default 10)

Загружаем драйвер

sudo systemctl restart nut-driver@wow1000u
sudo systemctl status nut-driver@wow1000u

Если в момент запуска ИБП не был подключен по USB, то сервис будет автоматически перезапускаться.

StartLimitInterval=0
Restart=always
RestartSec=15s
Поэтому подключить ИБП можно в любой момент после загрузки ОС без использования /etc/udev/rules.d/



UPSD

Настройка upsd

/etc/nut/upsd.conf

LISTEN 127.0.0.1 3493    <----- По умолчанию слушает localhost
                                На всякий случай явно укажу 127.0.0.1
MAXCONN 4                <----- Максимальное количество подключений
                                Не рекомендую ставить меньше 4

Странно, upsc может без авторизации получать данные, а для upsmon обязательно требуется.

Перезапускаем upsd

sudo systemctl restart nut-server.service
sudo systemctl status nut-server.service

Посмотрим, какие данные можно получить

# Получить список ИБП
$ upsc -L
Init SSL without certificate database
wow1000u: UPS PowerCom WOW-1000U
 
# Получить данные
$ upsc wow1000u
Init SSL without certificate database
battery.charge: 100
battery.charge.low: 30
battery.charge.warning: 30
battery.mfr.date: 2014/01/15
battery.runtime: 800
battery.type: PbAc
device.mfr: POWERCOM Co.,LTD
device.model: HID UPS Battery
device.serial: 004-0D9F-000
device.type: ups
driver.debug: 0
driver.flag.allow_killpower: 0
driver.flag.ignorelb: enabled
driver.name: usbhid-ups-0.58
driver.parameter.interrupt_pipe_no_events_tolerance: -1
driver.parameter.override.battery.charge.low: 30
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.synchronous: auto
driver.state: updateinfo
driver.version: 2.8.2.1
driver.version.data: PowerCOM HID 0.71
driver.version.internal: 0.58
driver.version.usb: libusb-1.0.27 (API: 0x100010a)
input.frequency: 50.0
input.voltage: 222.0
input.voltage.nominal: 220
output.frequency: 50.0
output.voltage: 222.0
output.voltage.nominal: 220
ups.beeper.status: enabled
ups.date: 2014/01/15
ups.delay.shutdown: 20
ups.delay.start: 60
ups.load: 0
ups.mfr: POWERCOM Co.,LTD
ups.model: HID UPS Battery
ups.productid: 0004
ups.serial: 004-0D9F-000
ups.status: OL
ups.test.result: Done and passed
ups.timer.shutdown: 0
ups.timer.start: 3441600
ups.vendorid: 0d9f

Статус ИБП ups.status может содержать один или несколько флагов, например:

ups.status: OB DISCHRG
ups.status: OB DISCHRG LB
ups.status: OL CHRG LB
ups.status: OL CHRG

  • OL - ИБП работает от сети
  • OB - ИБП работает от батареи
  • LB - батарея разряжена
  • RB - необходима замена батареи
  • CHRG - батарея заряжается
  • DISCHRG - батарея разряжается
  • BYPASS - ИБП работает в режиме питания от сети в обход батареи
  • OVER - ИБП перегружен
  • TRIM - ИБП отрезает повышенное напряжение сети
  • BOOST - ИБП усиливает пониженное напряжение сети
  • ALARM - предупреждение, должен появиться параметр ups.alarm с ошибкой



UPSMON

Настройка upsmon

/etc/nut/upsmon.conf

# upsmon запускаетcя в два процесса.
# Первый с павами root для выполнения SHUTDOWNCMD.
# Второй с павами nut для всех остальных операций.
RUN_AS_USER nut

# Список ИБП для мониторинга.
# MONITOR <system> <powervalue> <username> <password> ("primary"|"secondary")
#   system - указывается ИБП в формате <upsname>[@<hostname>[:<port>]
#   powervalue - количество блоков питания сервера, подключенных к ИБП
#   username - имя пользователя
#   password - пароль пользователя
#   primary или secondary - тип, подразумевается что primary это ИБП непосредственно питающий данную машину
MONITOR wow1000u@127.0.0.1 1 upsmon "pass123" primary

# Минимальное количество блоков питания компьютера, необходимых для его работы.
# Например, если компьютер обладает 4 блоками питания, но для работы достаточно 2.
# Количество блоков питания, запитанных от определённого ИБП указывается в настройке MONITOR.
MINSUPPLIES 1

# Команда на выключение.
# Будет исполнена когда значение battery.charge будет ниже battery.charge.low
SHUTDOWNCMD "/sbin/shutdown -h +0"

# Интервал в секундах, пауза перед выключением питания.
# Т.е. сперва отправляется уведомление NOTIFY_SHUTDOWN, затем ждет FINALDELAY и запускается SHUTDOWNCMD.
FINALDELAY 5

# Частота опроса ИБП в секундах, при питании от сети.
# NOTE: Данные берутся от драйвера, а у него есть своя политика и частота опроса данных, не стоит ставить "1" т.к. без тюнинга драйвера не имеет смысл
POLLFREQ 5

# Частота опроса ИБП в секундах, при питании от батареи.
POLLFREQALERT 2

# Как долго будет ждать master, пока будут выключатся slave.
HOSTSYNC 15

# Если upsmon теряет связь с upsd и перед потерей связи ИБП работал от батареи,
# то тогда он переходит в статус "dead" и заряд его батареи будет считаться низким,
# что запустит процедуру выключения питания.
# Рекомендуется установить значение в 3 раза больше чем наибольшее из POLLFREQ и POLLFREQALERT.
DEADTIME 15

# Файл-флаг, если появляется, то будет принудительное выключение ИБП на master;
# Но это не точно, т.к. touch /etc/killpower не сработал.
POWERDOWNFLAG /etc/killpower

# Частота сообщений в секундах, о необходимости замены батареи, если батарея будет отмечена, как нуждающаяся в замене.
# ups.alarm: Replace battery!
# ups.status: ALARM OL RB
# ups.test.result: Done and warning
RBWARNTIME 43200

# Частота сообщений в секундах, о потере связи с ИБП.
# Например вытащили USB или был погашен драйвер.
NOCOMMWARNTIME 300

Перезапускаем upsmon

sudo systemctl restart nut-monitor.service
sudo systemctl status nut-monitor.service



Обновление драйвера

Если перезагрузить ОС или остановить сервис драйвера, то обратно ИПБ не подключается.
Перезагрузка не помогает, только физически переткнуть кабель.
Свежий драйвер исправляет эту проблему.

Ошибка Can't initialize data from HID UPS

$ upsdrvctl -d start wow1000u 
Network UPS Tools - UPS driver controller 2.8.1
Network UPS Tools - Generic HID driver 0.52 (2.8.1)
USB communication driver (libusb 1.0) 0.46
Using subdriver: PowerCOM HID 0.7
nut_libusb_get_report: Success
Can't initialize data from HID UPS
upsnotify: failed to notify about state 4: no notification tech defined, will not spam more about it
Driver failed to start (exit status=1)

Любые попытки сделать переподключение USB порта из консоли не помогают

$ usbreset  0d9f:0004
$ echo 3-2 > /sys/bus/usb/drivers/usb/unbind
$ echo 1 > /sys/devices/pci0000\:00/0000\:00\:14.0/usb3/3-0\:1.0/usb3-port2/disable
$ echo "0000:00:14.0" > /sys/bus/pci/drivers/xhci_hcd/unbind

Для сборки драйвера необходимо установить

sudo apt-get install git gcc g++ make automake libtool pkgconf libusb-1.0-0-dev

На момент сборки в master ветке usbhid-ups версии 0.58

$ git clone --depth=1 https://github.com/networkupstools/nut.git
$ cd nut
$ ./autogen.sh
$ ./configure --with-usb=libusb-1.0 --with-drivers=usbhid-ups --with-user=nut --with-group=nut --prefix= --sysconfdir=/etc/nut --with-statepath=/run/nut
$ make -j6
 
# Копируем собранный драйвер добавляя к имени его версию, что бы не перезаписать текущий
$ sudo cp ./drivers/usbhid-ups /usr/lib/nut/usbhid-ups-0.58
 
# Проверка
$ /usr/lib/nut/usbhid-ups-0.58 -V
Network UPS Tools 2.8.2.1 (development iteration after 2.8.2) - Generic HID driver 0.58
USB communication driver (libusb 1.0) 0.50

Теперь необходимо поменять драйвер в конфигурации

/etc/nut/ups.conf

driver = "usbhid-ups-0.58"           <----- Новый драйвер

Перезагрузить

sudo systemctl restart nut-driver@wow1000u
sudo systemctl status nut-driver@wow1000u











Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
73 +8 = 
 
howto/ubuntu/ubuntu24.04_nut_standalone.txt · Последнее изменение: 2025/01/01 18:26 — lexa
Gentoo Linux Gentoo Linux Driven by DokuWiki