Монтирование файловой системы JFFS2 в OpenWrt

Вопрос или проблема

Я пытаюсь смонтировать 1[МБ] флэш-памяти как файловую систему JFFS2 в среде openwrt, используя 128[МБ] NAND-флэш (ECC 4 бита).

Я использую следующую последовательность –

flash_eraseall -j dev/mtd6

mount -t jffs2 -o noatime /dev/mtdblock6 /ИМЯ_КАТАЛОГА_МОНТА

После выполнения этой последовательности, кажется, что монтирование завершено, и я могу получать доступ, читать и записывать

в смонтированную область.

Проблема начинается, когда я перезагружаю систему, во время загрузки появляется следующее сообщение:

jffs2: mtd->read(0x800 bytes from 0x60000) вернул ошибку ECC
jffs2: уведомление: (667) read_dnode: неверная контрольная сумма данных в узле данных на 0x00060000: прочитано 0xf7a2ee2c, рассчитано 0x2f2a8b04

Я также попробовал создать файл nvm.jffs2 с помощью mkfs.jffs2 и записать его на запрашиваемый раздел – но проблема все еще возникла.

Я буду признателен за любые идеи или мысли.

Спасибо всем заранее!

Проблема возникла из-за clearmarker.

Во время монтирования clearmarker был установлен в начале блока.

Однако, когда происходила запись в блок, oob-данные добавлялись в конце блока

и поэтому не содержали clearmarker, что в свою очередь привело к неверному отчету о контрольной сумме CRC.

Быстрое решение заключается в том, чтобы записать clearmarker в каждый флэш-блок один раз во время загрузки, а затем clearmarker

будет добавлен к нему, и все будет работать хорошо.

Ответ или решение

Проблема, с которой вы столкнулись при работе с файловой системой JFFS2 на OpenWRT, действительно может быть связана с корректным управлением маркерами очистки (clearmarker) в использовании с NAND-флеш-памятью.

Ваша последовательность команд для форматирования и монтирования JFFS2 выглядит правильно, но сообщение об ошибке, связанное с верностью данных CRC, указывает на то, что не было корректной обработки маркеров очистки.

Рекомендации по решению проблемы:

  1. Подготовка заранее Clearmarker:
    Перед тем как писать данные в JFFS2, убедитесь, что все блоки памяти содержат маркер очистки. Вы можете сделать это, написав маркер очистки в каждый блок после загрузки системы и перед монтированием файловой системы.

    Например, добавьте следующую команду в скрипт инициализации, который выполняется после запуска системы:

    # Сначала проверьте, существует ли файловая система JFFS2
    if [ ! -e /dev/mtdblock6 ]; then
       echo "MTD device does not exist."
       exit 1
    fi
    
    # Запись clearmarker в каждый блок
    for i in {0..3}; do
       # Каждый блок имеет размер 128KiB (или 0x20000 байт), корректируйте при необходимости
       echo "Writing clearmarker to block $i"
       dd if=/dev/zero of=/dev/mtdblock6 seek=$((i * 0x20000)) bs=1 count=0
       flash_erase /dev/mtd6 $((i * 0x20000)) 0x20000
    done
    
    # Теперь монтируем JFFS2
    mount -t jffs2 -o noatime /dev/mtdblock6 /NAME_OF_MOUNT
  2. Убедитесь, что ваш код не игнорирует OOB данные:
    Проблемы с ECC ошибками могут также возникать из-за неверного управления out-of-band (OOB) данными NAND флеш-памяти. Проверьте настройки вашего NAND-диска и убедитесь, что OOB данные правильно обрабатываются.

  3. Разделение и использование mtd partitions:
    Убедитесь, что пространство между и другими разделами корректно задано и что JFFS2 не пересекается с другими файловыми системами на вашей NAND-флэш.

  4. Используйте правильную версию u-boot:
    Убедитесь, что используемая вами версия bootloader поддерживает правильный подход к данному устройству и управлению NAND.

  5. Тестируйте на различных уровнях очистки:
    Если вы продолжаете видеть ошибки, возможно, стоит протестировать комбинации команд flash_erase и mount, чтобы убедиться, что никакие данные не остались за пределами ваших ожиданий.

Применяя вышеуказанные рекомендации, вы сможете устранить проблему с ошибками JFFS2 и ECC. Удачи в ваших усилиях!

Оцените материал
Добавить комментарий

Капча загружается...