Наш магазин на eBay Наш магазин на AliExpress Наш канал в telegram

Микрокомпьютер Omega2. Часть 9. Сборка альтернативной прошивки на базе OpenWRT

Введение

Сегодня я расскажу о том, как собрать альтернативную прошивку для микрокомпьютера Omega2. Зачем это нужно? Ну, во-первых, оригинальная прошивка сделана на базе уже устаревшей версии LEDE OpenWRT, а значит там могут быть ошибки, которые в новых версиях уже пофиксили. Во-вторых, возможности OpenWRT постоянно растут (это ж «open source» — куча людей работает), а размер памяти омеги ограничен, поэтому рано или поздно вы наверняка столкнётесь с необходимостью делать прошивки под конкретные задачи. Да и вообще, настоящий джедай обязательно должен уметь собирать свои прошивки.

Подготовительный этап

Что нам понадобится?

1. Linux. Любой. Можно в виртуалке. Я использую 64-битную десктопную Ubuntu 18.04 LTS (Bionic Beaver) под VMware 10.

2. Подключение к интернету (чтобы скачивать пакеты, исходники и прочее).

3. Установить на ваш Linux следующие пакеты:

  • build-essential — пакет, содержащий список необходимых разработчику пакетов. Вместе с ним по зависимостям поставятся всякие development tools, компиляторы C, C++ и прочие нужные вещи.
  • subversion, git-core — пакеты для установки соответствующих систем контроля версий (для доступа к разным дополнительным репозитория и пакетам)
  • libncurses5-dev — набор разработчика для создания текстовых интерфейсов (красивые менюшки в терминале псевдографикой рисовать)
  • zlib1g-dev — библиотека алгоритмов сжатия (чтобы собирать приложения использующие gzip, pkzip)
  • gawk — утилита для анализа и работы с текстовой информацией (программируемый фильтр)
  • gcc-multilib — библиотека gcc, необходимая для кросскомпиляции (мы будем собирать на x86 машине проект для MIPS)
  • flex — генератор лексических анализаторов (эта штука может сама по заданным правилам Си-шный код составить)
  • libssl-dev — библиотека разработчика для ssl

Перед тем как устанавливать перечисленные выше пакеты лучше обновить списки пакетов и их зависимостей (это гарантирует, что будут установлены самые новые пакеты), а также обновить уже установленные в системе пакеты. Для этого нужно выполнить в командной строке следующие команды:

Как открыть командную строку для ввода команд

Запустить командную строку можно щёлкнув правой кнопкой и выбрав пункт Open Terminal. Если открывали терминал прямо с рабочего стола (щёлкали по рабочему столу) — окажетесь в папке Home->UserName, если открывали из какой-либо папки — в ней и останетесь. Можно открыть сразу несколько терминалов (иногда удобно).

[свернуть]
sudo apt-get update
sudo apt-get dist-upgrade

Все пакеты можно ставить одной командой, просто перечисляя всё через пробел:

sudo apt-get install build-essential subversion libncurses5-dev zlib1g-dev gawk gcc-multilib flex git-core gettext libssl-dev

В принципе Linux довольно дружелюбен и если ему потом чего-то не хватит (каких-то пакетов), он это или сам поставит, или хотя бы напишет, что ему чего-то не хватает (по крайней мере в синий экран точно не упадёт).

Теперь нужно скачать исходники OpenWRT. Переходим в папку, в которую их нужно скачать, и выполняем из командной строки команду:

git clone https://github.com/openwrt/openwrt.git
Если хотите собрать родную прошивку

Вот здесь можно скачать исходники родной прошивки от Onion:

git clone https://github.com/OnionIoT/source.git

Как я уже говорил, родная прошивка сделана на базе устаревшей версии LEDE OpenWRT, зато там можно подсмотреть оригинальный состав пакетов, конфигурации, настройки и так далее. Я качал оба варианта исходников (только обязательно качайте их в разные папки).

Замечание. Родная прошивка отказывается собираться пока папку tools/f2fsprogs не заменишь на аналогичную из последних исходников OpenWRT, — там похоже что-то обновилось настолько, что теперь старые версии вообще не собираются. Интересно, как с этим справляются в Onion, собирают на старом Linux со старыми пакетами?

[свернуть]
Скачивание исходников в виде zip-архива

Если не хотите пользоваться командной строкой (хотя всё равно придётся) — можно просто зайти через браузер на github.com (по одному из указанных выше адресов), скачать исходники в виде zip-архива и потом распаковать их в свою домашнюю папку.

