notby.NET Logo

Настройка NUT (Network UPS Tools) для управления ИБП в FreeBSD 14

Любой сервер должен иметь источник бесперебойного питания. Для управления источником бесперебойного питания (ИБП, UPS) в FreeBSD будем использовать Network UPS Tools (NUT). Необходимо будет настроить автоматическое выключение сервера в случае отключение электроснабжения и включение его обратно при появлении электричества.

Когда электроэнергия выключится, ИБП должен сообщить операционной системе что нужно будет выключить раньше чем разрядиться аккумуляторная батарея. На примере ИБП который я буду настраивать есть так называем режим “Green Mode”. Этот режим выключит ИБП через 5 минут при работе от аккумулятора, если нагрузка будет меньше 15 ватт.

В EFI (BIOS) выставляем настройки так, чтобы при появлении питания сервер включался автоматически.

1. Устанавливаем Network UPS Tools

Для работы с ИБП нам понадобится утилита Network UPS Tools (NUT), устанавливаем

cd /usr/ports/sysutils/nut && make install clean
Установка порта NUT, выбор конфигурации

Так как у меня ИБП с интерфейсом USB и другие интерфейсы не нужны, то достаточно будет выбирать только USB support.

2. Подключаем ИБП к USB

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

usbconfig

Получаем примерно такой вывод

ugen0.1: <EHCI root HUB Intel> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE
ugen1.1: <EHCI root HUB Intel> at usbus1, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE
ugen0.2: <product 0x0024 vendor 0x8087> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE
ugen1.2: <product 0x0024 vendor 0x8087> at usbus1, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE
ugen0.3: <UPS  BNT-AP FW5.A6 0A6 POWERCOM Co.,LTD> at usbus0, cfg=0 md=HOST spd=LOW (1.5Mbps) pwr=ON

В строчке нам интересен параметр 0A6, он необходим для выбора драйвера ИБП. Но драйвер можно и вручную подобрать по модели.

3. Выбираем драйвер для ИБП

Открываем файл /usr/local/etc/nut/driver.list и ищем драйвер под ИБП.

nano /usr/local/etc/nut/driver.list

Для удобства нажимаем Ctrl + W и найдем 0A6 или просто модель ИБП “Black Knight PRO”.

Я показываю на примере ИБП Powercom Black Knight PRO, у тебя будет другой ИБП. Найди нужный драйвер для него в списке.

Смотрим последний “столбец”, это и будет необходимый драйвер. В моем случае это usbhid-ups

Поиск драйвера для ИБП в файле driver.list утилиты NUT

4. Конфигурируем Network UPS Tools

Все файлы конфигурации лежат в каталог /usr/local/etc/nut

4.1. ups.conf

В файл /usr/local/etc/nut/ups.conf заносим информации о нашем ИБП и его драйвере.

nano /usr/local/etc/nut/ups.conf
# Имя источника бесперебойного питания
[powercom]
# Драйвер для ИБП из файла /usr/local/etc/nut/driver.list
driver = usbhid-ups
# Порт к которому подключен ИБП (у меня с USB работает с режимом AUTO)
port = auto
# Описание
desc = "UPS for my server"

# pollonly пришлось поставить так как ИБП разбивает сообщения.
# Эта опция есть не во всех драйверах. см. руководство драйвера.
# У меня получилось что без этой опции постоянно были сообщения:
# ИБП работает от сети, ИБП от аккумулятора (хотя сеть всегда была).
pollonly

Если что будет работать не корректно, посмотрим руководство по драйверу для ИБП (в моем случае драйвер usbhid-ups).

man usbhid-ups

4.2. upsd.conf

Файл /usr/local/etc/nut/upsd.conf отвечает за настройку основного демона. Там устанавливает время ожидание ответа драйвера, IP для подключения (по умолчанию 127.0.0.1 и порт 3493), количество подключений. Я оставлю все как есть, так как удаленно использовать не буду, а настроек по умолчания достаточно для работы. В самом файле все подробно расписано.

