Привет, Хабр! Меня зовут Алексей, и я занимаюсь беспроводными технологиями. В последнее время в организацию, в которой я работаю, часто поступают запросы от продавцов на маркетплейсах, которые торгуют китайскими роутерами, — кастомизировать для них прошивку OpenWRT. Ситуация осложняется тем, что для моделей, которые их интересуют, часто нет ImageBuilder, и это заметно затрудняет задачу. Сразу хочу сказать, что организация, в которой я работаю, такие услуги не оказывает, и данная статья не в коем случае не реклама, но раз уж запрос есть, я решил написать небольшой гайд, как модифицировать и собрать прошивку, имея в наличии только роутер с уже установленным OpenWRT и без использования Image Builder.
В чем проблема
Чуть подробнее опишу суть запроса. Сегодня многие продавцы на маркетплейсах покупают китайские роутеры с предустановленной версией OpenWRT и выставляют их на продажу. Но поскольку OpenWRT и Luci ориентированы на продвинутых пользователей, продавцам хотелось бы получить какой-то упрощённый интерфейс настройки, плюс брендинг под свою торговую марку и иногда — сразу предустановленные и настроенные пакеты для расширения функциональности. Главная проблема в том, что у моделей роутеров множество вариаций названий, и они отсутствуют как в списке поддерживаемых устройств на официальном сайте OpenWRT, так и в доступных профилях ImageBuilder. Можно, конечно, создать необходимый профиль — делается это несложно, добавив новые dst-файлы максимально близко к нужной аппаратной базе, — но часто всё упирается в какое-то минимальное отличие от ближайшего аналога, что может стать критичным.
Что на старте
Экспериментировать мы будем со стареньким TP-LINK Archer C7, который использует файловую систему SquashFS. Этот вариант проще и подойдёт для того, чтобы познакомиться с процессом создания образа. Если будет интерес — готов повторить гайд и для UBIFS: там процесс немного сложнее. Обязательное условие: на роутере уже должен быть установлен OpenWRT, и у нас должен быть root-доступ по SSH.
Действуем
Для начала давайте выполним подключение к роутеру по SSH и выполним в терминале
cat /proc/mtd

Основной раздел, который нас будет интересовать — это mtd6, который называется firmware.
По сути, это склейка разделов mtd7 и mtd8 — kernel и rootfs. Именно они понадобятся для создания будущего sysupgrade-образа:
# Создаем дампы ключевых разделов
dd if=/dev/mtd7 of=/tmp/kernel.bin bs=64k
dd if=/dev/mtd8 of=/tmp/rootfs.bin bs=64k
# Опционально — дамп полного раздела firmware (содержит kernel + rootfs)
dd if=/dev/mtd6 of=/tmp/firmware_full.bin bs=64k

Далее копируем полученные данные на компьютер. Удобнее всего использовать Linux-машину (конкретно у меня Debian). Понадобятся:
squashfs-tools(утилитыunsquashfsиmksquashfsдля работы с SquashFS),binwalk(анализ и извлечение данных из прошивок),ssh,scp(подключение и копирование если вдруг еще нет),dd(создание точных копий разделов).
Установка:
sudo apt update
sudo apt install squashfs-tools binwalk ssh scp dd coreutils
Теперь есть два варианта: воспользоваться утилитами Firmware Mod Kit или сделать всё вручную.
Firmware Mod Kit — набор открытых инструментов для извлечения, модификации и упаковки образов прошивок из встраиваемых устройств, особенно на базе Linux-роутеров, использующих форматы TRX/uImage и файловые системы SquashFS или CramFS. Он автоматизирует процесс деконструкции прошивки, позволяя редактировать файлы (например, веб-интерфейсы и конфиги) без перекомпиляции исходного кода, и особенно полезен для кастомных прошивок OpenWRT.
Мы же разберём ручной способ, чтобы лучше понять весь процесс. По сути, Firmware Mod Kit просто автоматизирует те действия, о которых пойдёт речь ниже.
Проанализируем дампы через binwalk:

binwalk -B rootfs.binПовторяем для всех дампов — убеждаемся, что они имеют корректные разделы и не содержат ошибок.
Далее с помощью binwalk извлекаем содержимое:
binwalk -e rootfs.bin
Это создаст папку _rootfs.bin.extracted/ с извлечённым содержимым.
Если не сработало, извлекаем вручную:
unsquashfs -d rootfs_extracted -f rootfs.bin
Параметры:
-d rootfs_extracted— папка для распаковки-f— принудительно перезаписать существующие файлы
Теперь можем вносить изменения — добавлять, удалять или модифицировать файлы в rootfs_extracted.
После всех изменений собираем обратно в SquashFS:
mksquashfs rootfs_extracted rootfs_new.bin -comp xz -all-root
Параметры:
rootfs_extracted— папка с изменённой файловой системойrootfs_new.bin— итоговый образ-comp xz— сжатие XZ-all-root— все файлы принадлежат root:root
Важно! Новый образ не должен быть больше исходного. Если размер превышает исходный — удалите ненужные файлы.
Теперь склеиваем kernel и rootfs. Собственно мы могли бы работать сразуи с firmware но тогда нам потребовалось бы филигранно заменить в нем rootfs. Поэтому мы просто склеим два образа.:
cat kernel.bin rootfs_new.bin > openwrt-sysupgrade.bin
В принципе это рабочий вариант. Но полученный образ должен быть такого же размера, как и раздел firmware. Обычно он получится меньше (rootfs_new.bin меньше оригинала). Недостающий размер можно добрать "паддингом" — пустыми данными:
# Определяем размер исходного раздела firmware
FIRMWARE_SIZE=16777216 # 16 MB (0x1000000)
# Узнаем размер текущего sysupgrade-образа
CURRENT_SIZE=$(stat -c%s openwrt-sysupgrade.bin)
# Вычисляем количество байт для заполнения
PADDING_SIZE=$((FIRMWARE_SIZE - CURRENT_SIZE))
# Добавляем padding (0xFF — стандарт для flash-памяти)
dd if=/dev/zero bs=1 count=$PADDING_SIZE | tr '\000' '\377' >> openwrt-sysupgrade.bin
Образ готов. Остаётся залить его на роутер и выполнить:
sysupgrade -Fn /tmp/openwrt-sysupgrade.bin
-F— принудить обновление-n— не сохранять настройки
Можно предварительно проверить образ с флагом -T.
Буду рад если вы расскажете в комментариях другие способы модификации sysupgrade образа, если нет готового ImageBuilder, или альтернативные методы кастомизации и клонирования прошивок.
Комментарии (13)

