После установки Proxmox и запуска первых виртуальных машин у меня возникла необходимость в настройке поведения сервера при отключении питания.
После чтения интернетов была найдена интересная реализация, которую я успешно применил на своем сервере. ИБП в моем распоряжении, для справки, вот такой APC Smart-UPS C 1000, подключенный usb кабелем:
Суть реализации в настройке nut сервера и клиента прямо на машине с proxmox для контроля ИБП и поведения при изменении статуса батарей. Дополнительно же установим lxc контейнер с nut клиентом и веб-сервером Apache для мониторинга состояния ИБП без использования консоли.
Настройка NUT сервера и клиента на сервере с Proxmox
Заходим в консоль машины, на которой установлен Proxmox (в моем случае версии 8.2.4) удобным способом и смотрим список usb устройств командой:
lsusb
Нам нужно найти наш ИБП и узнать его bus и device:
Теперь посмотрим детальную информацию, указав bus и device, в моем случае:
lsusb -v -s 1:3
Как видно, система распознает ИБП и можно приступать к установке nut:
apt install nut -y
Проверяем, видит ли nut наш ИБП:
nut-scanner -U
Перед правкой конфигов, на всякий случай, лучше сделать резервные копии всех этих файлов:
cp /etc/nut/nut.conf /etc/nut/nut.example.conf
cp /etc/nut/ups.conf /etc/nut/ups.example.conf
cp /etc/nut/upsd.conf /etc/nut/upsd.example.conf
cp /etc/nut/upsd.users /etc/nut/upsd.example.users
cp /etc/nut/upsmon.conf /etc/nut/upsmon.example.conf
cp /etc/nut/upssched.conf /etc/nut/upssched.example.conf
cp /etc/nut/upssched-cmd /etc/nut/upssched-cmd.example
Теперь перейдем к правке. Первый на очереди nut.conf:
nano /etc/nut/nut.conf
Удаляем все и добавляем:
MODE=netserver
Далее редактируем ups.conf:
nano /etc/nut/ups.conf
Удаляем все и добавляем:
pollinterval = 15
maxretry = 3
offdelay = 120
ondelay = 240
[apc]
# APC Smart-UPS C 1000
driver = usbhid-ups
port = auto
desc = "APC Smart-UPS C 1000"
vendorid = 051D
productid = 0003
serial = xxxxxxxxxxxx
Обратите внимание, что все данные по своему ИБП я брал из вывода команд, указанных выше. Сохраняем файл и можем протестировать драйвер:
upsdrvctl start
Если что-то неверно распознается, проверьте список совместимого оборудования чтобы узнать, какой драйвер использовать.
Отредактируем upsd.conf:
nano /etc/nut/upsd.conf
Дадим указание серверу отвечать на запросы из всех сетей. Удаляем все и добавляем:
LISTEN 0.0.0.0 3493
LISTEN :: 3493
Далее редактируем upsd.users:
nano /etc/nut/upsd.users
Настроим администратора и пользователя. Удаляем все и добавляем:
[upsadmin]
# Administrative user
password = ********
# Allow changing values of certain variables in the UPS.
actions = SET
# Allow setting the "Forced Shutdown" flag in the UPS.
actions = FSD
# Allow all instant commands
instcmds = ALL
upsmon master
[upsuser]
# Normal user
password = ********
upsmon slave
Замените звездочки на ваши пароли.
Редактируем upsmon.conf:
nano /etc/nut/upsmon.conf
Удаляем все и добавляем:
RUN_AS_USER root
MONITOR apc@localhost 1 upsadmin ******* master
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h"
NOTIFYCMD /usr/sbin/upssched
POLLFREQ 4
POLLFREQALERT 2
HOSTSYNC 15
DEADTIME 24
MAXAGE 24
POWERDOWNFLAG /etc/killpower
NOTIFYMSG ONLINE "UPS %s on line power"
NOTIFYMSG ONBATT "UPS %s on battery"
NOTIFYMSG LOWBATT "UPS %s battary 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
NOTIFYFLAG NOCOMM SYSLOG+WALL+EXEC
NOTIFYFLAG NOPARENT SYSLOG+WALL
RBWARNTIME 43200
NOCOMMWARNTIME 600
FINALDELAY 5
Не забудьте заменить звездочки на ваш пароль администратора во второй строчке.
Редактируем upssched.conf:
nano /etc/nut/upssched.conf
Удаляем все и добавляем:
CMDSCRIPT /etc/nut/upssched-cmd
PIPEFN /etc/nut/upssched.pipe
LOCKFN /etc/nut/upssched.lock
AT ONBATT * START-TIMER onbatt 30
AT ONLINE * CANCEL-TIMER onbatt online
AT LOWBATT * EXECUTE onbatt
AT COMMBAD * START-TIMER commbad 30
AT COMMOK * CANCEL-TIMER commbad commok
AT NOCOMM * EXECUTE commbad
AT SHUTDOWN * EXECUTE powerdown
AT SHUTDOWN * EXECUTE powerdown
Нужно убедиться, что PIPEFN и LOCKFN указывают на существующую директорию. У меня ее не было, поэтому я ее создал.
mkdir /etc/nut/upssched/
Редактируем upssched-cmd:
nano /etc/nut/upssched-cmd
Удаляем все и добавляем:
#!/bin/sh
case $1 in
onbatt)
logger -t upssched-cmd "UPS running on battery"
;;
shutdowncritical)
logger -t upssched-cmd "UPS on battery critical, forced shutdown"
/usr/sbin/upsmon -c fsd
;;
upsgone)
logger -t upssched-cmd "UPS has been gone too long, can't reach"
;;
*)
logger -t upssched-cmd "Unrecognized command: $1"
;;
esac
Сохраняем, затем предоставляем права:
chmod +x /etc/nut/upssched-cmd
Осталось перезагрузить систему, или, если нет такой возможности, перезагрузить сервисы командами:
service nut-server restart
service nut-client restart
systemctl restart nut-monitor
upsdrvctl stop
upsdrvctl start
После перезагрузки выполняем команду:
upsc apc@localhost
и смотрим, показана ли информация о нашем ИБП:
Я решил установить параметр минимального времени работы на 10 минут и минимальный заряд на 50%:
upsrw -s battery.runtime.low=600 apc@localhost
upsrw -s battery.charge.low=50 apc@localhost
После ввода каждой команды будет запрошен логин и пароль, используйте логин upsadmin и пароль, который вы указывали при редактировании /etc/nut/upsmon.conf и /etc/nut/upsd.users. После ввода команд перезагружаем сервер.
Создание и настройка LXC контейнера для мониторинга ИБП
В принципе, на стороне сервера уже все настроено и сервер будет отключаться в соответствии с настройками nut, но для удобства можно настроить веб страничку с данными об ИБП. Я это сделал в отдельном lxc контейнере.
Характеристики: 1 ядро, 128мб ОЗУ, 2гб диск, ubuntu 24.04, автозапуск контейнера при загрузке. Для целей вебстранички этого достаточно, можно даже было настроить меньший объем дискового пространства, так как занято в итоге меньше половины.
Первым делом, после запуска контейнера, заходим в его консоль и выполняем обновление:
apt update && apt upgrade -y
Затем ставим openssh-server. В моем случае он уже был установлен. Если нет, то
apt install openssh-server -y
Далее изменим конфиг
nano /etc/ssh/sshd_config
Нужно раскомментировать или добавить следующие строчки:
PasswordAuthentication yes
PermitRootLogin yes
Сохраняем и перезапускаем openssh сервер:
systemctl restart ssh
Установим веб-сервер Apache, nut-cgi и nut клиент:
apt install apache2 nut-cgi nut-client -y
Сразу сделаем резервные копии всех редактируемых конфигов:
cp /etc/nut/nut.conf /etc/nut/nut.example.conf
cp /etc/nut/hosts.conf /etc/nut/hosts.example.conf
cp /etc/nut/upsset.conf /etc/nut/upsset.example.conf
cp /etc/nut/upsmon.conf /etc/nut/upsmon.example.conf
Редактируем /etc/nut/nut.conf:
nano /etc/nut/nut.conf
Удаляем все и добавляем:
MODE=netclient
Далее редактируем /etc/nut/hosts.conf:
nano /etc/nut/hosts.conf
Удаляем все и добавляем:
MONITOR apc@xxx.xxx.xxx.xxx "APC Smart-UPS C 1000"
где xxx.xxx.xxx.xxx это ip адрес вашего сервера Proxmox
Редактируем/etc/nut/upsset.conf:
nano /etc/nut/upsset.conf
Удаляем все и добавляем:
I_HAVE_SECURED_MY_CGI_DIRECTORY
Редактируем /etc/nut/upsmon.conf:
nano /etc/nut/upsmon.conf
Удаляем все и добавляем:
RUN_AS_USER root
MONITOR apc@xxx.xxx.xxx.xxx 1 upsuser ******* slave
где xxx.xxx.xxx.xxx это ip адрес вашего сервера Proxmox, а ******** это пароль юзера upsuser, настроенного на сервере с proxmox.
Далее вводим команду:
sudo a2enmod cgi
И перезапускаем веб сервер:
sudo systemctl restart apache2
Теперь можно перейти по адресу http://xxx.xxx.xxx.xxx/cgi-bin/nut/upsstats.cgi где xxx.xxx.xxx.xxx это ip вашего lxc контейнера и мониторить статус ИБП. В моем случае это выглядит так:
Для спокойствия я закрыл LXC контейнеру доступ в интернет через роутер.
upsrw -s battery.runtime.low=600 apc@localhost
upsrw -s battery.charge.low=50 apc@localhost
вот эти два параметра не меняют время , не подскажете в чём дело может быть?