Команда cat /proc/mtd: просмотр разделов флеш-памяти в Linux

Команда 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-значениеБайтЧеловекочитаемый размерТипичное назначение
0x000100006553664 КБМелкие разделы: env, art, config
0x00040000262144256 КБЗагрузчик u-boot
0x0020000020971522 МБЯдро Linux
0x00f9000016318464~15,6 МБРаздел firmware целиком
0x010000001677721616 МБПолный объём флеша

Размер стираемого блока (erasesize) важен при ручной записи: образ должен быть выровнен по границе erase-блока, иначе утилита записи откажется работать или запишет данные некорректно. Для NOR-флеша типичен блок 64 КБ, для NAND значения могут отличаться — сверяйтесь с выводом именно вашего устройства.

📊 Для какой задачи вы используете /proc/mtd?
Бэкап разделов перед прошивкой
Запись новой прошивки через mtd
Диагностика и изучение разметки
Восстановление после неудачной прошивки

Практическое применение: бэкап разделов

Самая частая причина заглянуть в /proc/mtd — сделать резервную копию перед прошивкой. Критически важен раздел с калибровками радиомодуля (art, factory или eeprom): без родного раздела калибровок Wi-Fi на устройстве может перестать работать или потерять корректные MAC-адреса, и восстановить его без бэкапа будет крайне сложно.

Дамп делается командой dd с указанием блочного устройства раздела. Обратите внимание: для чтения используется /dev/mtdblockN, а не символьное устройство:

dd if=/dev/mtdblock3 of=/tmp/art_backup.bin

Затем файл нужно скопировать с устройства на компьютер, например через scp. Хранить бэкап только в /tmp на самом роутере бессмысленно — это оперативная память, она очистится при перезагрузке.

☑️ Безопасный бэкап перед прошивкой

Выполнено: 0 / 5

Запись в раздел: команда 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 через пакетный менеджер, если он доступен. Если пакетного менеджера нет, изучите документацию именно вашей прошивки — способы записи разделов в ней могут быть свои.