Команда cat /proc/mtd выводит таблицу разделов MTD-флеш-памяти устройства — и именно её нужно выполнить первой, прежде чем прошивать роутер, делать бэкап раздела art или caldata либо восстанавливать загрузчик. Без точного знания номеров и смещений разделов любая операция записи через mtd write превращается в лотерею с риском получить «кирпич».
Файл /proc/mtd — это не обычный файл на диске, а виртуальный интерфейс ядра Linux, который генерируется «на лету» подсистемой MTD (Memory Technology Devices). Он присутствует на роутерах, IP-камерах, ТВ-приставках и других embedded-устройствах с NAND- или NOR-флешем, где OpenWrt, Padavan, DD-WRT или стоковая прошивка описывают разметку памяти через device tree или параметры загрузчика.
Что такое MTD и зачем нужен /proc/mtd
MTD — подсистема ядра Linux для работы с «сырой» флеш-памятью, которая не имеет контроллера с трансляцией блоков, в отличие от eMMC или SSD. Флеш делится на стираемые блоки (erase blocks), и поверх этой физической структуры накладывается логическая разметка на разделы: загрузчик, ядро, корневая файловая система, область настроек, калибровочные данные Wi-Fi.
Ядро узнаёт разметку из device tree, из аргументов командной строки загрузчика (например, mtdparts=) или из таблицы разделов, зашитой в саму прошивку. Всё это агрегируется в /proc/mtd, и вам не нужно разбирать бинарные структуры вручную — достаточно одной команды в терминале.
Типичные разделы, которые вы увидите на роутере: u-boot (загрузчик), kernel или firmware (ядро и rootfs), rootfs_data (перезаписываемая область), art / factory / eeprom (калибровки радиомодуля и MAC-адреса). Имена зависят от производителя и прошивки — универсального списка не существует.
Как выполнить команду и прочитать вывод
Подключитесь к устройству по SSH (на OpenWrt это обычно ssh root@192.168.1.1, адрес зависит от вашей конфигурации) или через последовательный UART-консольный порт. Затем выполните:
cat /proc/mtd
Вывод будет примерно таким (конкретные размеры и имена зависят от устройства):
dev: size erasesize name
mtd0: 00040000 00010000 "u-boot"
mtd1: 00010000 00010000 "u-boot-env"
mtd2: 00f90000 00010000 "firmware"
mtd3: 00010000 00010000 "art"
Разберём столбцы. Первый — имя устройства mtdN, именно его вы будете указывать в командах чтения и записи. Второй — размер раздела в шестнадцатеричном виде в байтах. Третий — размер стираемого блока, тоже в hex. Четвёртый — текстовое имя раздела, заданное в разметке.
Перевод шестнадцатеричных размеров в понятные значения
Размеры в выводе указаны в hex, что поначалу сбивает с толку. Например, 00040000 в hex — это 262144 байта, то есть 256 КБ. Для быстрого пересчёта прямо на устройстве используйте printf или awk:
printf '%d\n' 0x00040000
Ниже — таблица типичных значений, которые часто встречаются в разметке флеш-памяти embedded-устройств. Это ориентиры для чтения вывода, а не нормы для конкретной модели:
| Hex-значение | Байт | Человекочитаемый размер | Типичное назначение |
|---|---|---|---|
| 0x00010000 | 65536 | 64 КБ | Мелкие разделы: env, art, config |
| 0x00040000 | 262144 | 256 КБ | Загрузчик u-boot |
| 0x00200000 | 2097152 | 2 МБ | Ядро Linux |
| 0x00f90000 | 16318464 | ~15,6 МБ | Раздел firmware целиком |
| 0x01000000 | 16777216 | 16 МБ | Полный объём флеша |
Размер стираемого блока (erasesize) важен при ручной записи: образ должен быть выровнен по границе erase-блока, иначе утилита записи откажется работать или запишет данные некорректно. Для NOR-флеша типичен блок 64 КБ, для NAND значения могут отличаться — сверяйтесь с выводом именно вашего устройства.
Практическое применение: бэкап разделов
Самая частая причина заглянуть в /proc/mtd — сделать резервную копию перед прошивкой. Критически важен раздел с калибровками радиомодуля (art, factory или eeprom): без родного раздела калибровок Wi-Fi на устройстве может перестать работать или потерять корректные MAC-адреса, и восстановить его без бэкапа будет крайне сложно.
Дамп делается командой dd с указанием блочного устройства раздела. Обратите внимание: для чтения используется /dev/mtdblockN, а не символьное устройство:
dd if=/dev/mtdblock3 of=/tmp/art_backup.bin
Затем файл нужно скопировать с устройства на компьютер, например через scp. Хранить бэкап только в /tmp на самом роутере бессмысленно — это оперативная память, она очистится при перезагрузке.
☑️ Безопасный бэкап перед прошивкой
Запись в раздел: команда mtd и её риски
На OpenWrt и ряде других прошивок для записи используется утилита mtd. Общий синтаксис записи образа в раздел выглядит так:
mtd write /tmp/firmware.bin firmware
Утилита принимает как имя раздела, так и его номер. Перед записью она стирает соответствующие блоки, поэтому ошибка в имени или номере означает затёртый чужой раздел. Особенно опасна запись в раздел загрузчика: повреждённый u-boot не позволит устройству даже начать загрузку, и восстановление потребует UART-адаптера, а иногда и программатора с выпаиванием чипа.
⚠️ Внимание: никогда не записывайте образ в раздел, не убедившись по свежему выводуcat /proc/mtd, что номер и имя соответствуют цели. Разметка может меняться между версиями прошивки — скопированная из чужой инструкции командаmtd writeспособна затереть загрузчик.
⚠️ Внимание: прерывание записи или стирания (отключение питания, обрыв SSH во время длительной операции) оставляет раздел в недозаписанном состоянии. Выполняйте прошивку при стабильном питании и желательно с подключением по кабелю, а не по Wi-Fi.
Некоторые разделы ядро помечает как read-only — чаще всего это загрузчик и калибровки. Попытка записи в них вернёт ошибку, и это защитный механизм, а не неисправность. Проверить атрибуты можно через cat /sys/class/mtd/mtdN/flags или /sys/class/mtd/mtdN/ro, если такие файлы присутствуют в вашей версии ядра.
Если /proc/mtd пустой или отсутствует
На обычных десктопных дистрибутивах Linux файла /proc/mtd нет, и это нормально: там нет «сырой» флеш-памяти, диски работают через блочные драйверы. Файл появляется только при загруженной поддержке MTD в ядре и наличии соответствующего оборудования.
На embedded-устройстве пустой вывод может означать несколько вещей:
- 🔧 Поддержка MTD не включена в ядре или нужные модули не загружены — проверьте
lsmod | grep mtd. - 📋 Разметка не передана ядру: загрузчик не передал
mtdparts, а в device tree разделы не описаны. - 💾 Устройство использует eMMC вместо raw-флеша — тогда разметку смотрите через
cat /proc/partitionsилиlsblk. - 🔍 Флеш не опознан драйвером — изучайте
dmesg | grep -i mtdна предмет ошибок инициализации.
Вывод dmesg при загрузке обычно содержит строки вида «Creating N MTD partitions» с указанием диапазонов адресов — это второй независимый источник информации о разметке, полезный для перекрёстной проверки.
Чем /proc/mtd отличается от /proc/partitions
Файл /proc/partitions показывает блочные устройства: диски, eMMC, USB-накопители и их разделы, размеры указаны в блоках по 1 КБ. /proc/mtd относится только к raw-флешу (NOR/NAND) без контроллера трансляции. На одном устройстве может быть доступен только один из этих интерфейсов, а на некоторых — оба сразу, если есть и флеш, и внешний накопитель.
Сопутствующие команды для диагностики флеша
Одного /proc/mtd для полной картины бывает мало. Полезно собрать данные из нескольких источников и сличить их между собой:
- 📟
dmesg | grep -i -E "mtd|flash"— как ядро обнаружило флеш и создало разделы при загрузке. - 🗂
ls /dev/mtd*— какие символьные и блочные устройства реально созданы в системе. - 📊
cat /sys/class/mtd/mtdN/sizeи.../erasesize— размеры конкретного раздела в десятичном виде (N замените номером). - 🧪
mtdinfo /dev/mtdN— подробная информация о разделе, если в системе установлен пакет mtd-utils.
Для NAND-флеша актуальна ещё и проверка сбойных блоков — утилита nanddump из mtd-utils умеет показывать bad blocks при чтении. Наличие заводских сбойных блоков на NAND — штатная ситуация, с ними работает драйвер, но их рост со временем может указывать на деградацию памяти.
⚠️ Внимание: команды вродеflash_eraseиnandwriteработают на уровне отдельных блоков и не проверяют осмысленность образа. Используйте их только если понимаете структуру раздела и имеете проверенный бэкап — в отличие отmtd write, здесь меньше защитных проверок.
Часто задаваемые вопросы
Чем /dev/mtdN отличается от /dev/mtdblockN?
/dev/mtdN — символьное устройство для прямого доступа к флешу, его используют специализированные утилиты (mtd, flash_erase). /dev/mtdblockN — блочная обёртка, нужная для монтирования файловых систем и для чтения через dd. Для снятия дампа обычно берут mtdblock, для записи прошивки — утилиту mtd с символьным устройством.
Можно ли изменить разметку разделов через /proc/mtd?
Нет, файл доступен только для чтения — это отображение текущей разметки, а не инструмент её редактирования. Разметка меняется через device tree, параметры загрузчика (mtdparts) или перепрошивку таблицы разделов, и каждый из этих способов зависит от конкретной платформы и прошивки.
Почему размеры в выводе не совпадают с заявленным объёмом флеша?
Сумма разделов может быть меньше полного объёма, если часть флеша не размечена или зарезервирована. Кроме того, размеры указаны в шестнадцатеричном виде — переведите их в десятичные, прежде чем сравнивать с маркировкой чипа.
Безопасно ли выполнять cat /proc/mtd?
Да, это чисто диагностическая команда чтения, она ничего не изменяет в системе и на флеше. Опасны только операции записи и стирания, для которых /proc/mtd служит справочником.
Команда mtd не найдена на моём устройстве — что делать?
Утилита есть не во всех прошивках. На OpenWrt она входит в базовую систему, в других случаях может потребоваться установка пакета mtd-utils через пакетный менеджер, если он доступен. Если пакетного менеджера нет, изучите документацию именно вашей прошивки — способы записи разделов в ней могут быть свои.