скачивание исходников OpenWRT в виде zip-архива

[свернуть]

Алгоритм сборки

Первым делом нужно обновить и скачать фиды (коллекции исходников разных пакетов и предварительно сконфигуренные «рецепты» по их сборке), чтобы далее выбранные пакеты можно было собрать и включить в свою прошивку. Для этого переходим в папку со скачанными исходниками OpenWRT и выполняем в командной строке следующие команды:

./scripts/feeds update -a
./scripts/feeds install -a

Подробности по поводу фидов можно прочитать здесь — https://openwrt.org/docs/guide-developer/feeds

Далее нужно сконфигурировать исходники под наше «железо». Для этого выполняем команду:

make menuconfig
Для общего развития

1. Можно обойтись и без основанного на ncurses конфигуратора, выполнив просто make config. Обязательно сделайте так, чтобы понять в чём разница. Вопросы будут просто следовать один за другим, без возможности вернуться к предыдущим до тех пор, пока все они не кончатся. Одним словом жесть, как она есть.

2. Существуют и другие конфигураторы, облегчающие процесс конфигурирования. Например, основанный на том же ncurses nconfig, основанный на qt4 xconfig (для него нужен пакет dev-qt/qtgui), основанный на GTK+ gconfig (нужны пакеты x11-libs/gtk+, dev-libs/glib, gnome-base/libglade) и другие.

[свернуть]

В результате появится нарисованный псевдографикой конфигуратор в виде меню (вот для него-то мы и ставили ncurses), в котором нужно выставить следующие настройки:

  • Target System (Mediatek Ralink MIPS) — выбираем архитектуру ядра микроконтроллера на базе которого сделана омега
  • Subtarget (MT76x8 based boards) — выбираем семейство, в которое входит микроконтроллер модуля Omega2
  • Target Profile (Onion Omega2) — выбираем конкретное устройство
Картинка с менюшкой

Вот так это должно выглядеть:

меню конфигурирования, первичная настройка

Замечание. Если хотите собрать сразу две прошивки (под Omega2 и под Omega2+), то нужно выбрать Target Profile (Multiple Devices) и в появившемся дополнительном пункте меню Target Devices отметить Omega2 и Omega2+. Только учтите, что две будут собираться дольше, чем одна, а это и так очень небыстрый процесс.

[свернуть]

Сохраняем установленную конфигурацию ( < Save > ) и выходим ( < Exit > ).

Теперь нужно выполнить в командной строке команду:

make defconfig

Эта команда просмотрит весь проект, отследит все новые зависимости и создаст новый конфигурационный файл с настройками по умолчанию.

В принципе, здесь уже можно было бы переходить к добавлению в прошивку нужных пакетов и к сборке прошивки, но сначала давайте соберём необходимые для сборки инструменты. Они тоже входят в состав исходников. Да, да, — в исходниках есть не только инструкция по сборке дома, и инструкция по сборке кирпичей для этого дома, но и инструкция по сборке кирпичного завода для производства кирпичей для сборки дома. Инструменты собираются один раз и при последующих сборках заново не пересобираются (без специальных манипуляций), так что их вполне можно собрать заранее. Итак, выполняем команды:

make tools/install
make toolchain/install

После того как инструменты собраны — можно переходить к кастомизации. Кастомизация — это процесс, в ходе которого вы выбираете какие пакеты будут включены в прошивку. Снова заходим в меню настройки:

make menuconfig

Ну и всё — дальше нужно долго и упорно пересматривать все пакеты, думать, какие из них вам понадобятся в итоговой прошивке, и отмечать нужные пакеты в менюшке. Пакетов очень много и они разделены по группам. Нас интересуют группы начиная с Base system и до самого низа (в настоящий момент это группа Xorg).

Группы пакетов и важный совет по облегчению кастомизации

меню конфигурирования, кастомизация

Внутри этих групп тоже полно разных групп, так что это развлекуха надолго. Для ускорения и облегчения процесса дам один совет. Если присмотреться к меню, то видно, что сверху расположены группы базовых системных пакетов и пакетов, относящихся к ядру, а внизу — группы прикладных пакетов. Так вот, кастомизацию нужно проводить снизу вверх, то есть начинать с выбора прикладных пакетов (и ими же лучше закончить) и от них двигаться к системным (в которые без особой необходимости вообще лучше не лезть).

