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