пятница, 5 июня 2015 г.

Подключение и настройка ИБП (Источника бесперебойного питания)


Многие источники бесперебойного питания (далее ИБП) имеют интерфейс для подключения к компьютеру, для возможности безопасно отключить его после исчерпания заряда батареи. Как правило, это интерефейс RS-232 (или COM-порт), но на некоторых моделях также присутствует USB (а на новых он единственный). У меня есть ИБП Ippon Back Power Pro 600. Думаю многим он знаком:








ИБП довольно старенький, имеет в наличии как COM-порт, так и USB. Для управления им, и настройки отключения питания компьютера, с ним поставляется специальное ПО – Winpower Manager. Данное ПО написано на Java, и доступно на широком спектре платформ (в том числе и Linux). К сожалению, мне так и не удалось нормально завести её в Linux, не поломав систему. Справедливости ради отмечу, что и в Windows она работала из рук вон плохо. Регулярно теряла связь с ИБП, пару раз сбивался планировщик. В общем, мне это не подошло. В итоге, было решено не париться, и сделать всё штатными средствами, доступными в любом дистрибутиве Linux.



Речь пойдёт о программе NUT (Network UPS Tools) – клиент-серверной программе для управления и мониторинга ИБП как по COM и USB, так и по локальной сети. Пример буду проводить на Debian 8 Jessie.

Для начала установим необходимые пакеты:

sudo apt install nut

По зависимостям подтянутся дополнительные утилиты. Для начала, укажем серверу nut, что мы не хотим подключаться к нему удалённо (из соображений безопасности, да и многим ли это нужно дома?). Открываем файл /etc/nut/nut.conf в любимом текстовом редакторе (я использую nano), ищем строку MODE= и пишем рядом standalone

MODE=standalone

Предполагается, что ИБП подключён по USB. Драйвер для работы с USB в моём ИБП называется blazer_usb. Для вашей модели, смотрим тут http://www.networkupstools.org/stable-hcl.html

Открываем файл /etc/nut/ups.conf и приводим к такому виду:


[ippon]
driver = blazer_usb
port = /dev/usb/hiddev0
desc = "Ippon Back Power Pro 600"
default.battery.voltage.high = 13.60
default.battery.voltage.low = 11.7
offdelay = 12
ondelay = 13



[ippon] – имя нашего ИБП, можете написать любое.

driver – драйвер, так как подключение идёт по USB, то это blazer_usb

port – порт подключения. Я указал стандартный, можете просто указать auto

desc – комментарий.

default.battery.voltage.high = 13.60 – номинальное напряжение аккумулятора

default.battery.voltage.low = 11.7 – минимальное напряжение аккумулятора

offdelay – задержка в секундах, после которой ИБП отключится (после того как отключил ПК)

ondelay – задержка в минутах, после которой ИБП включится сам.

Теперь настроим доступ к нашему ИБП. Открываем /etc/nut/upsd.conf и пишем:



ACL all 0.0.0.0/0
ACL localhost 127.0.0.1/32
ACCEPT localhost
REJECT all
LISTEN 127.0.0.1 3493
LISTEN ::1 3493



Здесь всё просто. Указываем доступ к ИБП с нашего компа (localhost) по порту 3493 (порт стандартный).

Служба UPS, а равно как и монитор, должны запускаться от отдельного пользователя, находящегося в группе nut. Группа nut создаётся автоматически при установке пакета.

Создадим нового пользователя ipponmaster, через которого будем управлять ИБП:

sudo adduser ipponmaster
Добавим пользователя ipponmaster в группу nut:
sudo usermod -G nut ipponmaster 

