Привет, Хабр! Меня зовут Алексей, и я занимаюсь беспроводными технологиями. В последнее время в организацию, в которой я работаю, часто поступают запросы от продавцов на маркетплейсах, которые торгуют китайскими роутерами, — кастомизировать для них прошивку OpenWRT. Ситуация осложняется тем, что для моделей, которые их интересуют, часто нет ImageBuilder, и это заметно затрудняет задачу. Сразу хочу сказать, что организация, в которой я работаю, такие услуги не оказывает, и данная статья не в коем случае не реклама, но раз уж запрос есть, я решил написать небольшой гайд, как модифицировать и собрать прошивку, имея в наличии только роутер с уже установленным OpenWRT и без использования Image Builder.

В чем проблема

Чуть подробнее опишу суть запроса. Сегодня многие продавцы на маркетплейсах покупают китайские роутеры с предустановленной версией OpenWRT и выставляют их на продажу. Но поскольку OpenWRT и Luci ориентированы на продвинутых пользователей, продавцам хотелось бы получить какой-то упрощённый интерфейс настройки, плюс брендинг под свою торговую марку и иногда — сразу предустановленные и настроенные пакеты для расширения функциональности. Главная проблема в том, что у моделей роутеров множество вариаций названий, и они отсутствуют как в списке поддерживаемых устройств на официальном сайте OpenWRT, так и в доступных профилях ImageBuilder. Можно, конечно, создать необходимый профиль — делается это несложно, добавив новые dst-файлы максимально близко к нужной аппаратной базе, — но часто всё упирается в какое-то минимальное отличие от ближайшего аналога, что может стать критичным.

Что на старте

Экспериментировать мы будем со стареньким TP-LINK Archer C7, который использует файловую систему SquashFS. Этот вариант проще и подойдёт для того, чтобы познакомиться с процессом создания образа. Если будет интерес — готов повторить гайд и для UBIFS: там процесс немного сложнее. Обязательное условие: на роутере уже должен быть установлен OpenWRT, и у нас должен быть root-доступ по SSH.

Действуем

Для начала давайте выполним подключение к роутеру по SSH и выполним в терминале

cat /proc/mtd
Вывод cat /proc/mtd
Вывод 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 -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)


  1. thereisnocolor
    17.10.2025 10:38

    Очень интересно было бы послушать про модификацию стоковых прошивок, либо про создание OpenWRT прошивки для не поддерживающегося(неизвестного) официально устройства. Неужели OpenWRT не проверяет никаких контрольных сумм/структур при апгрейде?


    1. GrekNirvana Автор
      17.10.2025 10:38

      Ох хотел сейчас быстро ответить. Но там столько вариантов и развилок в создании прошивок для стоковых устройств. Сначала определяем вообще есть ли поддержка чипсета модели если нет то собрать уже будет крайней сложно, я например не справлюсь. Если есть то смотрим дальше как можно вытащить данные со стока и как потом засунуть обратно, есть ли возможность SSH, TFTP или UART в зависимости от этого действуем дальше. Получаем информацию о железе, создаем DTS файл, создаем профиль и после этого уже можно будет достаточно просто делать прошивку используя опенвертешный ImageBuilder.


    1. GrekNirvana Автор
      17.10.2025 10:38

      И кстати да. Стоковые производители часто подписывают свои прошивки поэтому и тут тоже приходится поплясать с бубном для обхода... В общем тема большая, наверное замахнусь еще на одну статью.


    1. event1
      17.10.2025 10:38

      Неужели OpenWRT не проверяет никаких контрольных сумм/структур при апгрейде?

      Там впереди ядра есть заголовок uImage длиной 64 (вроде) байта. Там crc самого заголовка и ядра. И размер образа. Если всё это не меняется, то заголовок остаётся корректным. Правда, более новые устройства используют другой формат — fit. Там уже так просто склеить не получится


  1. oleg1251
    17.10.2025 10:38

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


    1. GrekNirvana Автор
      17.10.2025 10:38

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


      1. hochbar
        17.10.2025 10:38

        Подождите, что-то я совсем запутался. Зачем продавцам покупать роутер с опенврт и перепрошивать на на опенврт? И зачем покупателям покупать дороже перепрошитый с опенврт на опенврт?

        продавцам хотелось бы получить какой-то упрощённый интерфейс настройки

        А какой кроме люси есть упрощенный интерфейс настройки опенврт?


        1. vikarti
          17.10.2025 10:38

          Зачем продавцам покупать роутер с опенврт и перепрошивать на на опенврт?

          Ну как возможный вариант - существует например GL-inet'овский GL-XE300. Штатная прошивка там на базе OpenWrt но вроде 18-й (при этом до люси еще добраться надо).

          Если хочется последнюю - надо шить нормальную openwrt. Но правда в случае XE300 все проще чем в статье (там нормальная поддержка есть).


        1. GrekNirvana Автор
          17.10.2025 10:38

          У продавца задача кастомизировать OpenWrt под себя. Например, свой логотип разместить на странице настроек роутера, или сразу развернуть какой-то преднастроенный VPN.

          А какой кроме люси есть упрощенный интерфейс настройки опенврт?

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


  1. event1
    17.10.2025 10:38

    По сути, это склейка разделов mtd7 и mtd8 — kernel и rootfs.

    Наоборот, раздел firmware виртуально разделяется на kernel и rootfs. Там в dmesg об этом даже запись есть

    В остальном всё верно, но очень базово. Прежде чем пользоваться этим гайдом надо проверить, есть ли впереди ядра заголовок uImage (начинается с магического числа 0x27051956). Образ может быть в формате FIT (магическое число 0xD00DFEED). Там эти трюки не сработают.


    1. GrekNirvana Автор
      17.10.2025 10:38

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


      1. event1
        17.10.2025 10:38

        И там sysupgrade образ уже так просто не соберешь. По-крайней мере я не знаю как.

        Люди из интернета советуют такое


        1. GrekNirvana Автор
          17.10.2025 10:38

          Ну да. Я как раз так и делал. Сначала монтируешь меняешь что нужно, а потом возвращаешь обратно типа как они советуютubiformat /dev/mtd0 -f image.ubi -O 2048 Но это прошивка отдельного раздела. А хотелось бы получить именно sysupgrade образ для удобства распространения.