Введение


Данное устройство служит для удалённого доступа к Linux серверу посредством последовательного порта и позволяет отказаться от локальных монитора и клавиатуры. Зачем оно нужно если есть SSH и VNC? Нужно в виду ряда проблем, связанных с управлением на этапе загрузки системы и управлением питанием:
  • Выбор загружаемой ОС, вход в recovery mode, memtest. Нажатие S во время загрузки при невозможности смонтировать одну из файловых систем, управление fsck во время загрузки.
  • Ввод пароля от зашифрованного корневого раздела во время загрузки. Приходилось в initramfs устанавливать dropbear действующий на этапе загрузки. Пароль вводился по SSH. Хочу отметить, что данный способ непросто мне давался в плане конфигурации, на популярных дистрибутивах приходилось править скрипты загрузки и использовать некоторые костыли, которые переставали работать с выходом новых релизов.
  • Удаленное выключение и включение. С первым затруднений никогда не было, а вот для включения приходилось применять технологию Wake-on-LAN (WOL), магический пакет посылался с маршрутизатора и сервер включался, правда не всегда, а только тогда когда в конфигурационных регистрах сетевой карты были «правильные» значения перед выключением, которые должна была внести туда ОС.
  • Отказы после отключения электричества и некорректной работы UPS, вкупе с автоматическим включением настроенном на материнской плате.
  • К сожалению, оборудование моего домашнего сервера не промышленное и не обладает высокой степенью надежности. То же касается и программного обеспечения, зачастую работают «сырые» модули ядра. В следствие чего не раз сервер «зависал» не отвечая ни по сети, ни на нажатие клавиш клавиатуры. Приходилось использовать аппаратный сброс зажимая кнопку питания более чем на 3 секунды.


На промышленном оборудование таких проблем нет, в пример можно привести решение HP iLO позволяющее удаленно хоть систему устанавливать, не говоря о таких вещах как управление питанием и диагностика системы. Кстати говоря у них есть продукты и для дома/малого бизнеса с этим решением. Но так сложилось, что система строилась на базе обычной miniITX материнской платы без таких возможностей.

Появилась необходимость в устройстве которое бы позволяло:
  • Быть доступно по сети
  • Взаимодействовать с загрузчиком и ОС сервера, хотя бы в текстовом режиме
  • «Железно» взаимодействовать с кнопкой питания и иметь возможность замкнуть контакты этой кнопки дольше чем на 3 секунды для принудительного выключения
  • Менять настройки BIOS (EFI) (пока не решено, доступно только для некоторых материнских плат)

Известный факт, что раньше применялись текстовые терминалы, подключаемые к последовательному порту машины. Исторически сложилась поддержка терминала в Linux и загрузчике grub. На современных материнских платах данный порт отсутствует в привычном виде внешнего разъема DB-9, но практически всегда разведен на внутренней 10-контактный разъем.

С появлением копеечного ESP8266, по сути своей моста между Wi-Fi и UART, появилась идея реализации сетевого терминала на его базе, с функционалом управления питанием.

Помимо ESP8266 есть разные варианты
Применение маршрутизатора с OpenWRT или подобной прошивкой. Соединение UART'a маршрутизатора с последовательным портом через MAX232 (или подключение USB — RS232 адаптера), а свободного GPIO, в случае наличия, с кнопкой питания. Этот вариант, кстати говоря, был реализован и некоторое время проходил опытную эксплуатацию.

Еще рассматривалось микроконтроллерное устройство работающее в связке с мобильным телефоном в тональном режиме или по СМС, замыкающее контакты кнопки вкл./выкл., эмулирующее клавиатуру. Отклонено из за дополнительных расходов и сомнительной обратной связи. Навеяно этим.


Принципиальная схема



Основной элемент — ESP8266 (ESP-03), имеет Wi-Fi для связи с внешнем миром, UART для связи с сервером, и пару GPIO, на которые были повешены светодиод индикатор состояния и реле для замыкания кнопки питания. Осталось пару свободных GPIO, которые впрочем можно применить и для подключения I2C, 1-Wire и прочих датчиков и устройств.
Применена распространенная микросхема MAX232 для преобразования UART с ESP8266 в RS-232. MAX232 питается от 5В, тогда как ESP8266 через преобразователь LM1117 5-3.3В, на всякий случай на RX линию ESP8266 применен делитель напряжения приводящие 5В с вывода MAX232 в 3.3В. Выход MAX232 разведен на два разъема, один для подключения к DB-9 второй IDC-10 для подключения прямым шлейфом прямо к контактам на материнской плате. Реле используется для замыкания контактов кнопки питания ПК и подключается параллельно с кнопкой на корпусе. Кстати, для для подключения кнопки питания с корпуса системного блока можно предусмотреть разъем на плате, у меня это реализовано через двойник для 2.54 выводов на разъёме материнской платы. Вообще решение с применением реле спорное. Хватило бы транзистора. В макете я заложил оптопару 817, она не сработала, были приняты радикальные меры и включено реле… подействовало. Пусть будет, может потом пригодится замыкать/размыкать цепи 220В, кроме того слышно щелчки — полезно для диагностики. P6 — разъем для удобства программирования через китайские адаптеры для arduino на FTDI. В режим программирования включается джампером JP1. Питается устройство через разъем P4 напрямую от дежурного напряжения блока питания или от USB порта. Разъем P1 служит для подключения внешней антенны.
Возможные пути развития
  • Управление контактами сброса CMOS
  • Подключение датчика температуры, например для контроля температуры блока питания
  • Подключение концевика вскрытия корпуса



