Привет Хабр! Меня зовут Алексей и я занимаюсь беспроводными технологиями. Не так давно я рассказывал, как собрать прошивку OpenWRT без ImageBuilder. В этой статье мы повысим планку и попробуем собрать и прошивку, и ImageBuilder для модели роутера с частичной поддержкой OpenWRT. Под частичной поддержкой я понимаю то, что для данной конкретной модели роутера поддержки нет, но она есть для платформы. Экспериментировать я буду с реальным устройством - это Wi-Fi 7 роутер, полученный от китайского производителя. Вместе с роутером производитель предоставил нам необходимую документацию и DTS файл. Заранее хочу предупредить, что производитель просил не раскрывать название модели и не тиражировать его DTS файл. Поэтому часть информации на скриншотах я заблюрирую.

Итак, как можно видеть из фотографии, у нас шестиантенный роутер с двумя кнопками WPS и Reset, индикатором зелено-сине-красного цвета и двухъядерным Cortex-A7 с 32-bit архитектурой внутри (если интересно напишите в комментариях и я сделаю подробный обзор данного роутера). Все действия я начинаю с утра (а как еще можно лучше начать утро понедельника :) ), с надеждой в паузах выпить кофе, и уйти на обед когда прошивка начнет собираться.

Первое, что нам понадобится для сборки прошивки и image builder, это какая-то Linux машина. Лично я буду использовать Debian. Для начала установим все необходимые пакеты. Устанавливаются они достаточно быстро, лично мне хватило времени только на то, чтобы дойти до чайника, включить его и вернуться обратно.

sudo apt update

sudo apt install build-essential clang flex bison g++ gawk gcc-multilib g++-multilib gettext git libncurses5-dev libssl-dev python3-distutils rsync unzip zlib1g-dev file wget

Теперь нам нужно будет клонировать репозиторий OpenWRT (по ощущениям этот процесс длился примерно 4 минуты, как раз пока не закипел чайник):

git clone https://git.openwrt.org/openwrt/openwrt.git
cd openwrt
git checkout openwrt-24.10

После клонирования на всякий пожарный случай переключаемся на последнюю ветку.

Тут кстати есть некоторый подводный камень. У меня сразу этот процесс не пошёл и выдавал ошибку. Исправилось просто: нужно было зайти через браузер на сайт OpenWRT и пройти проверку того, что ты не робот. После этого процесс клонирования выполнился без ошибок.

Теперь нам нужно обновить Feeds - коллекцию пакетов для OpenWRT:

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

Далее нам потребуется DTS файл. Как я уже говорил, такой файл мы получили от производителя. Но прежде чем мы начнём с ним работать, давайте разберёмся, что это вообще такое и как его можно получить.

DTS файл (Device Tree Source, дерево устройств) - это текстовый файл, который описывает аппаратную конфигурацию устройства для операционной системы, чаще всего для Linux, особенно в встраиваемых и мобильных системах (например, на базе ARM/ARM64 процессоров).

Самый простой вариант - получить его у производителя.

Если такой возможности нет, но по какой-то причине у вас есть роутер с установленной OpenWRT (например, именно так вам его передал производитель), вы можете попробовать вытащить из роутера скомпилированный dtb файл и потом уже на компьютере с помощью утилиты device-tree-compiler преобразовать его в DTS.

#Вытаскиваем dtb файл с роутера 
cat /sys/firmware/fdt > /tmp/device-tree.dtb 
#Копируем dtb файл на линукc машиyу и получаем из него dts
dtc -I dtb -O dts device-tree.dtb -o device-tree.dts

Если же роутера у вас нет, вы можете найти максимально похожий DTS файл в исходниках OpenWRT и попробовать поработать с ним. Тут в зависимости от везения вы можете наткнуться на такую же (или очень похожую) модель, и тогда в файле вам нужно будет отредактировать только имя модели. В более сложной ситуации придётся подбирать множество параметров, начиная от алиасов портов и заканчивая размерами разделов.

Итак, повторюсь, что у нас DTS файл уже имелся и его потребовалось только разместить в нужном месте. Но конечно же я вытащил и dtb и собрал dts для того чтобы проверить не ошибся ли где-то производитель. Особенно в части размера разделов. Лучше отследить все возможные ошибки сейчас, чтобы потом не возится с восстановлением через UART.