Теперь пропишем нового пользователя в настройках. Открываем /etc/nut/upsd.users 
[ipponmaster]
password = password #здесь укажите пароль, который указали при создании ipponmaster
allowfrom = localhost
upsmon master
instcmds = ALL
actions = SET
Теперь настроим мониторинг. Открываем /etc/nut/upsmon.conf и приводим к такому виду:
MONITOR ippon@localhost 1 ipponmaster password master
MINSUPPLIES 1
NOTIFYCMD /sbin/upssched
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower
SHUTDOWNCMD "/sbin/shutdown -Ph +0"
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5
NOTIFYMSG ONLINE     "UPS %s on line power"
NOTIFYMSG ONBATT     "UPS %s on battery"
NOTIFYMSG LOWBATT    "UPS %s battery is low"
NOTIFYMSG FSD        "UPS %s: forced shutdown in progress"
NOTIFYMSG COMMOK     "Communications with UPS %s established"
NOTIFYMSG COMMBAD    "Communications with UPS %s lost"
NOTIFYMSG SHUTDOWN   "Auto logout and shutdown proceeding"
NOTIFYMSG REPLBATT   "UPS %s battery needs to be replaced"
NOTIFYMSG NOCOMM     "UPS %s is unavailable"
NOTIFYMSG NOPARENT   "upsmon parent process died - shutdown impossible"
NOTIFYFLAG ONLINE    SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT    SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT   SYSLOG+WALL+EXEC
NOTIFYFLAG FSD       SYSLOG+WALL+EXEC
NOTIFYFLAG COMMOK    SYSLOG+WALL+EXEC
NOTIFYFLAG COMMBAD   SYSLOG+WALL+EXEC
NOTIFYFLAG SHUTDOWN  SYSLOG+WALL+EXEC
NOTIFYFLAG REPLBATT  SYSLOG+WALL+EXEC
NOTIFYFLAG NOCOMM    SYSLOG+WALL+EXEC
NOTIFYFLAG NOPARENT  SYSLOG+WALL+EXEC 
SHUTDOWNCMD "/sbin/shutdown -Ph +0" - команда для выключения компьютера при низком заряде батареи. Однако мне это не подходит по той причине, что батарея в моём ИБП уже на исходе сил, и держит лишь полторы-две минуты. Поэтому мне нужно настроить отключение компьютера спустя минуту посл перехода ИБП на батарею. Вы возможно тоже захотите указать определённое время отключения.
Приступим. Открываем /etc/nut/upssched.conf 
CMDSCRIPT /bin/upssched-cmd
PIPEFN /tmp/upspipe
LOCKFN /tmp/upslock 
AT COMMBAD * EXECUTE commbad
AT COMMOK * EXECUTE commok
AT NOCOMM * EXECUTE nocomm
AT ONBATT * EXECUTE powerout
AT ONBATT * START-TIMER pwdown 60
AT LOWBATT * EXECUTE pwcritical
AT ONLINE * CANCEL-TIMER pwdown
AT ONLINE * EXECUTE powerup
Это планировщик. Здесь я указал, что нужно запустить скрипт для выключения ПК спустя одну минуту после переключения ИБП на батарею
(время в секундах, в моём случае 60).
Далее открываем /bin/upssched-cmd и заменяем его содержимое на: 
#!/bin/bash
case $1 in
      commbad)
      logger  "UPS communications failure"
      ;;
      commok)
      logger  "UPS communications restored"
      ;;
      nocomm)
      logger  "UPS communications cannot be established"
      ;;
      powerout)
      logger "UPS on battery. Shutdown in 60 seconds...."
      /sbin/upscmd -u ipponmaster -p password ippon@localhost shutdown.return
      ;;
      pwdown)
      logger "UPS has been on battery for 60 seconds. Starting orderly shutdown"
      /sbin/upsmon -c fsd
      ;;
      pwcritical)
      logger "UPS battery level CRITICAL. Shutting down NOW!!!!"
      /sbin/upsmon -c fsd
      ;;
      powerup)
      logger "UPS on line. Shutdown aborted."
      /sbin/upscmd -u ipponmaster -p password ippon@localhost shutdown.stop
      ;;
      *)
      logger "Unrecognized command: $1"
      ;;
esac 
Теперь, спустя минуту, компьютер корректно отключится.
Осталось запустить nut: 
sudo systemctl enable nut-server.service
sudo systemctl start nut-server.service  
Рекомендую перезагрузиться. Проверим работосопособность следующей командой:
upsc ippon@localhost 
battery.charge: 100
battery.voltage: 13.60
battery.voltage.high: 13.60
battery.voltage.low: 11.7
battery.voltage.nominal: 12.0
device.type: ups
driver.name: blazer_usb
driver.parameter.offdelay: 12
driver.parameter.ondelay: 13
driver.parameter.pollinterval: 2
driver.parameter.port: /dev/usb/hiddev0
driver.version: 2.7.2
driver.version.internal: 0.11
input.current.nominal: 3.0
input.frequency: 49.6
input.frequency.nominal: 50
input.voltage: 225.4
input.voltage.fault: 225.4
input.voltage.nominal: 220
output.voltage: 225.0
ups.beeper.status: enabled
ups.delay.shutdown: 12
ups.delay.start: 780
ups.load: 22
ups.productid: 0003
ups.status: OL
ups.temperature: 25.0
ups.type: offline / line interactive
ups.vendorid: 06da 
Для наглядного мониторинга, установим графический клиент. Я использую рабочую среду KDE, потому ставлю knutclient:
 sudo apt install knutclient 
Запустим программу. Выбираем Настройка - Настроить KnutClient, далее вкладку UPS, затем Добавить. И вводим нужные данные:
 Слева есть список доступных датчиков. Добавьте нужные в правую колонку и нажмите ОК. Результат:
 
Желаю долгого аптайма! 

2 комментария:

  1. Спасибо, очень помог! С наступающим)

    ОтветитьУдалить
  2. Теперь, спустя минуту, компьютер корректно отключится.
    А у меня не отключается.
    Третий день бьюсь.
    Помогите!!

    ОтветитьУдалить