4.3. upsd.users

Файл /usr/local/etc/nut/upsd.users отвечает за доступ к сетевому демону.

nano /usr/local/etc/nut/upsd.users
# Имя пользователя
[powercom]
# Пароль пользователя
password = 12345
upsmon primary

Пароль используется только внутри конфигурационных файлов, upsmon запускает демон в режиме primary. То есть первичная система, так как сервер один.

4.4. upsmon.conf

Файл /usr/local/etc/nut/upsmon.conf отвечает за работы ИБП и мониторинг. Это основной файл конфигурации.

nano /usr/local/etc/nut/upsmon.conf
# Network UPS Tools: upsmon configuration

# Указывает параметры подключения, то что указывали в файле upsd.users и ups.conf
# Цифра 1 указывает значение мощности, оставляет также. Пароль которые был указан раньше и primary (режим работы).
MONITOR powercom@localhost 1 powercom 12345 primary

# Указывает количество ИБП которые поддерживают работу компьютера.
# В большинстве случаев один, у меня так же.
MINSUPPLIES 1

# Какую команду выполнять для отключения.
SHUTDOWNCMD "/sbin/poweroff"

# Выполнять команду после события NOTIFYFLAG с флагом EXEC.
# Указывает выполнения запуск событий для таймера.
NOTIFYCMD /usr/local/sbin/upssched

# Частота опроса ИБП когда он работает от электрической сети.
# Значение в секундах, слишком частые не следует делать.
POLLFREQ 5

# Частота опроса ИБП когда он работает от аккумуляторной батареи.
# Рекомендую сделать 1 секунду. Значение в секундах.
POLLFREQALERT 1

# Как долго upsmon будет ждать, прежде чем отсоединится другой upsmon.
HOSTSYNC 15

# Интервал ожидания перед объявлением устаревшего ups "мертвым".
# Если в течение опроса по параметрам POLLFREQ и POLLFREQALERT ИБП не ответил во время, он помечается как stale.
# По истечению времени DEADTIME он помечается как "dead".
# DEADTIME должен быть кратным POLLFREQ и POLLFREQALERT. Указывается в секундах.
DEADTIME 15

# Флаговый файл для принудительного отключения ИБП на основной системе.
# Файл должен существовать в скриптах выключения системы и выполняться командой "upsdrvctl shutdown".
POWERDOWNFLAG /etc/killpower

# Секции NOTIFYMSG и NOTIFYFLAG
# NOTIFYMSG – Изменяет стандартные сообщение ответа на различные события
# NOTIFYFLAG – Изменение поведение при случившихся событиях.

# OFFDURATION - вводит в действие состояние "OFF", если оно сохраняется в течение этого количества секунд
OFFDURATION 30

# Сообщения о необходимости замены аккумуляторной батареи.
# По умолчанию 12 часов, время указывать в секундах.
RBWARNTIME 43200

# Если в течение указанного времени в секундах не было связи с ИБП,
# будут попадать сообщение в уведомление системы о том что нет связи с ИБП.
NOCOMMWARNTIME 300

# Интервал перед выключением при низком заряде аккумулятора.
# Если нужно что-то сделать после отправки команды на выключение,
# но до выполнения команды SHUTDOWNCMD. Мне нечего делать не нужно.
# Если ИБП не сообщает об низком заряде ставим значение 0
FINALDELAY 0

4.5. upssched.conf

В файл /usr/local/etc/nut/upssched.conf можно настроить различные таймеры на события. Настоим так, чтобы после 30 секунд работы от аккумулятора сервер выключался. Этого можно не делать, но тогда сервер выключится только когда аккумулятор ИБП разрядиться до критического состояния и отправит сообщение о малом заряде аккумулятора, но зачем его доводить до этого. Плюс к этому сервер может не успеть выключится, а так же в момент выключения он будет потреблять больше энергии. Так же ИБП может не сообщать о состояние аккумулятора, а просто взять и выключится.

