Хочу рассказать вам об одной интеграции «на коленке», которая тем не менее работает в моей домашней лаборатории уже несколько месяцев без каких-либо проблем.
Есть у меня один самосборный железный сервер, назовем его условно NAS, который имеет одну странную особенность. Периодически при штатной перезагрузке он останавливается на какой-то завершающей стадии подготовки к выключению и не доходит до сброса. Так и остается включенным и неуправляемым. Перезагружаю я его нечасто, но «глюк» имеет место быть. Искать причину мне, честно говоря, пока немного лень. Может быть когда-нибудь обновлю BIOS или дождусь каких-нибудь исправлений в ОС с очередным апдейтом. Но, с другой стороны, мне все-таки хотелось бы иметь контроль над своей инфраструктурой, поэтому я решил пойти альтернативным путем. Да, сразу сообщаю, что сервер не поддерживает HP iLO, Intel vPro и другие подобные фишки, которые были бы полезны, но «не шмогли».
Итак, если сервер сам не может выключаться, то нужно подключить к цепям управления питанием какое-то автономное устройство с реле и портом для управления по сети. Таких устройств существует множество с разными возможностями, вплоть до промышленных контроллеров, и за разные деньги. Но можно собрать подобное самостоятельно с минимальными затратами времени и денег на базе того, что есть. Я использовал следующие компоненты:
1. Маршрутизатор Mikrotik RB951G-2HnD со свободными портом USB, активно используемый в моей сети.
2. Плата для самоделкиных Arduino Mega 2560
3. Оптопара 4N35 для эмуляции нажатия кнопки Power сервера (ATX).
Соединяем. Схема управления готова!
Mikrotik RB951G-2HnD <--USBSerial--> Arduino Mega 2560 <--оптопара--> Power Button NAS
А теперь подробнее о том, как это заставить работать.
Поиск по документации Mikrotik (http://wiki.mikrotik.com/wiki/Supported_Hardware) выдал список поддерживаемых в RouterOS USBSerial устройств и производителей, ими оказались чипы от FTDI и Prolific. Это внушает надежду на положительный результат. В моем распоряжении были плата Arduino Mega 2560 с чипом ATmega8U2 и ограниченно доступная Arduino Mega 1280 c FTDI FT232RL. В возможности подключения последней я особо не сомневался, но больший интерес представляла первая плата. USB порт у Arduino Mega 2560 заведен в микроконтроллер ATmega8U2, в котором «крутится» USBSerial прошивка, которую можно при желании заменить на USB HID Keyboard прошивку. В общем определится ли USBSerial ATmega8U2 в Mikrotik, было не ясно, но оказалось, что RouterOS прекрасно видит подключенную Arduino с ATmega8U2 и устанавливает USBSerial порт.
![](https://habrastorage.org/r/w1560/files/5e7/ad6/144/5e7ad614423c4f9c884f1b813f270528.png)
Размышлял над несколькими вариантами программного интерфейса управления Arduino и периферией. Сначала думал зашить какой-нибудь Master-Slave протокол для удаленного управления, например, Modbus RTU. Но для него понадобилось бы пробрасывать виртуальный порт на рабочую станцию администратора (на сайте Mikrotik есть описание подключения такого виртуального порта) и писать кроме прошивки Arduino еще клиентское Modbus приложение для управления или пользоваться программами типа Modbus Poll для прямой правки регистров Modbus. Такой вариант мне не сильно нравился из-за за излишней сложности в эксплуатации. Поэтому довольно быстро я пришел к идеи текстовой командной оболочки для Arduino, по типу Bash в Linux. И оказалось, что такой командный процессор уже написан добрыми людьми. Им я и решил воспользоваться. Сайт проекта: bitlash.net
Командная оболочка bitlash оказалась вполне развитой, мою задачу она покрывала с лихвой. В ней можно создавать макросы команд и стартовый макрос, которые будут записаны в энергонезависимый EEPROM. Вот как выглядит мой набор для управления кнопкой Power сервера, вывод по команде ls:
При старте Arduino настраивается дискретный вывод 12 на запись (макрос startup). Администратор может писать в командную строку короткие команды «on12», «off12» для включения и «жесткого» выключения сервера, а также редактировать и создавать новые макросы.
В своем проекте я использовал Arduino Mega, только потому, что она была у меня в наличии, но я уверен, можно заменить ее на Arduino Due, или Nano с FTDI FT232RL, или ATmega16U2 c прошивкой usbserial.
С аппаратной частью управления все довольно просто. Можно подключить релейный модуль, который обеспечит гальваническую развязку и возможность управлять мощной нагрузкой, это наиболее универсальный вариант.
Но для себя я сделал по-другому: т.к. мне требовалось просто включать и выключать сервер (иметь возможность гарантированно это сделать), то я просто параллельно кнопке включения/выключения Power на клеммах подсоединил выход оптопары 4N35, что дало гальваническую развязку.
Схема приблизительно следующая:
![](https://habrastorage.org/r/w1560/files/3bc/851/974/3bc851974879478abf9b294022d614c8.png)
Output подключаем параллельно серверной кнопки питания. Полярность имеет значение, можно просто подобрать «методом тыка». Между выводом 12 Arduino и оптопарой установлено сопротивление порядка 500 Ом.
Заключительный штрих. Организуем консоль пробросом последовательного порта на какой-нибудь порт TCP микротика. Я не использую telnet как службу самого микротика, поэтому с чистой совестью отдаю этот порт под консоль Arduino. Разрешим доступ только с адресов локальной сети. Возможно еще пара запрещающих правил в firewall.
Настройки порта:
![](https://habrastorage.org/r/w1560/files/4f5/ae0/029/4f5ae00292a941f9b7ea27028f54a1c9.png)
На видео процесс подключения по Telnet и выполнение макро-команд:
Оптопара с резистором в термоусадке:
![](https://habrastorage.org/r/w780q1/files/8cc/6f5/fbb/8cc6f5fbbff64105bd67abe1e212fc9e.jpg)
Контроллер в контейнере:
![](https://habrastorage.org/r/w1560/files/490/ff8/0e2/490ff80e2f70411891f0664e33796508.png)
При каждом открытие соединения Arduino перезапускается, т.к. переоткрывается последовательный порт, что теоретически даже положительно влияет на стабильность работы. Управлять можно в перспективе множеством нагрузок. Можно прикрутить датчик температуры и написать команду вывода этой температуры, можно мониторить аналоговые и дискретные сигналы. Команды вводятся в обычной терминальной программе (Putty, TeraTerm) в соединение типа Telnet (или Raw). Кроме того можно, в принципе, слать команды в Arduino-терминал и из скриптов RouterOS Mikrotik.
Можно пойти еще дальше. Если взять отдельный USB<->UART преобразователь и подключить его к другому UART(2) Arduino и к Mikrotik, а во встроенный контроллер USB ATmega16U2 (8U2) залить HID прошивку клавиатуры, то можно получить подобие KVM, только без V и M :), т.е. эмулятор аппаратной клавиатуры с удаленным доступом. В общем, при желании можно сделать еще много чего.
Есть у меня один самосборный железный сервер, назовем его условно NAS, который имеет одну странную особенность. Периодически при штатной перезагрузке он останавливается на какой-то завершающей стадии подготовки к выключению и не доходит до сброса. Так и остается включенным и неуправляемым. Перезагружаю я его нечасто, но «глюк» имеет место быть. Искать причину мне, честно говоря, пока немного лень. Может быть когда-нибудь обновлю BIOS или дождусь каких-нибудь исправлений в ОС с очередным апдейтом. Но, с другой стороны, мне все-таки хотелось бы иметь контроль над своей инфраструктурой, поэтому я решил пойти альтернативным путем. Да, сразу сообщаю, что сервер не поддерживает HP iLO, Intel vPro и другие подобные фишки, которые были бы полезны, но «не шмогли».
Итак, если сервер сам не может выключаться, то нужно подключить к цепям управления питанием какое-то автономное устройство с реле и портом для управления по сети. Таких устройств существует множество с разными возможностями, вплоть до промышленных контроллеров, и за разные деньги. Но можно собрать подобное самостоятельно с минимальными затратами времени и денег на базе того, что есть. Я использовал следующие компоненты:
1. Маршрутизатор Mikrotik RB951G-2HnD со свободными портом USB, активно используемый в моей сети.
2. Плата для самоделкиных Arduino Mega 2560
3. Оптопара 4N35 для эмуляции нажатия кнопки Power сервера (ATX).
Соединяем. Схема управления готова!
Mikrotik RB951G-2HnD <--USBSerial--> Arduino Mega 2560 <--оптопара--> Power Button NAS
А теперь подробнее о том, как это заставить работать.
Что может Mikrotik
Поиск по документации Mikrotik (http://wiki.mikrotik.com/wiki/Supported_Hardware) выдал список поддерживаемых в RouterOS USBSerial устройств и производителей, ими оказались чипы от FTDI и Prolific. Это внушает надежду на положительный результат. В моем распоряжении были плата Arduino Mega 2560 с чипом ATmega8U2 и ограниченно доступная Arduino Mega 1280 c FTDI FT232RL. В возможности подключения последней я особо не сомневался, но больший интерес представляла первая плата. USB порт у Arduino Mega 2560 заведен в микроконтроллер ATmega8U2, в котором «крутится» USBSerial прошивка, которую можно при желании заменить на USB HID Keyboard прошивку. В общем определится ли USBSerial ATmega8U2 в Mikrotik, было не ясно, но оказалось, что RouterOS прекрасно видит подключенную Arduino с ATmega8U2 и устанавливает USBSerial порт.
![](https://habrastorage.org/files/5e7/ad6/144/5e7ad614423c4f9c884f1b813f270528.png)
А что может Arduino
Размышлял над несколькими вариантами программного интерфейса управления Arduino и периферией. Сначала думал зашить какой-нибудь Master-Slave протокол для удаленного управления, например, Modbus RTU. Но для него понадобилось бы пробрасывать виртуальный порт на рабочую станцию администратора (на сайте Mikrotik есть описание подключения такого виртуального порта) и писать кроме прошивки Arduino еще клиентское Modbus приложение для управления или пользоваться программами типа Modbus Poll для прямой правки регистров Modbus. Такой вариант мне не сильно нравился из-за за излишней сложности в эксплуатации. Поэтому довольно быстро я пришел к идеи текстовой командной оболочки для Arduino, по типу Bash в Linux. И оказалось, что такой командный процессор уже написан добрыми людьми. Им я и решил воспользоваться. Сайт проекта: bitlash.net
bitlash here! v2.0 (c) 2012 Bill Roy -type HELP- 942 bytes free
> print "Hello, world!", millis()
Hello, world! 11939
>
Командная оболочка bitlash оказалась вполне развитой, мою задачу она покрывала с лихвой. В ней можно создавать макросы команд и стартовый макрос, которые будут записаны в энергонезависимый EEPROM. Вот как выглядит мой набор для управления кнопкой Power сервера, вывод по команде ls:
> ls
function off12 {d12=1;delay(8000);d12=0;};
function startup {pinmode(12,1);};
function on12 {d12=1;delay(250);d12=0;};
>
При старте Arduino настраивается дискретный вывод 12 на запись (макрос startup). Администратор может писать в командную строку короткие команды «on12», «off12» для включения и «жесткого» выключения сервера, а также редактировать и создавать новые макросы.
В своем проекте я использовал Arduino Mega, только потому, что она была у меня в наличии, но я уверен, можно заменить ее на Arduino Due, или Nano с FTDI FT232RL, или ATmega16U2 c прошивкой usbserial.
Периферия Arduino. Оптопара
С аппаратной частью управления все довольно просто. Можно подключить релейный модуль, который обеспечит гальваническую развязку и возможность управлять мощной нагрузкой, это наиболее универсальный вариант.
Но для себя я сделал по-другому: т.к. мне требовалось просто включать и выключать сервер (иметь возможность гарантированно это сделать), то я просто параллельно кнопке включения/выключения Power на клеммах подсоединил выход оптопары 4N35, что дало гальваническую развязку.
Схема приблизительно следующая:
![](https://habrastorage.org/files/3bc/851/974/3bc851974879478abf9b294022d614c8.png)
Output подключаем параллельно серверной кнопки питания. Полярность имеет значение, можно просто подобрать «методом тыка». Между выводом 12 Arduino и оптопарой установлено сопротивление порядка 500 Ом.
Проброс последовательного порта на Mikrotik в Telnet
Заключительный штрих. Организуем консоль пробросом последовательного порта на какой-нибудь порт TCP микротика. Я не использую telnet как службу самого микротика, поэтому с чистой совестью отдаю этот порт под консоль Arduino. Разрешим доступ только с адресов локальной сети. Возможно еще пара запрещающих правил в firewall.
Настройки порта:
![](https://habrastorage.org/files/4f5/ae0/029/4f5ae00292a941f9b7ea27028f54a1c9.png)
На видео процесс подключения по Telnet и выполнение макро-команд:
Заключение
Оптопара с резистором в термоусадке:
![](https://habrastorage.org/files/8cc/6f5/fbb/8cc6f5fbbff64105bd67abe1e212fc9e.jpg)
Контроллер в контейнере:
![](https://habrastorage.org/files/490/ff8/0e2/490ff80e2f70411891f0664e33796508.png)
При каждом открытие соединения Arduino перезапускается, т.к. переоткрывается последовательный порт, что теоретически даже положительно влияет на стабильность работы. Управлять можно в перспективе множеством нагрузок. Можно прикрутить датчик температуры и написать команду вывода этой температуры, можно мониторить аналоговые и дискретные сигналы. Команды вводятся в обычной терминальной программе (Putty, TeraTerm) в соединение типа Telnet (или Raw). Кроме того можно, в принципе, слать команды в Arduino-терминал и из скриптов RouterOS Mikrotik.
Можно пойти еще дальше. Если взять отдельный USB<->UART преобразователь и подключить его к другому UART(2) Arduino и к Mikrotik, а во встроенный контроллер USB ATmega16U2 (8U2) залить HID прошивку клавиатуры, то можно получить подобие KVM, только без V и M :), т.е. эмулятор аппаратной клавиатуры с удаленным доступом. В общем, при желании можно сделать еще много чего.