Печатная плата


Однослойная, но вышло целых 5 перемычек.

Топорно изготовлена на дому

Старая версия без разъема P6.


Прошивка


Простейшая, состоит из одного сервера TELNET — собственно для обмена. Все, что появляется в UART выбрасывается всем клиентам TELNET, все, что приходит от клиентов выбрасывается в UART. Так же прикручены AT команды для управления кнопкой питания и настройки параметров порта и Wi-Fi. Хотя если говорить честно, это далеко не сервер RFC 854, команды не поддерживаются, TELNET называю потому, что порт 23, обмен прямым текстом, и клиенты TELNET отлично подходят для взаимодействия (опробовано на Android клиенте ConnectBot и Linux утилите telnet, у меня корректно заработало с переменной окружения export TERM=VT100, параметром -8 и последующем переходом в посимвольный режим ^]mode character).
Примечательная особенность, ESP8266 может работать и как точка доступа и как клиент беспроводной сети одновременно. Это очень важно для отказоустойчивости — позволяет подключится к терминалу в случае отказа сетевого оборудования.
Изначально была написана прошивка на Sming. Главный плюс Sming в том, что не надо разбираться в китайском SDK ESP8266, для всех нужд уже есть удобоваримая обертка, будь то WEB сервер, обновление прошивки по воздуху или работа с GPIO. Но при использование обертки TCP сервера для реализации TELNET при передаче больших объемов соединение рвалось, а ESP8266 висла. Были попытки оперировать напрямую АПИшкой lwip…
Но на этом этапе я наткнулся на проект ESP8266-transparent-bridge. Было решено просто напросто его форкнуть для реализации команд управления кнопкой питания, все остальное уже было сделано его автором. Бала добавлена команда AT
+++AT PWBTN <duration: SHORT | LONG | HARDRESET> # замыкание кнопки питания на пол секунды | четыре секунды | четыре, пауза в одну и снова на пол секунды


В прошивке есть изъян. Если на терминал вывести единовременно большой объем информации то часть данных может потеряться. Все же ESP8266 это не Moxa NPort и возможности ограничены. Например, если сделать dmesg то мы увидим только часть данных, так что приходится чаще использовать grep more и less и избегать длинных выводов на экран. Вообще говоря стоит в прошивке попробовать увеличить буфер передачи, сейчас он всего 1024 байта, пока руки не доходили, сделать его 32768 и может быть станет комфортно работать с утилитами вроде htop.

Конфигурация Linux машины


В /etc/default/grub должно быть что то вроде:
GRUB_CMDLINE_LINUX="console=ttyS0,115200n8"
GRUB_TERMINAL=serial
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"

Для вывода меню загрузчика и сообщений загрузки в последовательный порт. В данном случае первый с битрейтом 115200. После редактирования следует выполнить команду update-grub. В принципе этим можно ограничиться, но на всякий случай еще можно открыть терминал на последовательном порту, для этого создать /etc/init/ttyS0.conf следующего содержания:
# ttyS0 - getty
#
# This service maintains a getty on ttyS0 from the point the system is
# started until it is shut down again.

start on stopped rc or RUNLEVEL=[2345]
stop on runlevel [!2345]
#
respawn
exec /sbin/getty -L 115200 ttyS0 vt102

Подключение к серверу
Как уже было сказано питание берется напрямую от дежурного напряжения блока питания или от USB порта, выводы реле подключаются параллельно кнопки питания, Контактная площадка RS-232 соединяется прямым шлейфом с разъемом типа IDC-10. Есть нюанс размещения устройства внутри корпуса сервера, требуется вывести за корпус Wi-Fi антенну подключаемую к u.fl разъему устройства. Это конечно можно не делать если корпус относительно радиопрозрачный, например изготовлен из дерева.



