Терминал для домашнего 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, остальное обычно есть в хозяйстве.

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





    Исходники железа и софта тут.
    Метки:
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

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

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

                      Понятно, что это решение дешевле KVM over IP, но последнее удобнее, и позволяет даже заходить в сетап/БИОС.
                      • А можно подробнее о чем речь?
                        • Похоже понял о чем речь, 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 сидит.
                                  • Хочу отметить, что в материнскую плату ничего не впаевается, а соединяется шлейфом с COM портом, обычно он есть на материнской плате, и соединяется с пинами внутреннего USB (только питание) и пинами power стандартными проводками, которыми подключаются к материнской плате кнопки и индикаторы корпусов. Соединение с power — как раз для хард ресета.
                                    Чтобы включалось только в USB — думаю нет.
                                    По Ethernet — без проблем, но это совсем другой девайс уже.
                              • 0
                                Ожидал увидеть реализацию железного терминала на базе ESP8266, который подключается по wifi к локальной сети и поднимает управление по SSH…

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