Хочу рассказать вам об одной интеграции «на коленке», которая тем не менее работает в моей домашней лаборатории уже несколько месяцев без каких-либо проблем.

Есть у меня один самосборный железный сервер, назовем его условно 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 порт.



А что может 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, что дало гальваническую развязку.
Схема приблизительно следующая:


Output подключаем параллельно серверной кнопки питания. Полярность имеет значение, можно просто подобрать «методом тыка». Между выводом 12 Arduino и оптопарой установлено сопротивление порядка 500 Ом.

Проброс последовательного порта на Mikrotik в Telnet


Заключительный штрих. Организуем консоль пробросом последовательного порта на какой-нибудь порт TCP микротика. Я не использую telnet как службу самого микротика, поэтому с чистой совестью отдаю этот порт под консоль Arduino. Разрешим доступ только с адресов локальной сети. Возможно еще пара запрещающих правил в firewall.
Настройки порта:


На видео процесс подключения по Telnet и выполнение макро-команд:


Заключение


Оптопара с резистором в термоусадке:


Контроллер в контейнере:


При каждом открытие соединения Arduino перезапускается, т.к. переоткрывается последовательный порт, что теоретически даже положительно влияет на стабильность работы. Управлять можно в перспективе множеством нагрузок. Можно прикрутить датчик температуры и написать команду вывода этой температуры, можно мониторить аналоговые и дискретные сигналы. Команды вводятся в обычной терминальной программе (Putty, TeraTerm) в соединение типа Telnet (или Raw). Кроме того можно, в принципе, слать команды в Arduino-терминал и из скриптов RouterOS Mikrotik.
Можно пойти еще дальше. Если взять отдельный USB<->UART преобразователь и подключить его к другому UART(2) Arduino и к Mikrotik, а во встроенный контроллер USB ATmega16U2 (8U2) залить HID прошивку клавиатуры, то можно получить подобие KVM, только без V и M :), т.е. эмулятор аппаратной клавиатуры с удаленным доступом. В общем, при желании можно сделать еще много чего.
Поделиться с друзьями
-->

Комментарии (16)


  1. ilyaplot
    15.06.2016 14:13

    А если заменить Mikrotik на Ethernet Shield, то и вовсе можно получить универсальное решение, которое даже не требует роутера (при прямом подключении железки к интернету). Кстати, есть коробочные решения, позволяющие сделать tcp-to-serial, но цена их сопоставима со стоимостью роутера.


    1. ilyaplot
      15.06.2016 14:17

      Прошу прощения за дублирование информации из поста, вылетело из головы то, что только что прочитал.


  1. serafims
    15.06.2016 14:32

    Вообще, если запилить на всяких зукселях с USB портом возможность проброса RS-232 в Telnet, было бы исключительно круто для домашних железяк…


    1. ilyaplot
      15.06.2016 17:22

      Возможно, есть решение. https://www.dd-wrt.com/wiki/index.php/USB


    1. Demosfen
      15.06.2016 17:33

      ser2net чем не устраивает?


      1. serafims
        17.06.2016 11:57

        Похоже, это лишь пакет для Open-wrt, что в итоге выливается в пляски с прошивкой и т.п. Но спасибо за наводку!


        1. Demosfen
          17.06.2016 12:23

          Да вроде и под кинетики народ собирает:
          http://forum.zyxmon.org/topic105-kak-ustanovit-paket-ser2net.html
          Если даже готового нет, то он есть в сорцах — всегда можно собрать под свою платформу.


  1. Demosfen
    15.06.2016 17:31

    На мой взгляд, вы лишних сущностей наплодили. Более простые варианты решения задачи:
    1. Берем FT232 и получаем кучку GPIO, либо I2C, SPI и т.п. Это не только конвертер USB<>Serial. Можем или просто GPIO дергать, или на I2C кучу периферии навешать. Не факт, что фокус пройдет с поддельными чипами.
    2. Лет 18 назад, когда у нас сетка была построена на маршрутизаторах из древних компов, мы использовали простенькую схемку для ребута подвисших роутеров. Работало оно так — в системе висел скрипт, который раз в 30 секунд дергал PC-Speaker, если 5 минут не было сигнала, то схемка замыкала на пару секунд Reset или Power на мамке. Схемка была на нескольких транзисторах, но сейчас в моде микроконтроллеры — можно тоже самое на тиньке собрать :) Получаем такой watchdog-на-коленке. Хотя в нынешних условиях оно может и не надо — в современных процах есть или встроенный watchdog или на мамке имеется. Надо просто его включить и демона запустить…
    Но по сравнению с Ардуиной фана конечно меньше, особенно во втором случае. :)


    1. Chupakabra303
      15.06.2016 19:39

      Watchdog, конечно, самое правильное решение. Как вариант, воткнуть ту же ардуину в сервер и слать heartbeat текстом из сервера в com порт. Нет сигнала — ресет.


      1. Demosfen
        15.06.2016 20:33

        Ну я бы для начала все-таки проверил наличие аппаратного WD в сервере… :)


  1. maiketa
    15.06.2016 18:11
    +1

    Послушайте, я сейчас отхвачу, но команда на Mikrotik
    /system routerboard usb power-reset duration=10s;
    сбрасывает питание на порту USB на 10 секунд, вешайте реле сразу на порт.
    Если хочется автоматизации — там же на роутере запилите скрипт попингуйку — нет пинга за 10 минут — ресет USB.
    Желаю вам добра и оптимизации )


    1. Chupakabra303
      15.06.2016 19:22

      В этом случае реле реализует инверсную логику. Если снять питание с роутера, то сервер такого фокуса не перенесет, вот если второе реле поставить на питание роутера, и по схеме «И» с первым включить, то да.
      Ещё первое реле в нормальном режиме всегда будет под напряжением, что тоже не хорошо.
      Сначала я хотел просто на user led повесить оптопару, которым можно из скрипта управлять, даже был готов пожертвовать кратковременным зажиганием диода при рестарте роутера, но нехороший микротик там smd напаял, и я просто не смог подпаяться нормально.


      1. maiketa
        15.06.2016 20:29

        Питание роутера не при чем.
        Он умеет «выключать» свой USB порт на N-ое количество секунд. Программно, командой, сохраняя работоспособность.
        Я хотел сказать, что можно инверсное реле повешать сигнальными ножками на USB (через резистор, диод), рабочими в параллель кнопки reset на сервере. Нормальное положение реле — при наличии напряжения на сигнальных — разомкнуты рабочие. Пропало питание USB — замкнулись рабочие, «нажалась» кнопка reset.
        Вторым реле с логикой «И» можно зарезервировать ситуацию выхода из строя самого маршрутизатора… а то он может нажать на reset и не отпустить )


        1. Chupakabra303
          15.06.2016 20:41

          Эх, я неточно выразился. Имел ввиду, что катушка реле 2 просто запитывается от роутера. Есть питание на роутере — реле 2 разрешает работу реле 1, управляемого по USB. Только при перезагрузке роутера есть вероятность, что питание с USB тоже снимается на время, чтобы инициализировать usb-оборудование, поэтом ресет сервера опять случится.


  1. Bushrut
    15.06.2016 20:45

    WAGA отличная вещь!


  1. Satboy
    17.06.2016 14:31

    Еще более простое управление нагрузками — Mikrotik 750UP.

    К нужному порту по POE подключаем SSR реле нужной мощности и включаем нужный порт в режим POE Force_ON.
    До 5 каналов можно подключить при желании, хотя как показала практика — достаточно 1-2.