Почему не нужно просто так лезть в системные пакеты? Очень просто. Их установка влияет на всю систему, однако использование совсем не очевидно. Обычно пользователи не работают с ними напрямую, эти пакеты используются для обеспечения работы прикладных пакетов. Но фишка в том, что Linux сам знает, какие системные пакеты нужны для работы того или иного прикладного пакета (через зависимости), поэтому когда вы выбираете в меню какой-нибудь прикладной пакет, чтобы включить его в вашу прошивку, Linux проверяет зависимости этого пакета и при необходимости сам включает в сборку нужные системные пакеты.

[свернуть]

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

Что означают символы перед именем пакета в меню

  • [ ], [*] — пакет, отмеченный квадратными скобками, может быть включен в сборку или выключен из неё. Звёздочка означает что пакет включен.
  • < >, <*>, — пакет, отмеченный треугольными скобками, может быть включен в сборку, выключен из неё или добавлен в неё как модуль. Добавление в качестве модуля означает, что пакет будет скомпилирован и добавлен в сборку, но не будет активен до того момента, пока его не установят. Плюс в том, что для установки таких пакетов их не нужно откуда-то скачивать или копировать, поскольку они уже содержатся в сборке, только в неактивном виде (соответственно, для установки таких пакетов не нужен интернет и внешние репозитории). Есть и минус — пакет занимает столько же места, как если бы он был сразу активен.
  • {*}, {M} — пакет с фигурными скобками не может быть выключен. Так отмечаются пакеты, добавленные по зависимостям от модулей. То есть отмеченные фигурными скобками пакеты нужны другим пакетам (добавленным как модули), поэтому они могут быть активированы либо сразу, либо в момент активации зависящих от них пакетов, но в сборке они должны присутствовать в любом случае.
  • -*- — пакет, отмеченный дефисами включен по зависимости и этот выбор нельзя изменить (пока из сборки не будет выключен пакет, работа которого зависит от отмеченного дефисами пакета).

[свернуть]

Кроме того, пакеты могут иметь дополнительные отметки в конце строки.

Дополнительные отметки пакетов

  • [NEW] — пакет новый и может иметь проблемы
  • [EXPERIMENTAL] — пакет экспериментальный и почти наверняка имеет проблемы
  • [DEPRECATED] — пакет устарел и не рекомендован к использованию (хотя ещё не вышел из употребления)
  • [OBSOLETE] — пакет устарел и давно не используется (так что скорее всего вообще не заработает)

[свернуть]

После того как все необходимые пакеты выбраны, можно переходить к сборке прошивки. Для этого выполняем в командной строке:

make -jN

N — число ядер вашего процессора + 1

Можно, кстати, не заморачиваться и написать просто make, но так будет дольше.

Ещё можно написать:

make -j1 V=s

В этом случае тоже всё будет медленно, но вы увидите много разной дополнительной информации о процессе сборки, в том числе разные ошибки (так что это вариант скорее для отладки, если что-то пошло не так).

После окончания процесса сборки готовую прошивку в виде бинарника можно будет найти в папке bin/targets/ramips/mt76x8.

Дополнительная информация

Для очистки каталогов bin и build_dir нужно выполнить команду make clean. Команда make dirclean дополнительно очистит каталоги staging_dir и toolchain. Ну и, наконец, make distclean удалит вообще всё, что вы насобирали и настроили, а так же скачанные из репозитория исходные коды.

Помимо готовой прошивки в папке bin/targets/ramips/mt76x8 можно найти файл config.buildinfo. Это, так называемый, дифконфиг (diffconfig) — файл, в котором записаны отличия в составе пакетов собранной вами прошивки от прошивки по-умолчанию (то есть, грубо говоря, там указано, какие дополнительные пакеты вы включили в прошивку или выключили из неё).

Что с этим файлом можно делать?

Ну, во-первых, можно визуально посмотреть имена добавленных пакетов, после чего найти и отметить те же пакеты в какой-то другой сборке (скажем на другой машине). Для того, чтобы найти место расположения нужных пакетов в меню (которое появляется после make menuconfig) — достаточно воспользоваться поиском, который вызывается нажатием клавиши «.» (слева от правого шифта). После этого просто наберите в появившейся строке поиска имя нужного пакета и нажмите Enter.