nano /usr/local/etc/nut/upssched.conf
# Скрипт с таймерами, должен быть раньше строчек AT
CMDSCRIPT /usr/local/bin/upssched-cmd
#PIPEFN это файл pipe который будет передавать таймер между процессами
PIPEFN /var/db/nut/upssched/upssched.pipe
#LOCKFN предотвращает события когда два события отправлены почти одновременно.
LOCKFN /var/db/nut/upssched/upssched.lock
# При событии ONBATT запускаем таймер которые выполнит команду "onbatter" через 60 секунд.
# Команду "onbatter" создадим позже в файле /usr/local/bin/upssched-cmd (он указаывается в переменной CMDSCRIPT)
# Если в течение 30 секунд произойдет событие ONLINE, то таймер будет отменен и команда "onbatter" не будет выполнена.
AT ONBATT * START-TIMER onbatter 30
AT ONLINE * CANCEL-TIMER onbatter

Рекомендуется создать отдельный каталог upssched с правами от которого запускается NUT. Пользователь от которого запускается сервис, определяется в переменной RUN_AS_USER в upsmon.conf файле (По умолчанию запускается от пользователя nut). Файлы которые указаны в PIPEFN и LOCKFN должны иметь права на запись и измерение.

4.6. Скрипт выключения сервера (upssched-cmd)

Файл /usr/local/bin/upssched-cmd это скрипт которые выполняется по таймеру, когда произойдет отключения электроэнергии

nano /usr/local/bin/upssched-cmd
case $1 in
	# Имя таймера, указанного в upssched.conf
	onbatter)
		# Когда произошло событие, записывеем в лог
		logger -t upssched-cmd "shutdown after 30 seconds ONBATT"
		# Выполняем команду на выключение сервера
		/usr/local/sbin/upsmon -c fsd
		;;
	# Если поступила команда который нет в скрипте, запишем в лог об этом
	*)
		logger -t upssched-cmd "Unrecognized command: $1"
		;;
esac

В результате когда пропадет электричество в сети и оно в течение 30 секунд не появится, то сервер выключится. ИБП работает 5 минут и тоже выключается, так как нагрузка слишком мала. И я не понял куда его засунуть “upsdrvctl shutdown”, который выключит принудительно ИБП. Теоретически команда должна посылатся последней перед выключением операционной системы.

5. Добавляем Network UPS Tools в автозагрузку

Редактируем файл /etc/rc.conf

nano /etc/rc.conf

И добавляем следующие строчки

# Network UPS Tools
nut_enable="YES"
nut_upsmon_enable="YES"
# Если нужен лог ups.log содержащий данные о заряде аккумулятора, напряжения сети, статусе.
# Мне этот лог не нужен, да и SSD не "любит" логи.
#nut_upslog_enable="YES"
#nut_upslog_ups="powercom@localhost"

6. Проверка работы ИБП

Перезагружаем операционную систему, проверяем работу NUT и ИБП.

Делаем следующие тесты:

  • пропало электричество, сервер выключился, ИБП выключился. Электричество появилось, ИБП включился, сервер запустился.
  • пропало электричество, появилось в течение 30 секунд. Сервер не включился, ИБП не выключился.

В том как я настроился есть проблема: если электричество выключится и включится в течении 2-5 минуты, то сервер будет выключен, а ИБП будет работать. И получается что ИБП продолжит работать, но сервер не включится. Так как в EFI (BIOS) настроено автоматическое включение при появлении питания, а питания для сервера не пропадало (ИБП продолжил работать).

Эту проблему можно решить отправкой команды на принудительное отключение ИБП или настройкой включением сервера по расписанию.

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

Сервер у меня давно живет в такой конфигурации, и у меня не было такого что бы электричество отключалось на 2-5 минут. Либо это не более 5 секунды, либо несколько часов. Так что я за 10 лет не попал так, чтобы сервер не выключился после появления питания.