Подсчет стоимости


$3 за ESP8266, $1 за 10 штук MAX232, остальное обычно есть в хозяйстве.

Видео демонстрация





Исходники железа и софта тут.

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


  1. syslinux
    01.03.2016 11:35
    +1

    Перезалейте пожалуйста видео. Пишет Автор ограничил доступ к видео.


    1. sixhundredsixtyfive
      01.03.2016 11:35

      Спасибо, забыл открыть доступ перед публикацией.


      1. syslinux
        01.03.2016 11:41

        Вам спасибо за отличную статью. Давно искал что либо подобное.


  1. Dima_Sharihin
    01.03.2016 12:30

    Что мешало взять MAX3232, которая с самого начала трехвольтовая?


    1. sixhundredsixtyfive
      01.03.2016 12:53
      +1

      Согласен, это было бы правильно, просто в свое время закупил популярных MAX232. Будет время нарисую еще один вариант с MAX3232.


  1. Rumlin
    01.03.2016 12:40

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


    1. sixhundredsixtyfive
      01.03.2016 12:51

      Да, реле не самое красивое решение. Я пробовал оптопару 817, и само собой полярность учитывал, но не заработало. Но у реле есть и свои плюсы, им можно замыкать и цепи 220В.


  1. Alexeyslav
    01.03.2016 14:40

    Надо два реле.
    Есть неттоп, подозреваю что при перегреве сначала отваливается WiFi а при дальнейшем нагреве ещё и контроллер винчестера, и если WiFi восстанавливает работу после перехода в спящий режим то на контроллер винчестера ничто не влияет, даже аппаратная перезагрузка, только полное отключение устройства от сети. Причем, в выключенном состоянии блок питания обеспечивает напряжением где-то секунд 20, т.е. или ждать заведомо дольше или нужно иметь еще и датчик наличия дежурного напряжения(USB-порт?) и автономное питание минут на 10, либо независимое от сети.


  1. Deamk
    01.03.2016 14:45

    Интересное решение. Лучше бы твердотельное реле, обычные реле имеют свойство «залипать».
    А если терминал вас быть суперпользователем — достаточно написать sudo !!, он повторит предыдущую команду с повышенными правами.


    1. sixhundredsixtyfive
      01.03.2016 14:58

      Дело привычки, я привык нажимать стрелку вверх, затем Home и писать sudo, те же 8 нажатий на клавиши, но лишний раз можно взглянуть на то что запускаешь с повышенными привилегиями.
      Залипать не должно поскольку нет существенных нагрузок. Хороший вариант ставить подходящую оптопару или транзисторный ключ.


  1. migelle74
    01.03.2016 15:33
    +1

    IMHO не хватает еще внешнего вотчдога. Типа такого http://samopal.pro/wdt-ne555/
    Уж больно нестабильна эта esp8266 Будет обидно, когда понадобится доступ издалека, а esp повиснет в этот момент.


    1. sixhundredsixtyfive
      01.03.2016 15:41

      Возьму на заметку. Вообще эксплуатирую устройство с ноября 15 года, обращаюсь к нему пару раз в неделю, на удивление, пока отказов не было.


  1. dacentum
    01.03.2016 16:38

    Имхо городить такое с wifi излишне:
    www.puntoflotante.net/BLUETOOTH-HC-06-WITH-SERIAL-PORT-EASY-GUIDE.pdf


    1. sixhundredsixtyfive
      01.03.2016 17:17

      Обычно роутеры не поддерживают Bluetooth и приходится ставить его в USB, а потом возится с настройками hcid… Суть ведь в удаленном доступе, а не локальной работе. Кстати говоря, раньше у меня был похожий самодельный мост на HC-04, и по собственному опыту говорю, Wi-Fi совсем не излишне. К тому же под ESP8266 проще реализовать управление GPIO, у Bluetooth модулей этого типа тоже есть открытое SDK но таким комьюнити как ESP они не похвастаются. И еще они дороже.


      1. dacentum
        01.03.2016 17:28

        Ну у Вас видимо особые требования к такому взаимодействию.
        Если говорить об удаленном доступе, wifi как таковой излишен, ведь к Вашему серверу подходит проводная сеть? Что мешает подвести ее к ethernet-to-serial мосту?
        я больше о том, что Bluetooth модуль уже имеет нужный интерфейс SERIAL, и подключиться к такому модулю со смартфона проще напрямую, и без роутера.


        1. sixhundredsixtyfive
          01.03.2016 17:39

          Да, о проводном варианте с Ethernet на enc28j60 я тоже думал, и даже чипы были в наличии, но решил использовать ESP8266, один из доводов — возможность работать в случае отказа сети, напрямую подключившись к точке доступа телефоном.


    1. nymitr
      01.03.2016 17:17

      А как к нему с телефона подключаться?


      1. sixhundredsixtyfive
        01.03.2016 17:19

        Очень просто, в маркете достаточно Bluetooth терминалов, первым попался Bluetooth Terminal


  1. mm7
    01.03.2016 17:20

    Вопрос — а через УСБ нельзя?

    Понятно, что это решение дешевле KVM over IP, но последнее удобнее, и позволяет даже заходить в сетап/БИОС.


    1. sixhundredsixtyfive
      01.03.2016 17:20

      А можно подробнее о чем речь?


    1. sixhundredsixtyfive
      01.03.2016 17:33

      Похоже понял о чем речь, KVM over IP можно, но действительно не дешево, и хард ресет (замыкание кнопки питания) не уверен что будет поддерживаться. Вообще говоря для дома хорошим решением будет приобретение HP Proliant MicroServer G8, там есть iLO.


      1. Deamk
        01.03.2016 19:26

        А ещё можно vPro. Процессор и материнская плата сопоставимы по цене с комплектующими обычного ПК.


      1. mm7
        01.03.2016 19:37

        Ни хард ресет ни кнопка питания KVM over IP обычно не поддерживается.
        Для этого есть отдельные устройства. Тоже через ИП.
        Если в Вашем устройстве поддерживается хард ресет, то это круто.

        Вы не ответили, возможно ли сделать Ваше устройство через USB. Чтоб воткнуть в USB, а не впаивать вашу плату в мать как КОМ порт?
        И можно ли Ethernet сделать вместо WiFi? Для секурити.
        Мне для датацентра надо, не для дома.


        1. JerleShannara
          01.03.2016 20:17

          Проблема в том, как в это usb устройство отдать консоль, причём начиная с grub-а. Сам grub как помню не умеет работать с USB2COM переходниками, да и ядро поднимет этот компорт только после прогрузки дров.


          1. POS_troi
            01.03.2016 20:35

            Мелкий намёк http://git.savannah.gnu.org/cgit/grub.git/tree/grub-core/bus/usb/serial
            Но в жизни не пробовал пока.


            1. JerleShannara
              01.03.2016 21:10

              Вкусно, лишь бы только grub не влез в соревнования nero с acdsee по построению своей операционной системы


              1. POS_troi
                01.03.2016 23:09

                Это логичное решение с их стороны.
                COM32 порты уже доволи редкое явление и логично было прийти к тому что нужно научиться отдавать консоль в что-то посовременнее, нынче массовое применение нашли FTDI и Profilic девайсы так что вот и заморочились.

                Вообще в грубе есть веши и странные, например можно «морзянку» в бипер загонять http://git.savannah.gnu.org/cgit/grub.git/tree/grub-core/term/morse.c

                Давно видел это дело но честно даже никогда не видел даже гайдов на тему применения, но если оно есть значит кому-то нужно :)

                >построению своей операционной системы
                Любой загрузчик собсно ей и является.


                1. JerleShannara
                  02.03.2016 18:20

                  Загрузчик должен найти ОС, залить её минимум в память и отдать ей управление. Правильно, если он позволяет выбрать что и как грузить, даёт возможность задать руками какие-то параметры. Круто, если он позволяет это сделать удобным способом. Но вот если в него встроить мп3 плеер, то это уже будет перебор. Хотя spkmodem из grub мне в своё время очень помог.


                  1. POS_troi
                    02.03.2016 18:31
                    +1

                    Mp3 было-бы круто, а то сидишь в серверной, ждёшь винтов на замену и даже музыку послушать неначем :)


                    1. JerleShannara
                      02.03.2016 18:37
                      +2

                      Наверное по такому-же принципу из средства для записи дисков получилась почти операционная система =)


        1. POS_troi
          01.03.2016 20:42

          Я делал из «ripe atlas probe v1», там внутрях Lantronix XPortPRO сидит.


        1. sixhundredsixtyfive
          01.03.2016 22:58

          Хочу отметить, что в материнскую плату ничего не впаевается, а соединяется шлейфом с COM портом, обычно он есть на материнской плате, и соединяется с пинами внутреннего USB (только питание) и пинами power стандартными проводками, которыми подключаются к материнской плате кнопки и индикаторы корпусов. Соединение с power — как раз для хард ресета.
          Чтобы включалось только в USB — думаю нет.
          По Ethernet — без проблем, но это совсем другой девайс уже.


  1. semen-pro
    02.03.2016 19:28

    Ожидал увидеть реализацию железного терминала на базе ESP8266, который подключается по wifi к локальной сети и поднимает управление по SSH…