Введение
Данное устройство служит для удалённого доступа к 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 (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)
Dima_Sharihin
01.03.2016 12:30Что мешало взять MAX3232, которая с самого начала трехвольтовая?
sixhundredsixtyfive
01.03.2016 12:53+1Согласен, это было бы правильно, просто в свое время закупил популярных MAX232. Будет время нарисую еще один вариант с MAX3232.
Rumlin
01.03.2016 12:40Реле можно было выкинуть, заменив на оптопару. При подключении к матплате просто учитывать полярность.
sixhundredsixtyfive
01.03.2016 12:51Да, реле не самое красивое решение. Я пробовал оптопару 817, и само собой полярность учитывал, но не заработало. Но у реле есть и свои плюсы, им можно замыкать и цепи 220В.
Alexeyslav
01.03.2016 14:40Надо два реле.
Есть неттоп, подозреваю что при перегреве сначала отваливается WiFi а при дальнейшем нагреве ещё и контроллер винчестера, и если WiFi восстанавливает работу после перехода в спящий режим то на контроллер винчестера ничто не влияет, даже аппаратная перезагрузка, только полное отключение устройства от сети. Причем, в выключенном состоянии блок питания обеспечивает напряжением где-то секунд 20, т.е. или ждать заведомо дольше или нужно иметь еще и датчик наличия дежурного напряжения(USB-порт?) и автономное питание минут на 10, либо независимое от сети.
Deamk
01.03.2016 14:45Интересное решение. Лучше бы твердотельное реле, обычные реле имеют свойство «залипать».
А если терминал вас быть суперпользователем — достаточно написать sudo !!, он повторит предыдущую команду с повышенными правами.sixhundredsixtyfive
01.03.2016 14:58Дело привычки, я привык нажимать стрелку вверх, затем Home и писать sudo, те же 8 нажатий на клавиши, но лишний раз можно взглянуть на то что запускаешь с повышенными привилегиями.
Залипать не должно поскольку нет существенных нагрузок. Хороший вариант ставить подходящую оптопару или транзисторный ключ.
migelle74
01.03.2016 15:33+1IMHO не хватает еще внешнего вотчдога. Типа такого http://samopal.pro/wdt-ne555/
Уж больно нестабильна эта esp8266 Будет обидно, когда понадобится доступ издалека, а esp повиснет в этот момент.sixhundredsixtyfive
01.03.2016 15:41Возьму на заметку. Вообще эксплуатирую устройство с ноября 15 года, обращаюсь к нему пару раз в неделю, на удивление, пока отказов не было.
dacentum
01.03.2016 16:38Имхо городить такое с wifi излишне:
www.puntoflotante.net/BLUETOOTH-HC-06-WITH-SERIAL-PORT-EASY-GUIDE.pdfsixhundredsixtyfive
01.03.2016 17:17Обычно роутеры не поддерживают Bluetooth и приходится ставить его в USB, а потом возится с настройками hcid… Суть ведь в удаленном доступе, а не локальной работе. Кстати говоря, раньше у меня был похожий самодельный мост на HC-04, и по собственному опыту говорю, Wi-Fi совсем не излишне. К тому же под ESP8266 проще реализовать управление GPIO, у Bluetooth модулей этого типа тоже есть открытое SDK но таким комьюнити как ESP они не похвастаются. И еще они дороже.
dacentum
01.03.2016 17:28Ну у Вас видимо особые требования к такому взаимодействию.
Если говорить об удаленном доступе, wifi как таковой излишен, ведь к Вашему серверу подходит проводная сеть? Что мешает подвести ее к ethernet-to-serial мосту?
я больше о том, что Bluetooth модуль уже имеет нужный интерфейс SERIAL, и подключиться к такому модулю со смартфона проще напрямую, и без роутера.sixhundredsixtyfive
01.03.2016 17:39Да, о проводном варианте с Ethernet на enc28j60 я тоже думал, и даже чипы были в наличии, но решил использовать ESP8266, один из доводов — возможность работать в случае отказа сети, напрямую подключившись к точке доступа телефоном.
nymitr
01.03.2016 17:17А как к нему с телефона подключаться?
sixhundredsixtyfive
01.03.2016 17:19Очень просто, в маркете достаточно Bluetooth терминалов, первым попался Bluetooth Terminal
mm7
01.03.2016 17:20Вопрос — а через УСБ нельзя?
Понятно, что это решение дешевле KVM over IP, но последнее удобнее, и позволяет даже заходить в сетап/БИОС.sixhundredsixtyfive
01.03.2016 17:33Похоже понял о чем речь, KVM over IP можно, но действительно не дешево, и хард ресет (замыкание кнопки питания) не уверен что будет поддерживаться. Вообще говоря для дома хорошим решением будет приобретение HP Proliant MicroServer G8, там есть iLO.
mm7
01.03.2016 19:37Ни хард ресет ни кнопка питания KVM over IP обычно не поддерживается.
Для этого есть отдельные устройства. Тоже через ИП.
Если в Вашем устройстве поддерживается хард ресет, то это круто.
Вы не ответили, возможно ли сделать Ваше устройство через USB. Чтоб воткнуть в USB, а не впаивать вашу плату в мать как КОМ порт?
И можно ли Ethernet сделать вместо WiFi? Для секурити.
Мне для датацентра надо, не для дома.
JerleShannara
01.03.2016 20:17Проблема в том, как в это usb устройство отдать консоль, причём начиная с grub-а. Сам grub как помню не умеет работать с USB2COM переходниками, да и ядро поднимет этот компорт только после прогрузки дров.
POS_troi
01.03.2016 20:35Мелкий намёк http://git.savannah.gnu.org/cgit/grub.git/tree/grub-core/bus/usb/serial
Но в жизни не пробовал пока.JerleShannara
01.03.2016 21:10Вкусно, лишь бы только grub не влез в соревнования nero с acdsee по построению своей операционной системы
POS_troi
01.03.2016 23:09Это логичное решение с их стороны.
COM32 порты уже доволи редкое явление и логично было прийти к тому что нужно научиться отдавать консоль в что-то посовременнее, нынче массовое применение нашли FTDI и Profilic девайсы так что вот и заморочились.
Вообще в грубе есть веши и странные, например можно «морзянку» в бипер загонять http://git.savannah.gnu.org/cgit/grub.git/tree/grub-core/term/morse.c
Давно видел это дело но честно даже никогда не видел даже гайдов на тему применения, но если оно есть значит кому-то нужно :)
>построению своей операционной системы
Любой загрузчик собсно ей и является.JerleShannara
02.03.2016 18:20Загрузчик должен найти ОС, залить её минимум в память и отдать ей управление. Правильно, если он позволяет выбрать что и как грузить, даёт возможность задать руками какие-то параметры. Круто, если он позволяет это сделать удобным способом. Но вот если в него встроить мп3 плеер, то это уже будет перебор. Хотя spkmodem из grub мне в своё время очень помог.
POS_troi
02.03.2016 18:31+1Mp3 было-бы круто, а то сидишь в серверной, ждёшь винтов на замену и даже музыку послушать неначем :)
JerleShannara
02.03.2016 18:37+2Наверное по такому-же принципу из средства для записи дисков получилась почти операционная система =)
sixhundredsixtyfive
01.03.2016 22:58Хочу отметить, что в материнскую плату ничего не впаевается, а соединяется шлейфом с COM портом, обычно он есть на материнской плате, и соединяется с пинами внутреннего USB (только питание) и пинами power стандартными проводками, которыми подключаются к материнской плате кнопки и индикаторы корпусов. Соединение с power — как раз для хард ресета.
Чтобы включалось только в USB — думаю нет.
По Ethernet — без проблем, но это совсем другой девайс уже.
semen-pro
02.03.2016 19:28Ожидал увидеть реализацию железного терминала на базе ESP8266, который подключается по wifi к локальной сети и поднимает управление по SSH…
syslinux
Перезалейте пожалуйста видео. Пишет Автор ограничил доступ к видео.
sixhundredsixtyfive
Спасибо, забыл открыть доступ перед публикацией.
syslinux
Вам спасибо за отличную статью. Давно искал что либо подобное.