Настройка 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
https://networkupstools.org/docs/man/ups.conf.html
https://networkupstools.org/docs/man/usbhid-ups.html
https://networkupstools.org/docs/man/upsmon.conf.html
Обсуждение