Скрипт смены региона для GL-MG1300 — GitHub Gist.

Купил дорожный роутер GL.iNet Mango 2 (GL-MG1300), начал настраивать — и обнаружил значок CN в интерфейсе. Оказалась версия для китайского рынка, с региональными ограничениями. При покупке я такого поворота не ожидал.

Пошёл смотреть, как это решают на других роутерах GL.iNet. Нашлись примеры смены страны в заводском разделе factory. Стало понятно, что искать нужно не только в настройках или образе прошивки.

Готовые команды повторять не стал: инструкции были для других моделей, а разметка у них отличается. В factory лежат и заводские данные устройства. Ошибка с адресом записи тут может обойтись дороже самого эксперимента.

Где лежит CN

На моём MG1300 с прошивкой 4.10.1 раздел factory оказался устройством /dev/mtd2, размером 64 КиБ. Снял полную копию и сохранил на компьютер:

dd if=/dev/mtd2 of=/tmp/mg1300-factory-backup.bin bs=65536 count=1

Это команда для моей разметки: перед повторением нужно посмотреть /proc/mtd. И файл из /tmp обязательно забрать с роутера — после перезагрузки он исчезнет.

В первых 256 байтах кода страны не нашлось. Поиск по всему разделу показал отдельное CN по адресу 0x4088:

00004080  00 00 00 00 00 00 00 00  43 4e 00 00 00 00 00 00
                                      C  N

Были и другие совпадения, но внутри длинных строк. Делать «заменить всё» тут точно не стоит.

Как проверил адрес

Две знакомые буквы в дампе — ещё не доказательство. Посмотрел, как прошивка получает страну. В /lib/functions/gl_util.sh нашлось:

get_country_code() {
    uci -q get board_special.hardware.country_code ||
        cat /proc/gl-hw-info/country_code
}

Переопределения в настройках у меня не было. /proc/gl-hw-info/country_code возвращал CN.

А прямое подтверждение нашлось в описании оборудования. Свойство:

/sys/firmware/devicetree/base/gl_hw/factory_data/country_code

содержало два значения, разделённые нулевыми байтами:

factory
0x4088

То есть сама прошивка указывала, из какого раздела и по какому адресу брать страну. После этого уже можно было готовить изменение. Рядом, по адресу 0x4090, находится отдельное поле firmware_type; его я не трогал.

Что поменялось

Подготовил копию раздела с другим кодом страны. Проверил, что отличаются ровно два байта — 0x4088 и 0x4089. Остальные 65 534 байта остались прежними.

Затем записал образ, считал раздел обратно и сравнил целиком. Совпало. После перезагрузки значок CN исчез, нужные мне функции заработали.

По пути посмотрел читаемые скрипты прошивки. В нескольких местах они явно проверяют CN, а все остальные страны идут по общей ветке. Например, так выбирается китайский или международный сервер отправки диагностических логов. Само наличие этого кода не означает постоянную отправку логов: условия её запуска я тогда не проверял.

Это также не доказывает, что любые две буквы включат все возможности международной версии. Часть логики скомпилирована, её я целиком не разбирал.

Скрипт

Чтобы не повторять всё руками, оставил скрипт для GL-MG1300 на GitHub Gist. Запускать его нужно на роутере:

sh mg1300-region.sh             # показать текущий регион
sh mg1300-region.sh --list      # посмотреть возможные коды
sh mg1300-region.sh DE          # проверить замену на DE
sh mg1300-region.sh DE --write  # записать

DE здесь — пример вызова, а не рекомендация выбирать Германию независимо от места использования. Код страны может влиять на каналы и мощность Wi-Fi.

Перед записью скрипт проверяет модель, адрес поля по описанию оборудования и размер раздела. Сохраняет резервную копию, после записи читает весь раздел обратно и сравнивает. Перезагрузка — вручную.

Список потенциальных кодов взят из базы правил Wi-Fi моего роутера. Это не список проверенных способов разблокировки: наличие кода в базе ещё не гарантирует одинаковое поведение всех компонентов прошивки. EU там нет — для Европы используются коды отдельных стран.

Если будете повторять, сначала сохраните свой factory на компьютер. Чужой дамп сюда не подходит. Свой тоже не выкладывайте: внутри есть сертификаты и данные устройства.

Опыт других моделей GL.iNet помог понять, куда смотреть. Но адрес 0x4088 я проверял именно на GL-MG1300 с прошивкой 4.10.1. На другой модели начинать стоит с проверки разметки и способа чтения страны.