#Создайте резервную копию оригинального файла
cp target/linux/airoha/dts/en7523-econet-en7523-evb.dts target/linux/airoha/dts/en7523-econet-en7523-evb.dts.backup

#Скопируйте ваш DTS файл с правильным именем
cp ~/path/to/WiFi7-router-DST-file-en7552_evb.dts target/linux/airoha/dts/en7552-custom-router.dts

Теперь нужно создать определение устройства в image makefile. OpenWRT использует специальный Makefile для генерации образов прошивок для каждого устройства.

Для своего устройства я добавлю в конец файла target/linux/airoha/image/en7523.mk:

define Device/custom_en7552-router
DEVICE_VENDOR := Custom
DEVICE_MODEL := EN7552 WiFi 7 Router
DEVICE_DTS := en7552-custom-router
DEVICE_DTS_DIR := ../dts
DEVICE_PACKAGES := luci luci-ssl-openssl
IMAGE_SIZE := 40960k
KERNEL := kernel-bin | lzma | fit lzma $(KDIR)/image-$(firstword $(DEVICE_DTS)).dtb
IMAGES := sysupgrade.bin
IMAGE/sysupgrade.bin := append-kernel | pad-to 64k | append-rootfs | pad-rootfs | check-size | append-metadata
endef

TARGET_DEVICES += custom_en7552-router

Расшифровка параметров:

  • DEVICE_VENDOR и DEVICE_MODEL - отображаемое название устройства в menuconfig

  • DEVICE_DTS - имя DTS файла без расширения (должно совпадать с именем файла)

  • DEVICE_DTS_DIR - путь к директории с DTS файлами относительно image/Makefile

  • DEVICE_PACKAGES - список пакетов, которые будут включены в базовый образ: для примера указал luci, luci-ssl-openssl - веб-интерфейс с HTTPS

  • IMAGE_SIZE - максимальный размер образа в килобайтах (40 MB в данном случае)

  • KERNEL - инструкции по созданию образа ядра с использованием FIT формата

  • IMAGE/sysupgrade.bin - команды для создания sysupgrade образа с метаданными

  • TARGET_DEVICES - добавление устройства в список целей сборки

Теперь настроим параметры сборки через текстовый интерфейс:

make menuconfig

Здесь в рамках дружественного интерфейса достаточно просто разобраться. Главное это задать целевую платформу и профиль с тем названием, которые мы указали ранее. В принципе здесь можно сразу создать кастомный образ, указать нужный набор пакетов, отредактировать конфигурационные файлы и так далее. Но я советую собрать минимально чистый образ и создать image builder, тогда последующие сборки вы сможете делать с помощью image builder за считаные минуты.

Теперь мы готовы к запуску сборки. Но сначала проверим, что всё корректно, выполнив:

make defconfig

И запускаем:

make -j$(nproc) V=s

-j$(nproc) использует все доступные процессорные ядра для ускорения сборки

V=s - verbose режим, показывает детальный вывод (полезно для отладки ошибок)

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

Возможные грабли:

  1. Запускайте процесс от обычного пользователя. Лучше всего от такого который занимается только сборкой образов. Сборка из под пользователя с расширенными правами и уж тем более от рута может задать некорректные права доступа к файлам.

  2. Лично у меня при сборке выяснилось, что некоторые пакеты не могут быть получены из-за каких-то блокировок. Повторный процесс с включенным впном смог решить эту проблему.

  3. Если возникают ошибки, попробуйте однопоточную сборку для более понятного вывода: make -j1 V=s

Если всё пройдёт нормально, то после ожидания, выполнив:

ls -lh bin/targets/airoha/en7523/

а именно здесь будут находиться готовые образы, вы увидите следующие файлы:

  • openwrt-23.05.x-airoha-en7523-custom_en7552-router-squashfs-sysupgrade.bin - образ для обновления через sysupgrade

  • openwrt-23.05.x-airoha-en7523-custom_en7552-router-squashfs-factory.bin - образ для первичной прошивки (если поддерживается)

Работать с этими образами мы не будем. Главное что сборка прошла успешно и у нас появился Image Builder для нашей модели. Теперь мы можем кастомизировать прошивку добавив нужные пакеты и задав нужные настройки в конфигурационных файлах и быстро получить новый образ. Но это уже обычная рутина.

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