Я уже пару статей подряд вскользь упоминаю OpenWRT, и возможно кого-то заинтересовало, что это за система. OpenWRT - это набор прошивок для самых разных устройств, но в основном для роутеров. Базируется на BusyBox и ядре Linux. Где-то с версии 17.01 прошивки стали именоваться LEDE, т.к. произошло слияние проектов OpenWRT и LEDE.
К сожалению, чтобы в первый раз поставить на какое-либо фирменное устройство прошивку OpenWRT, скорее всего вам придётся изрядно "поплясать с бубном" (сужу по собственному опыту). В худшем случае вы получите "кирпич" вместо вашего роутера. Это не означает, что устройство после этого нельзя оживить, но не у всех хватит квалификации выпаять флешку в корпусе TSOP-48, что бы перепрошить ее и заново запаять. Поэтому, если вам нужна система с OpenWRT, я не советую перепрошивать роутеры, т.к. если вы умеете это делать, то мои советы будут вам ни к чему, а если нет, то они будут только во вред.
Замечу, что согласно предупреждению 4/32 устройства с размером флеш-памяти 4МБ и менее, и размером ОЗУ 32МБ или менее, считаются устройствами с ограниченной поддержкой. Оптимальный размер ОЗУ для OpenWRT/LEDE сейчас равняется 128МБ, а приемлемый размер 64МБ. Т.е. вы хотите использовать роутер для перепрошивки под OpenWRT то он должен быть не какой-нибудь, а довольно приличный.
На самом деле существуют специальные платы для разработки под OpenWRT, где не надо совершать никаких телодвижений с бубном, и об одной из них я хочу рассказать, а именно о LinkIt™ Smart 7688 Duo. В качестве альтернативы вы также можете рассмотреть платы: Arduino Yun и Omega 2 plus.
Платы LinkIt™ Smart 7688 и LinkIt™ Smart 7688 Duo были выпущены три года назад и являются совместным проектом тайваньской компании MediaTek и китайской SeeedStudio. Проект был нацелен на быстрорастущий рынок интернет-вещей и призван упростить жизнь тех людей, что делают свои проекты из разномастных роутеров под управлением OpenWRT. В данный момент проект находится в несколько заброшенном состоянии, но платы все еще продаются в SeeedStudio (летом они были доступны только по предзаказу), а сайте MediaTek все еще доступна документация по работе платами.
Пятого мая 2011 года, компания Mediatek купила(поглотила) Realtek. И многие чипы достались Mediatek "в наследство" от Realtek. Поэтому в логах часто будет встречаться оригинальное наименование. К примеру, ветка с прошивками OpenWRT для MT7688 называется ramips.
Основой платы LinkIt™ Smart 7688 является "роутерный" чип MT7688 с архитектурой MIPS24KEc, частотой 580MHz и объёмом оперативной памяти 128MB. В довесок, LinkIt™ Smart 7688 содержит разъём microUSB 2.0 и разъём для microSD карт. Из серьёзных минусов я бы назвал отсутствие аппаратной поддержки чисел с плавающей запятой (FPU).
Концепция платы LinkIt™ Smart 7688 Duo состоит в том, что она может являться связующей платформой для разработчиков разных направлений: 1) Для разработчиков OpenWRT которые самостоятельно собирают свои сборки OpenWRT и предпочитают программировать на языках C/C++; 2) для веб-разработчиков которые предпочитают писать свои веб-приложения с использованием Python или/и Node.js®; 3) Для Arduino разработчиков которые могут писать программы в комфортной для себя среде, опираясь при этом на мощь 580МНz компьютера.
Фирменная прошивка базируется на OpenWRT 15.05 Сhaos Сalmer. Она дополнена пакетами Python 2.7.9 и NodeJS 0.12.7. Всего прошивка "весит" где-то 20МБ. Технически, вы можете обновить прошивку до последней стоковой LEDE 18.06, но там не будет NodeJS, а Python придётся устанавливать через пакетный менеджер opkg.
Я пока предлагаю не трогать фирменную прошивку, а сосредоточиться на прикладных задачах. В данной статье я постарался рассказать о основах работы с платой Linkit Smart 7688, о сложностях и путях их преодоления.
Содержание:
Распиновка платы LinkIt™ Smart 7688 Duo:
Как видно, на плате почти все пины MT7688 обрезаны, оставлены только: UART, USB и Ethernet порты. Остальные пины отведены под ATmega32U4. Связь MT7688 с ATmega32U4 предполагается осуществлять через UART порты друг-друга. Для этого предполагается использовать библиотеки Firmata или Bridge.
ATmega32U4 работает на частоте 8MHz, логический уровень 3.3 Вольт.
Как я уже говорил, к сожалению, процессор лишён блока операций с числами с плавающей запятой.
Таблица с детальными характеристиками LinkIt™ Smart 7688 Duo (взята с сайта SeeedStudio):
Specifications Category | Feature | Specification |
---|---|---|
MPU | Chipset | MT7688AN |
Core | MIPS24KEc | |
Clock speed | 580MHz | |
Working voltage | 3.3V | |
MCU | Chipset | ATmega32U4 |
Core | Atmel AVR | |
Clock speed | 8MHz | |
Working voltage | 3.3V | |
PCB Size | Dimensions | 60.8 x 26 mm |
Memory | Flash | 32MB |
RAM | 128MB DDR2 | |
Power Source | USB Power | 5V (USB micro-B) |
VCC | 3.3V (Pin Breakout) | |
GPIO | Pin Count | 3 (MT7688AN) 24 (ATmega32U4) |
Voltage | 3.3v | |
PWM | Pin Count | 8 (ATmega32U4) |
Voltage | 3.3v | |
Max. Resolution | 16 bits (customizable) | |
Maximum Frequency@Resolution | 31.25kHz@8-bit, Timer 0 (4 sets) | |
2MHz@2-bit,122Hz@16-bit, Timer 1 & 3 (4 sets) | ||
187.5kHz@8-bit, 46.875kHz@10-bit, Timer 4 (6 sets) | ||
ADC | Pin Count | 12 (ATmega32U4) |
Voltage | 3.3v | |
External Interrupts | Pin Count | 8 (ATmega32U4) |
SPI/SPIS | Set count | 1 (ATmega32U4) |
Pin numbers | S0, S1, S2, S3 | |
Max. Speed | 4 MHz | |
I2C | Set count | 1 |
Pin numbers | D2, D3 | |
Speed | 400K | |
UART Lite | Set count | 1 (ATmega32U4) |
1 (MT7688AN) | ||
Pin numbers | P8, P9 (MT7688AN) | |
D0, D1 (ATmega32U4) | ||
Max. Speed | 0.5 Mbps (MT7688AN) | |
0.5 Mbps (ATmega32U4) | ||
USB Host | Set count | 1 (MT7688AN) |
Pin numbers | P6, P7 | |
Connector type | Micro-AB | |
Communication | Wi-Fi | 1T1R 802.11 b/g/n (2.4G) |
Ethernet | 1-port 10/100 FE PHY | |
Pin numbers | P2, P3, P4, P5 | |
User Storage | SD Card | Micro SD SDXC |
Фотографии платы. Сравнение с ESP32 NodeMCU, вид сверху:
LinkIt™ Smart 7688 Duo, вид снизу:
Здесь сбоку имеется EJTAG разъём. Чтобы его активировать, нужно перепаивать перемычку рядом с логотипом "Open Hardware".
По правде говоря, плата досталась мне за полцены. Летом мне удалось выиграть купон на 10$ за прохождение опроса в честь годовщины(anniversary) SeeedStudo. Кроме этого, в августе у них была акция с доставкой в 5$ при заказах менее 100$. Т.о. плата LinkIt™ Smart 7688 Duo мне стоила всего 12.9$:
Я рассказываю это не для того чтобы похвастаться, а чтобы рассказать что на акциях там действительно можно чего-то перехватить, в отличии от того же али.
Если же искать альтернативы плате LinkIt™ Smart 7688 Duo, то первым делом на ум приходит Arduino Yun:
Arduino Yun появился несколько раньше LinkIt™ Smart 7688 Duo, и я не открою большого секрета сказав, что именно Arduino Yun послужил прообразом для LinkIt Smart 7688 Duo.
Также как в Linkit Duo, здесь имеется чип ATmega32U4, а вот характеристики процессорного модуля несколько устаревшие: процессор Atheros AR9331 с частотой 400MHz, 64 Мбайт ОЗУ, 16 Мбайт флеш-памяти. Имеется разъём для карт MicroSD. Возможно кому-то придётся по вкусу Ethernet разъём имеющийся на борту, или возможно кому-то придётся кстати форм-фактор типа "Arduino". На борту Arduino Yun имеется семь светодиодов для индикации различных аппаратных процессов: индикации питания, работы UART, USB, Wifi, а также отладочный светодиод на D13. Плата продаётся за 5990 руб в "Амперке".
На ebay можно встретить различные клоны Arduino Yun, например такого вида:
Здесь отсутствует разъём MicroSD и чип ATmega32U4. Плата позиционируется как процессорный модуль. Торгуется на уровне 1770 руб, включая доставку.
На али мое внимание привлекла такая плата:
Здесь нет никаких разъёмов кроме штыревого. Чип MT7688, память 64, флеш 16. Цена около 620р. Дёшево и сердито.
Плата Omega 2+ в каком-то роде может считаться конкурентом Linkit:
Здесь имеется разъём для MicroCD карт, чип MT7688, флеш 32Мбайта, ОЗУ 128 Мбайт. Имеется сайт с документацией продаётся за 1510 руб в ЧиД.
Далее в обзоре два процессорных модуля, которые предназначены для для впаивания в платы. Первый модуль - HLK7688A:
Здесь имеется: чип MT7688, память 128, флеш 32. Модуль торгуется на али примерно за 630 руб, включая доставку.
Еще один любопытный модуль - VoCore2, который как преподносится как самый маленький компьютер в мире:
Здесь используется совместимый чип MT7628AN, память на 128МБ, флешка NOR типа на 16МБ. Приобрести можно через краудфандинговую платформу Indiegogo за 100$.
LinkIt™ Smart 7688 Duo имеет два разъёма microUSB: PWR/MCU через которое подаётся питание на плату и которое служит интерфейсным USB портом для ATmega32U4, и USB HOST - это интерфейсный порт чипа MT7688. Для подключения питания на плату, нужно подсоединить кабель microUSB компьютера к разъёму PWR/MCU, как показано на фото:
После включения питания должен загореться зелёный светодиод. Последовательность мигания оранжевого светодиода (он носит название WiFi LED) показана на следующей картинке:
Через секунду после включения он ненадолго мигнёт, после чего погаснет на 4-5 секунд. После этого начинается загрузка Linux которая займёт около 30 секунд, в это время, оранжевый светодиод будет непрерывно гореть. При первом включении, Linkit загрузится в режим открытой точки доступа. При отсутствии подключений к ней, WiFi LED будет находится в погашенном состоянии. Подключать внешнюю антенну для работы с Linkit не обязательно. Плата оснащена своей pcb-антенной.
Внимание! При недостаточном качестве источника питания, Linkit может вести себя следующим образом: а) когда горит только только зелёный светодиод и больше ничего не происходит; б) когда Linkit постоянно перезагружается. Linkit нужно подключать к зарядному устройству, либо непосредственно к USB порту компьютера. Не следует подключать плату через удлинители или USB хабы.
При подключении LinkIt™ Smart 7688 Duo к компьютеру, в логе ядра Linux появятся следующие строки:
usb 3-1: new full-speed USB device number 3 using ohci-pci usb 3-1: New USB device found, idVendor=0e8d, idProduct=ab01 usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0 usb 3-1: Product: LinkIt Smart 7688 usb 3-1: Manufacturer: MediaTek Labs cdc_acm 3-1:1.0: ttyACM0: USB ACM device input: MediaTek Labs LinkIt Smart 7688 as /devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.2/0003:0E8D:AB01.003E/input/input75 hid-generic 0003:0E8D:AB01.003E: input,hidraw4: USB HID v1.01 Mouse [MediaTek Labs LinkIt Smart 7688] on usb-0000:00:12.0-1/input2
Для Windows потребуется установить драйвер по этому руководству Install the LinkIt Smart 7688 Duo COM port driver
После перехода Linkit в режим точки доступа, она должна отобразиться с идентификатором начинающимся с "Linkit_Smart_7688":
$ nmcli device wifi list * SSID РЕЖИМ КАНАЛ СКОРОСТЬ СИГНАЛ СТОЛБЦЫ ЗАЩИТА LinkIt_Smart_7688_27A89B Инфраструктура 9 54 МБ/с 100 ▂▄▆█ Alien Инфраструктура 11 54 МБ/с 100 ▂▄▆█ WPA2 Brute Инфраструктура 11 54 МБ/с 69 ▂▄▆_ WPA1 WPA2 WiFi-DOM.ru-1784 Инфраструктура 2 54 МБ/с 45 ▂▄__ WPA1 WPA2 Super S Инфраструктура 6 54 МБ/с 42 ▂▄__ WPA1 WPA2
Подключаемся с нашей точке доступа:
$ nmcli device wifi connect LinkIt_Smart_7688_27A89B Device 'wlan0' successfully activated with 'f554ff14-9856-491b-bcde-696b66eb8cbf'
После подключения к LinkIt™ Smart 7688 Duo, оранжевый светодиод начнёт мигать в следующем режиме: три коротких вспышки, после чего одна длинная пауза".
Посмотрим на параметры соединения:
$ sudo /sbin/ifconfig wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.100.142 netmask 255.255.255.0 broadcast 192.168.100.255 ether f0:7d:68:6d:53:4e txqueuelen 1000 (Ethernet) RX packets 798 bytes 759741 (741.9 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 677 bytes 75729 (73.9 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Ищем доступные хосты:
$ nmap -sP 192.168.100.0/24 Starting Nmap 7.12 ( https://nmap.org ) at 2018-11-24 05:59 SAMT Nmap scan report for mylinkit.lan (192.168.100.1) Host is up (0.0037s latency). Nmap scan report for darkstar.lan (192.168.100.142) Host is up (0.00024s latency). Nmap done: 256 IP addresses (2 hosts up) scanned in 3.11 seconds
Хост mylinkit - это вероятно то, что нам нужно. Проверяем:
$ ping -c 5 mylinkit PING mylinkit.lan (192.168.100.1) 56(84) bytes of data. 64 bytes from mylinkit.lan (192.168.100.1): icmp_seq=1 ttl=64 time=2.39 ms 64 bytes from mylinkit.lan (192.168.100.1): icmp_seq=2 ttl=64 time=3.18 ms 64 bytes from mylinkit.lan (192.168.100.1): icmp_seq=3 ttl=64 time=3.49 ms 64 bytes from mylinkit.lan (192.168.100.1): icmp_seq=4 ttl=64 time=3.84 ms 64 bytes from mylinkit.lan (192.168.100.1): icmp_seq=5 ttl=64 time=3.85 ms --- mylinkit.lan ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4006ms rtt min/avg/max/mdev = 2.391/3.354/3.851/0.544 ms
Теперь в браузере вводим "http://mylinkit" и попадаем на страницу аутентификации:
Здесь нас просят придумать пароль. После ввода пароля и прохождения аутентификации, попадаем на страницу главных настроек.
Текущая версия прошивки 0.9.2, в то время как на сайте MediaTek доступна версия 0.9.4:
После скачивания и распаковки архива, жмём жёлтую кнопку "UPGRADE FIRMWARE", и указываем файл с распакованной прошивкой. После чего щёлкаем по кнопке "UPGRADE & RESTART":
Прошивка загрузится довольно быстро после чего выдаст такое сообщение:
Здесь говорится, что в процессе прошивки оранжевый светодиод будет быстро мигать (без пауз) около трех минут. После этого Linkit перезагрузится и светодиод будет непрерывно гореть около 30 секунд.
После того как будет нажато OK, начнётся перепрошивка. Во время последующей перезагрузки соединение с точкой доступа будет сброшено. Переподключившись (в случае если у вас не автоматический реконект) к Linkit, видим, что текущая версия прошивки обновилась до 0.9.4:
После этого щёлкаем по вкладке "NETWORK", и переводим Linkit в режим клиента:
Указываем свою точку доступа и пароль к ней. После чего перезагружаем Linkit.
После переподключения, заходим на Linkit как на обычный локальный сервер. После аутентификации мы можем перейти к настройкам OpenWRT:
На плате linkit имеется три кнопки: MPU, WIFI и MCU. Если в процессе настройки что-то пошло не так, например вы неправильно указали пароль к точке доступа, то вы всегда сможете сбросить настройки путём удерживания кнопки "WIFI" около 5 секунд. После этого нажмите кнопку "MCU", и Linkit перезагрузится снова в режим точки доступа.
Также как и в стандартной сборке OpenWRT, с LinkIt™ Smart 7688 Duo можно работать через ssh. Но иногда бывает, что что-то идёт не так, и после перепрошивки или каких-то изменений, система перестаёт загружаться, из сети её соответственно тоже не видно. Первое за что следует браться в такой ситуации - это USB-UART конвертер с (обязательно!) 3.3 вольтовой логикой.
На сайте Seeedstudio имеется руководство по подключению USB-UART конвертера к Linkit:
Подключаем адаптер согласно этой инструкции, открываем терминал, выставляем скорость 57600 и окончание строки NL. После этого перезагружаем LinkIt™ Smart 7688 Duo, и в окне терминальной программы видим лог загрузки:
Из интересного, в логе имеется: 1) меню загрузчика U-Boot; 2) возможность попасть в консоль восстановления OpenWRT Failsafe.
Вводим Enter, и попадаем в консоль:
Но лучше, конечно, будет использовать не терминал Arduino IDE, а программу screen если речь о Linux или GYGWIN. Открываем порт:
$ screen /dev/ttyUSB0 57600
Опять нажимаем Enter и попадаем в консоль:
Как я упоминал, в начале загрузки, сначала появляется меню загрузчика U-Boot, который выглядит так:
U-Boot 1.1.3 (Dec 6 2016 - 11:20:23) Board: Ralink APSoC DRAM: 128 MB relocate_code Pointer at: 87f68000 ****************************** Software System Reset Occurred ****************************** flash manufacture id: c2, device id 20 19 find flash: MX25L25635E ============================================ Ralink UBoot Version: 4.3.0.0 -------------------------------------------- ASIC 7628_MP (Port5<->None) DRAM component: 1024 Mbits DDR, width 16 DRAM bus: 16 bit Total memory: 128 MBytes Flash component: SPI Flash Date:Dec 6 2016 Time:11:20:23 ============================================ icache: sets:512, ways:4, linesz:32 ,total:65536 dcache: sets:256, ways:4, linesz:32 ,total:32768 ##### The CPU freq = 580 MHZ #### estimate memory size =128 Mbytes RESET MT7628 PHY!!!!!! GPIOMODE --> 50054404 GPIOMODE2 --> 5540551 Please choose the operation: 1: Load system code to SDRAM via TFTP. 2: Load system code then write to Flash via TFTP. 3: Boot system code via Flash (default). 4: Entr boot command line interface. 7: Load Boot Loader code then write to Flash via Serial. 9: Load Boot Loader code then write to Flash via TFTP. 0
Меню предоставляет возможность загрузить прошивку через TFTP, для чего потребуется прикручивать к плате LAN порт. Также через загрузчик можно обновить сам загрузчик через TFTP или последовательный порт. U-Boot ждёт две секунды, после чего загружает ядро Linux.
Используя подключение по последовательному порту, при загрузке системы, имеется возможность попасть в консоль восстановления. Для этого нужно дождаться, пока в логе загрузки не появятся следующие строки:
Press the [f] key and hit [enter] to enter failsafe mode
После чего последовательно нажать "f" и "enter".
Суть работы в консоли восстановления заключает в "откате" на первоначальные установки, что осуществляется стиранием overlay раздела куда сохраняются все изменения.
Для примера, предположим, что LinkIt™ Smart 7688 Duo перестал загружаться. Вначале все идёт нормально, оранжевый светодиод один раз мигает, потом идёт пауза на 4-5 секунд, но затем светодиод включается и не выключается. Плата зависла.
Для восстановления, подключим USB-UART адаптер к Linkit с перезагрузим плату. После дождёмся пока не появится надпись: "Press the [f] key and hit [enter] to enter failsafe mode", и здесь нажмём клавиши: "f" и Enter.
Сброс может быть мягким или жёстким. Согласно документации, мягкий сброс выполняется командой:
umount /overlay && firstboot && reboot
Жёсткий сброс производится командой:
umount /overlay && jffs2reset && reboot
В моём случае не работает ни первый не второй вариант. Начнём с того, что структура томов выглядит так:
# mount rootfs on / type rootfs (rw) /dev/root on / type squashfs (ro,relatime) proc on /proc type proc (rw,nosuid,nodev,noexec,noatime) sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,noatime) tmpfs on /dev type tmpfs (rw,nosuid,noatime,size=512k,mode=755) devpts on /dev/pts type devpts (rw,nosuid,noexec,noatime,mode=600) tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noatime)
Как видно, раздел overlay не подключён и следовательно команду: "umount /overlay" можно пропустить.
По команде jffs2reset попросту выводит сообщение без какого-либо видимого эффекта:
root@(none):/# jffs2reset [ 1583.820000] jffs2reset: This will erase all settings and remove any installed packages. Are you sure? [N/y] root@(none):/#
Решение было найдено здесь: OpenWrt Failsafe Mode and Flash Recovery - VillageTelco.
root@(none):/# mtd -r erase rootfs_data Unlocking rootfs_data ... Erasing rootfs_data ... Rebooting ... reboot
Команда выполняется примерно секунд 40, после чего автоматически происходит перезагрузка. Система возвращается к первоначальной конфигурации OpenWRT.
Иногда бывает необходимость всего лишь поправить несколько файлов на overlay разделе, посмотреть логи и т.д. Тогда подключаемся через USB-UART преобразователь, перезагружаем Linkit, дожидаемся строки:
Press the [f] key and hit [enter] to enter failsafe mode
далее жмем "f" и "enter". Попадаем в консоль восстановления:
Флешка на 32МБ подключена к ядру Linux через MTD подсистему:
root@(none):/# cat /proc/mtd dev: size erasesize name mtd0: 00030000 00010000 "u-boot" mtd1: 00010000 00010000 "u-boot-env" mtd2: 00010000 00010000 "factory" mtd3: 01fb0000 00010000 "firmware" mtd4: 001238e3 00010000 "kernel" mtd5: 01e8c71d 00010000 "rootfs" mtd6: 00aa0000 00010000 "rootfs_data"
Здесь в mtd0 записан загрузчик U-Boot, в mtd5 находится прошивка в сжатом Squashfs формате, в разделе mtd6 находится overlay-раздел в формате jffs2. Его можно примонтировать обычным образом:
# mount -t jffs2 /dev/mtdblock6 /mnt
После этого можно создавать и редактировать файлы на overlay разделе.
Хочу обратить внимание на довольно неприятный баг, с которым можно столкнуться при частом использовании подключения через последовательный порт. Я еще не совсем разобрался с ним, но почти уверен, что он возникает только при подключении через последовательный интерфейс. При этом я на 100% уверен, что это не аппаратный баг.
Баг проявляется в виде создании лишних файлов в корневой директории, система зависает и отказывается загружаться, соответственно сеть не работает на устройство можно попасть только через консоль восстановления. Баг проявляется не только у меня, поиском в google нашлась тема с описанием подобной проблемы: Serial console can not be activated. Самый простой способ восстановления работоспособности LInkit - возврат к настройкам по умолчанию, с форматированием overlay раздела. Однако это ведёт к потери данных.
Из-за чего возникает баг? Я еще не знаю точно, но подозреваю из-за того, что через последовательный порт в рутовую консоль можно попасть одним нажатием клавиши "Enter". Т.е. достаточно чтобы последовательный порт "поймал" байт 0х0D, чтобы весь последующий поток ушёл на исполнение от рута. У меня так однажды текстовый файл ушел на выполнение.
В данном случае лечение на мой взгляд очевидно - это поставить пароль на вход через последовательный порт. В руководстве OpenWrt Project: Serial console password для этого рекомендуют в файле /etc/inittab, строку:
::askconsole:/bin/ash --loginзаменить на:
::askconsole:/bin/login
Утилиты login в прошивке Linkit нет, для ее добавления придётся перекомпилировать BusyBox. Есть скрипт login.sh, но он все равно не заменяет login. Поэтому в любом случае, при указании login или login.sh - это приведёт к блокировке входа через последовательный порт. Что собственно и требовалось. У меня лично файловая система расположена на microSD карте, что позволяет иметь две конфигурации. Основная конфигурация располагается на карточке, и там вход через последовательный порт заблокирован. Если мне нужно попасть в систему через последовательный порт, например для того чтобы поменять пароль к WiFi, то я загружаюсь без карточки (её при необходимости можно вставить в слот и примонтировать в процессе работы).
Также не лишним будет добавить в систему непривилегированного пользователя, а для администрирования пользоваться командой sudo. После осуществления указанных мер предосторожности, обозначенный баг у меня не проявлялся.
По большому счету, для нормально сконфигурированной системе достаточно SSH доступа. Доступ по последовательному порту нужен только на первоначальном этапе конфигурации системы, когда сеть ещё не работает.
При смене прошивок приходится заново производить первичную конфигурацию системы. Есть способ сократить время на эту нудную процедуру. Для этого понадобится подключение по последовательному порту.
Допустим вы ставили прошивку LEDE 18.06 и теперь хотите откатиться обратно на фирменную прошивку. Для начала нам нужно скачать прошивку. Ссылка на последнюю актуальную прошивку находится в Downloads - LinkIt Smart 7688 Resources сайта Mediatek. Для firmware 0.9.4 ссылкой на прошивку будет https://labs.mediatek.com/en/download/hpcKCI7J.
Скачиваем прошивку на обычном компьютере, к примеру через wget:
wget https://labs.mediatek.com/en/download/hpcKCI7J
Прошивка сохранится под именем hpcKCI7J. Распаковываем прошивку:
$ unzip hpcKCI7J Archive: hpcKCI7J creating: 0.9.4/ inflating: 0.9.4/lks7688.img
Копируем прошивку на Linkit:
$ scp 0.9.4/lks7688.img root@linkit:/tmp
Переходим на сторону Linkit. Для перепрошивки нам понадобится утилита sysupgrade:
# sysupgrade -h Usage: /sbin/sysupgrade [<upgrade-option>l;...] <image file or URL> /sbin/sysupgrade [-q] [-i] <backup-command> <file> upgrade-option: -dadd a delay before rebooting -f restore configuration from .tar.gz (file or url) -i interactive mode -c attempt to preserve all changed files in /etc/ -n do not save configuration over reflash -T | --test Verify image and config .tar.gz but do not actually flash. -F | --force Flash image even if image checks fail, this is dangerous! -q less verbose -v more verbose -h | --help display this help backup-command: -b | --create-backup create .tar.gz of files specified in sysupgrade.conf then exit. Does not flash an image. If file is '-', i.e. stdout, verbosity is set to 0 (i.e. quiet). -r | --restore-backup restore a .tar.gz created with sysupgrade -b then exit. Does not flash an image. If file is '-', the archive is read from stdin. -l | --list-backup list the files that would be backed up when calling sysupgrade -b. Does not create a backup file.
Перепрошиваем плату без сохранения конфигурации:
# sysupgrade -n lks7688.img
Система выдаст такой лог и нужно будет подождать минуту или полторы, после чего пойдёт лог загрузки:
killall: watchdog: no process killed Sending TERM to remaining processes ... logd rpcd netifd odhcpd uhttpd ntpd ap_client dnsmasq ubusd Sending KILL to remaining processes ... Switching to ramdisk... Performing system upgrade... Unlocking firmware ... Writing from <stdin> to firmware ... [w]
После перезагрузки в ненастроенную систему, сначала нужно задать пароль рута:
# passwd
В конфиге беспроводной сети /etc/config/wireless:
config wifi-device 'radio0' option type 'ralink' option variant 'mt7628' option country 'TW' option hwmode '11g' option htmode 'HT40' option channel 'auto' option linkit_mode 'sta' option disabled '0' config wifi-iface 'ap' option device 'radio0' option mode 'ap' option network 'lan' option ifname 'ra0' option encryption 'none' option ssid 'LinkIt_Smart_7688_27A89B' option seq '1' config wifi-iface 'sta' option device 'radio0' option mode 'sta' option network 'wan' option ifname 'apcli0' option led 'mediatek:orange:wifi' option ssid 'Alien' option key 'пароль' option encryption 'psk'
надо будет поменять режим работы wifi на режим клиента, а также в разделе настройки клиента вписать свою точку доступа и пароль к ней для подключения.
На этом собственно все, далее можно перезагружаться, и входить на Linkit уже по ssh.
Вообще-то для подключения к Linkit по Ethernet продаётся специальная плата Arduino Breakout for LinkIt Smart 7688 Duo.
Подключать какую-либо железку к витой паре, не важно, микроконтроллер или микропроцессор следует через специальные Ethernet-фильтры (Ethernet magnetics). Выглядят они как черные коробочки. На фото даже показано как с помощью ножовки добыть себе LAN разъем из ненужной сетевой карты:
У меня такой удобной платы на распил не было, да мне и надо было подключиться всего на пять минут, поэтому я просто взял разъем rj45 и подпаял к нему проводки:
Проводки должны быть минимальной длины! К разъёму я подключал витую пару около 30см длиной. Обычный патч-корд на полтора метра отказывался работать.
Подключение может быть прямым или кроссированным. Если плату подключать непосредственно к компьютеру, что следует использовать кроссированное соединение. Если подключать к роутеру, то как правило следует использовать прямое подключение. Хотя многие роутеры могут определять тип кабеля, и подстраиваются под них.
Для подключения к LinkIt™ Smart 7688 Duo через Ethernet интерфейс, нужно убедиться, что ваш компьютер и Linkit находятся в одной подсети. По умолчанию, Linkit имеет адрес 192.168.100.1. Если мой компьютер имеет адрес вида 192.168.1.хх то Linkit должен иметь адрес вида 192.168.1.yy. Адрес указывается в конфиге /etc/config/network:
config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
config globals 'globals'
option ula_prefix 'fd05:f152:73e6::/48'
config interface 'lan'
option ifname 'eth0'
option force_link '1'
option macaddr '9c:65:f9:27:9c:e3'
option type 'bridge'
option proto 'static'
option netmask '255.255.255.0'
option ip6assign '60'
option ipaddr '192.168.1.77'
config switch
option name 'switch0'
option reset '1'
option enable_vlan '0'
config interface 'wan'
option proto 'dhcp'
После подключения LinkIt™ Smart 7688 Duo к роутеру или компьютеру, нужно протестировать соединение:
$ ping -D -i 0.2 192.168.1.77
Нужно добиться того, чтобы потерянных пакетов не было:
--- 192.168.1.77 ping statistics --- 126 packets transmitted, 126 received, 0% packet loss, time 24999ms rtt min/avg/max/mdev = 0.248/0.283/0.342/0.022 ms
Неоспоримым преимуществом платы LinkIt™ Smart 7688 Duo является наличие разъема для карты памяти MicroSD. Это позволяет использовать карту MicroSD в качестве носителя файловой системы, вместо использования USB-Flash носителей, как это традиционно делается в роутерах на OpenWRT. Т.о. у нас остаётся свободным USB разъем для чего-то более интересного.
Предполагаем, что мы работаем с Linkit через ssh-соединение. Если мы посмотрим на структуру файловой системы:
root@linkit:~# df -h Filesystem Size Used Available Use% Mounted on rootfs 10.6M 1.5M 9.2M 14% / /dev/root 20.0M 20.0M 0 100% /rom tmpfs 61.7M 244.0K 61.4M 0% /tmp /dev/mtdblock6 10.6M 1.5M 9.2M 14% /overlay overlayfs:/overlay 10.6M 1.5M 9.2M 14% / tmpfs 512.0K 0 512.0K 0% /dev
root@linkit:~# mount rootfs on / type rootfs (rw) /dev/root on /rom type squashfs (ro,relatime) proc on /proc type proc (rw,nosuid,nodev,noexec,noatime) sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,noatime) tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noatime) /dev/mtdblock6 on /overlay type jffs2 (rw,noatime) overlayfs:/overlay on / type overlay (rw,noatime,lowerdir=/,upperdir=/overlay/upper,workdir=/overlay/work) tmpfs on /dev type tmpfs (rw,nosuid,relatime,size=512k,mode=755) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,mode=600) debugfs on /sys/kernel/debug type debugfs (rw,noatime)
то видно, что SPI-флешка подключена через MTD подсистему. Она разделена на две части. Первый раздел объёмом в 20 Мбайт в отведён под прошивку, он имеет сжатую файловую систему SquashFS и доступен только для чтения. Второй раздел имеет объем 10 Мбайт, файловую систему jffs2 и он доступен для записи. Оба раздела, через OverlayFS склеены в единый "бутерброд". Это типичная организация файловой системы для встраиваемых систем.
С помощью подключения SD карты мы можем перенести второй раздел на MicroSD и тем самым увеличим свободное пространство с нескольких мегабайт до нескольких гигабайт. О том, как это осуществить на практике, имеется подробная инструкция на сайте mediatek: Mounting the root FS on an SD card. Но там имеется парочка неточностей. Итак.
Первым делом, устанавливаем необходимые модули и дополнительный софт:
# opkg update # opkg install block-mount kmod-fs-ext4 kmod-usb-storage-extras e2fsprogs fdisk
Если карта MicroSD вставлена в слот, то она появится в системе. Если карты еще нет, то можно ее вставить на отключая питание LinkIt™ Smart 7688 Duo, как это делается на планшетах.
[ 7353.170000] msdc-1 -> cmd<13> card<0> power<2> <- msdc_ops_request() : L<2120> PID<kworker/u2:0><0x6> [ 7353.180000] msdc-1 -> cmd<13> card<0> power<2> <- msdc_ops_request() : L<2120> PID<kworker/u2:0><0x6> [ 7353.200000] msdc-1 -> cmd<13> card<0> power<2> <- msdc_ops_request() : L<2120> PID<kworker/u2:0><0x6> [ 7353.220000] msdc-1 -> cmd<13> card<0> power<2> <- msdc_ops_request() : L<2120> PID<kworker/u2:0><0x6> [ 7353.240000] mmc0: card 1234 removed [ 7353.250000] ttyS2: 1 input overrun(s) [ 7355.170000] mmc0: new high speed SDHC card at address 1234 [ 7355.180000] mmcblk mmc0:1234: no of_node; not parsing pinctrl DT [ 7355.190000] mmcblk0: mmc0:1234 SA04G 3.68 GiB [ 7355.200000] mmcblk0: p1
Здесь я извлёк карту, и вставил ее обратно в разъём. Как видно, SD карта подключается через MMC-подсистему. Если включен демон mountd то карточка автоматически смонтируется, при условии, что ее разделы отформатированы в FatFS или Ext2/Ext3/Ext4. Нам этот демон будет пока мешать, поэтому выключим его пока, а смонтированные им разделы - размонтируем.
Запустим fdisk и разобьём карту по своему усмотрению. Я лично сделал так:
root@linkit:~# fdisk -l /dev/mmcblk0 Disk /dev/mmcblk0: 3.7 GiB, 3959422976 bytes, 7733248 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x00000000 Device Boot Start End Sectors Size Id Type /dev/mmcblk0p1 2048 526335 524288 256M 82 Linux swap / Solaris /dev/mmcblk0p2 526336 7733247 7206912 3.4G 83 Linux
Первый раздел я планирую использовать как раздел подкачки, а на втором будет смонтирована файловая система LinkIt™ Smart 7688 Duo.
Форматируем свои разделы:
root@linkit:~# mkswap /dev/mmcblk0p1 Setting up swapspace version 1, size = 268431360 bytes
root@linkit:~# mkfs.ext4 /dev/mmcblk0p2 mke2fs 1.42.12 (29-Aug-2014) Creating filesystem with 900864 4k blocks and 225344 inodes Filesystem UUID: e998c997-43f3-4961-9674-c36bb8da99fe Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736 Allocating group tables: done Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done
Теперь нам нужно сформировать конфиг fstab. В этом нам поможет программа block которую мы только что установили:
root@linkit:~# block detect config 'global' option anon_swap '0' option anon_mount '0' option auto_swap '1' option auto_mount '1' option delay_root '5' option check_fs '0' config 'mount' option target '/mnt/mmcblk0' option uuid 'C563-3BFB' option enabled '0' config 'swap' option device '/dev/mmcblk0p1' option enabled '0' config 'mount' option target '/mnt/mmcblk0p2' option uuid 'e998c997-43f3-4961-9674-c36bb8da99fe' option enabled '0'
Здесь первый раздел нужно будет обозначить как SWAP, а второй должен монтироваться на "/overlay". Т.о. конфиг "/etc/config/fstab" примет следующий вид:
config 'global' option anon_swap '0' option anon_mount '0' option auto_swap '1' option auto_mount '1' option delay_root '5' option check_fs '0' config 'swap' option device '/dev/mmcblk0p1' option enabled '1' config 'mount' option target '/overlay' option uuid 'e998c997-43f3-4961-9674-c36bb8da99fe' option enabled '1'
Здесь красным обозначены поля, которые потребовалось изменить.
Далее нужно скопировать содержимое раздела "/overlay" на нашу карту. Для этого монтируем карточку и переходим на ее:
# mount /dev/mmcblk0p2 /mnt # cd /mnt
Переносим раздел:
# tar -C /overlay -cvf - . | tar -C /mnt -xf -
Проверяем:
# root@linkit:/mnt# ls -l drwx------ 2 root root 16384 Dec 1 08:10 lost+found drwxr-xr-x 9 root root 4096 Dec 1 08:54 upper drwxr-xr-x 3 root root 4096 Dec 1 08:54 work
# df -h Filesystem Size Used Available Use% Mounted on rootfs 10.6M 1.5M 9.2M 14% / /dev/root 20.0M 20.0M 0 100% /rom tmpfs 61.7M 716.0K 61.0M 1% /tmp /dev/mtdblock6 10.6M 1.5M 9.2M 14% /overlay overlayfs:/overlay 10.6M 1.5M 9.2M 14% / tmpfs 512.0K 0 512.0K 0% /dev /dev/mmcblk0p2 3.3G 9.8M 3.1G 0% /mnt
Размонтируем:
root@linkit:/mnt# cd root@linkit:~# umount /mnt
После этого перезагружаем плату LinkIt:
# reboot
После перезагрузки, заново подключаемся по ssh, проверяем:
root@linkit:~# df -h Filesystem Size Used Available Use% Mounted on rootfs 3.3G 9.8M 3.1G 0% / /dev/root 20.0M 20.0M 0 100% /rom tmpfs 61.7M 244.0K 61.4M 0% /tmp /dev/mmcblk0p2 3.3G 9.8M 3.1G 0% /overlay overlayfs:/overlay 3.3G 9.8M 3.1G 0% / tmpfs 512.0K 0 512.0K 0% /dev
Теперь появилось достаточно места для своего софта и сайтов.
Создание непривилегированного пользователя описано в документации OpenWRT на этой странице: Secure your router's access.
Допустим нам нужно создать пользователя flanker, который бы принадлежал бы к группе users. Для этого :
mkdir -p /home/flanker
opkg update opkg install shadow-useradd useradd flanker
flanker:x:1000:1000:users:/home/flanker:/bin/ash
users:x:1000:
passwd flanker
flanker:$1$tj/JJ92k$8g2rKq39VCs9zHJe80Q0m1:17869:0:99999:7:::На этом этапе уже можно пробовать подключиться через ssh под логином нового пользователя.
opkg update
opkg install shadow-su
opkg install sudo
visudoВ простейшем случае нужно будет раскомментировать эти две строки:
# Defaults targetpw # Ask for the password of the target use
# ALL ALL=(ALL) ALL # WARNING: only use this together with 'Defaults targetpw'
Теперь когда мы хотим выполнить какую-нибудь команду из-под непривилегированного пользователя, нам нужно напечатать что-то вроде:
sudo sh -c "/etc/init.d/uhttpd stop"
Для установки пароля на вход по последовательному порту, нужно на файле /etc/inittab, строку:
::askconsole:/bin/ash --loginзаменить на:
::askconsole:/bin/login.sh
На этом этап первоначальной настройки можно считать завершённым.