Привет, Хабр! Меня зовут Алексей, и я занимаюсь беспроводными технологиями. В последнее время в организацию, в которой я работаю, часто поступают запросы от продавцов на маркетплейсах, которые торгуют китайскими роутерами, — кастомизировать для них прошивку 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, или альтернативные методы кастомизации и клонирования прошивок.