1 марта 2016 в 11:06

Терминал для домашнего Linux сервера на базе ESP8266


Введение


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

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





Исходники железа и софта тут.
@sixhundredsixtyfive
карма
18,5
рейтинг 0,0
Пользователь
Похожие публикации
Самое читаемое

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

  • +1
    Перезалейте пожалуйста видео. Пишет Автор ограничил доступ к видео.
    • 0
      Спасибо, забыл открыть доступ перед публикацией.
      • 0
        Вам спасибо за отличную статью. Давно искал что либо подобное.
  • 0
    Что мешало взять MAX3232, которая с самого начала трехвольтовая?

    • +1
      Согласен, это было бы правильно, просто в свое время закупил популярных MAX232. Будет время нарисую еще один вариант с MAX3232.
  • 0
    Реле можно было выкинуть, заменив на оптопару. При подключении к матплате просто учитывать полярность.
    • 0
      Да, реле не самое красивое решение. Я пробовал оптопару 817, и само собой полярность учитывал, но не заработало. Но у реле есть и свои плюсы, им можно замыкать и цепи 220В.
      • 0
        Что-то мне подсказывает, что нужно было после оптопары дополнительный транзистор в ключевом режиме ставить.
  • 0
    Надо два реле.
    Есть неттоп, подозреваю что при перегреве сначала отваливается WiFi а при дальнейшем нагреве ещё и контроллер винчестера, и если WiFi восстанавливает работу после перехода в спящий режим то на контроллер винчестера ничто не влияет, даже аппаратная перезагрузка, только полное отключение устройства от сети. Причем, в выключенном состоянии блок питания обеспечивает напряжением где-то секунд 20, т.е. или ждать заведомо дольше или нужно иметь еще и датчик наличия дежурного напряжения(USB-порт?) и автономное питание минут на 10, либо независимое от сети.
  • 0
    Интересное решение. Лучше бы твердотельное реле, обычные реле имеют свойство «залипать».
    А если терминал вас быть суперпользователем — достаточно написать sudo !!, он повторит предыдущую команду с повышенными правами.
    • 0
      Дело привычки, я привык нажимать стрелку вверх, затем Home и писать sudo, те же 8 нажатий на клавиши, но лишний раз можно взглянуть на то что запускаешь с повышенными привилегиями.
      Залипать не должно поскольку нет существенных нагрузок. Хороший вариант ставить подходящую оптопару или транзисторный ключ.
    • 0
      Твердотельные реле «залипают» на постоянном токе, не?
  • +1
    IMHO не хватает еще внешнего вотчдога. Типа такого http://samopal.pro/wdt-ne555/
    Уж больно нестабильна эта esp8266 Будет обидно, когда понадобится доступ издалека, а esp повиснет в этот момент.
    • 0
      Возьму на заметку. Вообще эксплуатирую устройство с ноября 15 года, обращаюсь к нему пару раз в неделю, на удивление, пока отказов не было.
  • 0
    Имхо городить такое с wifi излишне:
    www.puntoflotante.net/BLUETOOTH-HC-06-WITH-SERIAL-PORT-EASY-GUIDE.pdf
    • 0
      Обычно роутеры не поддерживают Bluetooth и приходится ставить его в USB, а потом возится с настройками hcid… Суть ведь в удаленном доступе, а не локальной работе. Кстати говоря, раньше у меня был похожий самодельный мост на HC-04, и по собственному опыту говорю, Wi-Fi совсем не излишне. К тому же под ESP8266 проще реализовать управление GPIO, у Bluetooth модулей этого типа тоже есть открытое SDK но таким комьюнити как ESP они не похвастаются. И еще они дороже.
      • 0
        Ну у Вас видимо особые требования к такому взаимодействию.
        Если говорить об удаленном доступе, wifi как таковой излишен, ведь к Вашему серверу подходит проводная сеть? Что мешает подвести ее к ethernet-to-serial мосту?
        я больше о том, что Bluetooth модуль уже имеет нужный интерфейс SERIAL, и подключиться к такому модулю со смартфона проще напрямую, и без роутера.
        • 0
          Да, о проводном варианте с Ethernet на enc28j60 я тоже думал, и даже чипы были в наличии, но решил использовать ESP8266, один из доводов — возможность работать в случае отказа сети, напрямую подключившись к точке доступа телефоном.
    • 0
      А как к нему с телефона подключаться?
      • 0
        Очень просто, в маркете достаточно Bluetooth терминалов, первым попался Bluetooth Terminal
  • 0
    Вопрос — а через УСБ нельзя?

    Понятно, что это решение дешевле KVM over IP, но последнее удобнее, и позволяет даже заходить в сетап/БИОС.
    • 0
      А можно подробнее о чем речь?
    • 0
      Похоже понял о чем речь, KVM over IP можно, но действительно не дешево, и хард ресет (замыкание кнопки питания) не уверен что будет поддерживаться. Вообще говоря для дома хорошим решением будет приобретение HP Proliant MicroServer G8, там есть iLO.
      • 0
        А ещё можно vPro. Процессор и материнская плата сопоставимы по цене с комплектующими обычного ПК.
      • 0
        Ни хард ресет ни кнопка питания KVM over IP обычно не поддерживается.
        Для этого есть отдельные устройства. Тоже через ИП.
        Если в Вашем устройстве поддерживается хард ресет, то это круто.

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

        • 0
          Проблема в том, как в это usb устройство отдать консоль, причём начиная с grub-а. Сам grub как помню не умеет работать с USB2COM переходниками, да и ядро поднимет этот компорт только после прогрузки дров.
          • 0
            Мелкий намёк http://git.savannah.gnu.org/cgit/grub.git/tree/grub-core/bus/usb/serial
            Но в жизни не пробовал пока.
            • 0
              Вкусно, лишь бы только grub не влез в соревнования nero с acdsee по построению своей операционной системы
              • 0
                Это логичное решение с их стороны.
                COM32 порты уже доволи редкое явление и логично было прийти к тому что нужно научиться отдавать консоль в что-то посовременнее, нынче массовое применение нашли FTDI и Profilic девайсы так что вот и заморочились.

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

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

                >построению своей операционной системы
                Любой загрузчик собсно ей и является.
                • 0
                  Загрузчик должен найти ОС, залить её минимум в память и отдать ей управление. Правильно, если он позволяет выбрать что и как грузить, даёт возможность задать руками какие-то параметры. Круто, если он позволяет это сделать удобным способом. Но вот если в него встроить мп3 плеер, то это уже будет перебор. Хотя spkmodem из grub мне в своё время очень помог.
                  • +1
                    Mp3 было-бы круто, а то сидишь в серверной, ждёшь винтов на замену и даже музыку послушать неначем :)
                    • +2
                      Наверное по такому-же принципу из средства для записи дисков получилась почти операционная система =)
        • 0
          Я делал из «ripe atlas probe v1», там внутрях Lantronix XPortPRO сидит.
        • 0
          Хочу отметить, что в материнскую плату ничего не впаевается, а соединяется шлейфом с COM портом, обычно он есть на материнской плате, и соединяется с пинами внутреннего USB (только питание) и пинами power стандартными проводками, которыми подключаются к материнской плате кнопки и индикаторы корпусов. Соединение с power — как раз для хард ресета.
          Чтобы включалось только в USB — думаю нет.
          По Ethernet — без проблем, но это совсем другой девайс уже.
  • 0
    Ожидал увидеть реализацию железного терминала на базе ESP8266, который подключается по wifi к локальной сети и поднимает управление по SSH…

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.