В большинстве случаев каждый стоечный источник бесперебойного питания (UPS) обслуживает несколько серверов, при этом он имеет всего один управляющий канал, который позволяет контролировать наличие напряжения в сети и емкость аккумуляторных батарей с помощью специального программного обеспечения. Как обеспечить корректное завершения работы всех серверов, если часть из них работает под управлением FreeBSD, а программное обеспечение UPS’а предназначено для Windows?
Постановка задачи
Имеется несколько серверов с Windows NT / 2003 и FreeBSD, а также два UPS’а APC Smart-UPS, программное обеспечение которых «умеет» запускать командный файл в случае, если электропитание отсутствует, и аккумуляторы разрядились, например, до 15% от начальной емкости. Программное обеспечение UPS’ов установлено на серверы с Windows NT. В связи с неравномерным распределением нагрузки по UPS’ам и различным износом аккумуляторов процедура остановки серверов дублируется. Т.о., при разрядке аккумулятора любого из UPS’ов до критического значения начинается процесс остановки всех серверов. Это достаточно надежное решение, которое много раз себя оправдало. Единственным нетривиальным моментом, о котором я хочу рассказать, является выключение сервера с FreeBSD командой, выполненной на сервере с Windows.
Исходные данные
Для того, чтобы все, что описано ниже, работало корректно, на Вашем сервере должна использоваться операционная система FreeBSD версии 4.xx или выше, а также на нем должна быть настроена служба SSH с аутентификацией по публичному ключу. Подойдет и аутентификация по паролю, но она имеет массу многократно описанных недостатков. Естественно, материнская плата сервера должна поддерживать функции автоматического управления питанием (поддержка таких функций имеется у подавляющего большинства современных материнских плат).
Добавление поддержки APM в FreeBSD старых версий
Добавление поддержки APM (Advanced Power Management) необходимо делать только при наличии серверов с FreeBSD версии ниже 5.0, т.к. начиная с версии 5.0, операционная система содержит автоматически загружаемый модуль ядра, обеспечивающий поддержку ACPI (Advanced Configuration and Power Interface) — более универсального механизма управления ресурсами и электропитанием. Для добавления поддержки APM следует:
1. Активировать в BIOS опцию ACPI Support Enabled
;
2. Добавить в файл конфигурации ядра строку device apm0
и пересобрать ядро;
3. Добавить в файл /etc/rc.conf
строку apm_enable="YES"
;
4. Перезагрузить систему.
После выполнения перечисленных действий команда shutdown -p now
должна приводить к завершению работы системы с выключением питания.
Установка и настройка sudo
По умолчанию команды остановки системы могут выполняться только суперпользователем root
, однако, с точки зрения безопасности ни в коем случае нельзя разрешать ему удаленный доступ к серверу. Для обеспечения возможности остановки системы с удаленного компьютера обычным пользователем подойдет утилита sudo. Лучше всего установить ее из портов:
cd /usr/ports/security/sudo make install clean
Конфигурация sudo хранится в файле /usr/local/etc/sudoers
. Для редактирования данного файла можно использовать команду visudo
, которая загрузит его в редактор по умолчанию, или просто открыть данный файл в текстовом редакторе. В рассматриваемом случае файл конфигурации sudo должен содержать следующие строки:
Host_Alias HALTHOSTS = 127.0.0.1,192.168.0.0/24 User_Alias HALTUSERS = user Cmnd_Alias HALTCMNDS = /sbin/shutdown -p now HALTUSERS HALTHOSTS = NOPASSWD: HALTCMNDS
Такая конфигурация позволяет пользователю user
выполнять команду sudo shutdown -p now
как с локального хоста, так и с хостов подсети 192.168.0.0/24
без ввода пароля. Естественно, Вам придется подкорректировать IP-адреса и имя пользователя.
Удаленное завершение работы
Для подключения к серверу и выполнения необходимой команды я рекомендую использовать утилиту plink
из бесплатного пакета PuTTY. Выше я уже сказал, что подключение к серверу с FreeBSD будет выполняться по протоколу SSH с аутентификацией пользователя по публичному ключу. В таком случае команда завершения работы примет следующий вид (папка, содержащая утилиту plink, должна присутствовать в переменной окружения PATH
):
plink -l user -i <имя файла, который содержит закрытый ключ> <IP-адрес сервера с FreeBSD> sudo shutdown -p now
В первый раз следует выполнить данную команду в интерактивном режиме, чтобы подтвердить подлинность удаленного сервера с FreeBSD вручную.
Заключение
Выполнив действия, описанные в данной статье, Вы больше никогда не будете переживать о целостности файловых систем поддерживаемых Вами серверов с операционной системой FreeBSD в случаях неожиданного отключения электропитания.
Интересная статья! А не могли ли поподробнее про настройку публичного ключа написать?
Погуглите. Информации море, все досконально разжевано. Мне нечего добавить 😉
Неверно, права на оcтановку системы может иметь любой пользователь входящий в группу
operator
.Я написал «по умолчанию», и это абсолютно верно 😉
Я использую apcupsd из портов, выключает как виндовые так и юниксовые сервера, намного удобнее.
Не соглашусь, что НАМНОГО удобнее. Мне кажется, оба способа имеют право на жизнь. Кроме этого, я хотел показать, как запускать нужные действия на юниксовом сервере с виндового сервера.
Хочу поправить. Лучше запускать
echo y | plink -l user -i sudo shutdown -p now
, т.к. если на машине нету публичного ключа, то он его запросит.Еще поправка. Проще обойтись без sudo, и напрямую на польозвателя в шелле прописать
/sbin/reboot
Еще поправка. Опция
-batch у plink
отключает сообщения.По мне лучше первый раз руками: ключик можно добавить и убедиться, что все работает.
Проще, но без sudo жить менее удобно, да и не очень безопасно 😉
Чтение мануалов никто не отменял 🙂
Тут насчет
batch
ошибочка вышла. Точнее отключает ввод. Не нужно использовать его 🙂