Привет Хабр! Меня зовут Алексей и я занимаюсь беспроводными технологиями. Не так давно я рассказывал, как собрать прошивку 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 -j$(nproc) V=s-j$(nproc) использует все доступные процессорные ядра для ускорения сборки
V=s - verbose режим, показывает детальный вывод (полезно для отладки ошибок)
Как я говорил выше, лучше всего начинать этот процесс до обеда, тогда вы успеете выпить утренний кофе, сделать до обеда все настро��ки и, запустив сборку, спокойно пойти обедать. Первая сборка занимает пару часов.
Возможные грабли:
Запускайте процесс от обычного пользователя. Лучше всего от такого который занимается только сборкой образов. Сборка из под пользователя с расширенными правами и уж тем более от рута может задать некорректные права доступа к файлам.
Лично у меня при сборке выяснилось, что некоторые пакеты не могут быть получены из-за каких-то блокировок. Повторный процесс с включенным впном смог решить эту проблему.
Если возникают ошибки, попробуйте однопоточную сборку для более понятного вывода:
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 для нашей модели. Теперь мы можем кастомизировать прошивку добавив нужные пакеты и задав нужные настройки в конфигурационных файлах и быстро получить новый образ. Но это уже обычная рутина.