FreeBSD: Выключение питания из командного файла Windows

FreeBSD: Выключение питания из командного файла WindowsВ большинстве случаев каждый стоечный источник бесперебойного питания (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 в случаях неожиданного отключения электропитания.

Понравилась статья?

Подпишитесь на RSS или почтовую рассылку;

Присоединяйтесь в Twitter, Facebook, Google+, VK;

Поделитесь ссылкой в социальной сети или блоге:

9 комментариев к “FreeBSD: Выключение питания из командного файла Windows

  1. команды остановки системы могут выполняться только суперпользователем root

    Неверно, права на оcтановку системы может иметь любой пользователь входящий в группу operator.

  2. Я использую apcupsd из портов, выключает как виндовые так и юниксовые сервера, намного удобнее.

    • Не соглашусь, что НАМНОГО удобнее. Мне кажется, оба способа имеют право на жизнь. Кроме этого, я хотел показать, как запускать нужные действия на юниксовом сервере с виндового сервера.

  3. Хочу поправить. Лучше запускать echo y | plink -l user -i sudo shutdown -p now, т.к. если на машине нету публичного ключа, то он его запросит.
    Еще поправка. Проще обойтись без sudo, и напрямую на польозвателя в шелле прописать /sbin/reboot
    Еще поправка. Опция -batch у plink отключает сообщения.

    • Лучше запускать echo y | plink -l user -i sudo shutdown -p now

      По мне лучше первый раз руками: ключик можно добавить и убедиться, что все работает.

      Еще поправка. Проще обойтись без sudo, и напрямую на польозвателя в шелле прописать /sbin/reboot

      Проще, но без sudo жить менее удобно, да и не очень безопасно 😉

      Еще поправка. Опция -batch у plink отключает сообщения.

      Чтение мануалов никто не отменял 🙂

      • Тут насчет batch ошибочка вышла. Точнее отключает ввод. Не нужно использовать его 🙂

Оставить комментарий