Второй вариант, — вы просто переименовываете config.buildinfo в .config и заменяете этим файлом тот, что лежит в корне папки с исходниками OpenWRT (он, кстати, скрытый, чтобы его увидеть — нужно нажать Ctrl+H), после чего выполняете make defconfig. Далее утилита make сама всё сделает и сформирует новый файл .config, в котором будут включены все нужные пакеты (из дифконфига, который мы ей подсунули в виде .config).

Для последнего варианта лучше перед выполнением make defconfig также выполнить пересборку инструментов (tools и toolchain).

Если у вас есть в наличии два разных файла config.buildinfo — вы можете сравнить набор отмеченных в них пакетов линуксовой утилитой diff. Просто напишите в терминале:

diff -u путь_к_первому_файлу/имя_файла_1 путь_ко_второму_файлу/имя_файла_2>путь_к_файлу_с_отличиями/dif_file

— в результате все отличия между двумя исходными файлами будут записаны в файле dif_file

Как включить поддержку sd-карты на обычной Omega2 (не плюс)

Как говорится, — по многочисленным просьбам трудящихся, решил раскрыть в отдельном подпункте эту животрепещущую тему. Всё, что нужно сделать — это немного поправить исходники:

  • переходим в папку с исходниками openwrt и далее в
    /target/linux/ramips/image
  • открываем файл mt76x8.mk и находим в нём строку
    define Device/onion_omega2

    Ниже описана разная информация о девайсе: максимальный размер образа, вендор и, что важно! — модули ядра, которые нужно обязательно вкомпилить в прошивку для этого девайса

  • в строку DEVICE_PACKAGES через пробел дописываем модуль kmod-sdhci-mt7620 и сохраняем файл. Должно получиться вот так:
    DEVICE_PACKAGES:= kmod-usb2 kmod-usb-ohci uboot-envtools kmod-sdhci-mt7620

    Если посмотреть строки ниже, то видно, что следующее устройство в списке — это как раз Omega2+ и единственное её отличие в составе обязательных модулей от простой омеги заключается в том, что в списке для простой омеги отсутствует модуль kmod-sdhci-mt7620. Гугленье в интернете сразу сообщит нам, что этот модуль отвечает как раз за поддержку sd-карты.

  • чтобы изменения вступили в силу — нужно стереть .config, выполнить make defconfig и заново выбрать все нужные пакеты (поэтому патчить лучше сразу после скачивания исходников)

Post scriptum

На радость РКН выкладываю прошивку для запуска Telegram-ботов на микрокомпьютере Omega2:
openwrt-ramips-mt76x8-omega2-squashfs-sysupgrade

Прежде чем прошиваться не забудьте извлечь бинарник из архива. Если будете прошиваться с флешки — не забудьте переименовать бинарник в omega2.bin (автоматически с флешки принимаются прошивки только с таким именем).

Состав прошивки:

  • Web-интерфейс LuCI на базе web-сервера uhttp (не из консоли же всё настраивать, бр-р)
  • PHP7 с пакетами php7-cgi, php7-fastcgi, php7-mod-curl, php7-mod-hash, php7-mod-iconv, php7-mod-json, php7-mod-mysqli, php7-mod-mysqlnd, php7-mod-openssl, php7-mod-sockets, php7-mod-xml (в общем всё, что нужно для Telegram-бота)
  • Поддержка флеш памяти (USB-storage)
  • Файловый менеджер Midnight Commander

Как сделать telegram-бота, работающего через поллинги (чтобы его можно было запустить на домашнем компьютере, хм, ну или микрокомпьютере), можно почитать вот здесь

Кроме изложенного выше, информацию о сборке, альтернативные прошивки и прочее можно найти на нашем форуме, вот в этой теме. Если возникнут вопросы — задавайте там же, на форуме, или прямо под этой статьёй, в комментариях.

Так же обязательно посмотрите информацию о параллельном проекте SKW92 от Skylab на том же самом чипе

На этом на сегодня всё, удачи. Больше прошивок — хороших и разных.

Кстати, в нашем магазине можно купить микрокомпьютер Omega2 по очень привлекательной цене.

  1. Часть 1. Первое знакомство
  2. Часть 2. Использование GPIO
  3. Часть 3. Док-плата
  4. Часть 4. Работа с файлами
  5. Часть 5. Работа с USB flash-дисками
  6. Часть 6. Установка, настройка и использование php для интерактивного взаимодействия
  7. Часть 7. Выполнение задач по расписанию с помощью планировщика Cron
  8. Часть 8. Подключаем проводной Ethernet
  9. Часть 9. Сборка альтернативной прошивки на базе OpenWRT

Добавить комментарий