oleg1251
17.10.2025 10:38Что-то я не соображу. Если прошивки OpenWrt для этих роутеров нет как тогда поставили OpenWrt. Вы же берете роутер с уже установленным OpenWrt, правильно?

GrekNirvana Автор
17.10.2025 10:38Все правильно. Производители используют OpenWrt и поставляют роутеры именно с этой операционкой но часто не спешат делать вклад в сообщество и публиковать прошивки или dst. Для них, зная какое железо используется, для популярных чипсетов, нет проблем собрать прошивку.

hochbar
17.10.2025 10:38Подождите, что-то я совсем запутался. Зачем продавцам покупать роутер с опенврт и перепрошивать на на опенврт? И зачем покупателям покупать дороже перепрошитый с опенврт на опенврт?
продавцам хотелось бы получить какой-то упрощённый интерфейс настройкиА какой кроме люси есть упрощенный интерфейс настройки опенврт?

vikarti
17.10.2025 10:38Зачем продавцам покупать роутер с опенврт и перепрошивать на на опенврт?
Ну как возможный вариант - существует например GL-inet'овский GL-XE300. Штатная прошивка там на базе OpenWrt но вроде 18-й (при этом до люси еще добраться надо).
Если хочется последнюю - надо шить нормальную openwrt. Но правда в случае XE300 все проще чем в статье (там нормальная поддержка есть).

GrekNirvana Автор
17.10.2025 10:38У продавца задача кастомизировать OpenWrt под себя. Например, свой логотип разместить на странице настроек роутера, или сразу развернуть какой-то преднастроенный VPN.
А какой кроме люси есть упрощенный интерфейс настройки опенврт?
На таких роутерах встречается много самописных. Они с минимальной функциональностью но достаточно простые. По сути предлагают только интерфейс создания беспроводных сетей. Но наверное это как раз то что нужно широкой аудитории неподготовленных пользователей.

event1
17.10.2025 10:38По сути, это склейка разделов mtd7 и mtd8 — kernel и rootfs.
Наоборот, раздел firmware виртуально разделяется на kernel и rootfs. Там в dmesg об этом даже запись есть
В остальном всё верно, но очень базово. Прежде чем пользоваться этим гайдом надо проверить, есть ли впереди ядра заголовок uImage (начинается с магического числа 0x27051956). Образ может быть в формате FIT (магическое число 0xD00DFEED). Там эти трюки не сработают.

GrekNirvana Автор
17.10.2025 10:38Там и помимо этого еще может быть куча нюансов. Например, предложенный способ не подойдет для файловой системы UBIFS, а сейчас в новых китайский роутерах часто она используется. Проблема обозначится в момент анализа binwalk'ом И там sysupgrade образ уже так просто не соберешь. По-крайней мере я не знаю как. Когда было нужно просто ubi раздел перезаписывал.

event1
17.10.2025 10:38И там sysupgrade образ уже так просто не соберешь. По-крайней мере я не знаю как.Люди из интернета советуют такое

GrekNirvana Автор
17.10.2025 10:38Ну да. Я как раз так и делал. Сначала монтируешь меняешь что нужно, а потом возвращаешь обратно типа как они советуют
ubiformat /dev/mtd0 -f image.ubi -O 2048Но это прошивка отдельного раздела. А хотелось бы получить именно sysupgrade образ для удобства распространения.
thereisnocolor
Очень интересно было бы послушать про модификацию стоковых прошивок, либо про создание OpenWRT прошивки для не поддерживающегося(неизвестного) официально устройства. Неужели OpenWRT не проверяет никаких контрольных сумм/структур при апгрейде?
GrekNirvana Автор
Ох хотел сейчас быстро ответить. Но там столько вариантов и развилок в создании прошивок для стоковых устройств. Сначала определяем вообще есть ли поддержка чипсета модели если нет то собрать уже будет крайней сложно, я например не справлюсь. Если есть то смотрим дальше как можно вытащить данные со стока и как потом засунуть обратно, есть ли возможность SSH, TFTP или UART в зависимости от этого действуем дальше. Получаем информацию о железе, создаем DTS файл, создаем профиль и после этого уже можно будет достаточно просто делать прошивку используя опенвертешный ImageBuilder.
GrekNirvana Автор
И кстати да. Стоковые производители часто подписывают свои прошивки поэтому и тут тоже приходится поплясать с бубном для обхода... В общем тема большая, наверное замахнусь еще на одну статью.
event1
Там впереди ядра есть заголовок uImage длиной 64 (вроде) байта. Там crc самого заголовка и ядра. И размер образа. Если всё это не меняется, то заголовок остаётся корректным. Правда, более новые устройства используют другой формат — fit. Там уже так просто склеить не получится