Ошибка SQUASHFS: не удается прочитать страницу,..., размер


Я работаю со встроенной платформой ARM со встроенной вспышкой NAND. Мой раздел крыши-squashfs. И u-boot, и ядро используют OMAP_ECC_BCH8_CODE_HW. Проблема в том, что некоторые платы (а не только одна) перестали работать после отключения электроэнергии (они использовались около 2 месяцев).

Эти ошибки можно увидеть во время загрузки:

[    8.270507] end_request: I/O error, dev mtdblock9, sector 25184
[    8.278930] SQUASHFS error: squashfs_read_data failed to read block 0xc40396
[    8.286376] SQUASHFS error: Unable to read fragment cache entry [c40396]
[    8.293579] SQUASHFS error: Unable to read page, block c40396, size d696
[    8.300628] SQUASHFS error: Unable to read fragment cache entry [c40396]
[    8.307647] SQUASHFS error: Unable to read page, block c40396, size d696
[    8.314819] SQUASHFS error: Unable to read fragment cache entry [c40396]
[    8.321838] SQUASHFS error: Unable to read page, block c40396, size d696
[    8.328887] SQUASHFS error: Unable to read fragment cache entry [c40396]
[    8.335906] SQUASHFS error: Unable to read page, block c40396, size d696
[    8.343017] SQUASHFS error: Unable to read fragment cache entry [c40396]
[    8.350006] SQUASHFS error: Unable to read page, block c40396, size d696
/usr/sbin/lighttpd: '/usr/lib/libpcre.so.1' is not an ELF file
/usr/sbin/lighttpd: can't load library 'libpcre.so.1'

Как мне это отладить? Я не стер вспышку, так что все еще можно сделать некоторые тесты на ней.

Что я такого сделал? далеко:

  1. Я использовал nanddump (with-o, read oob data) на плохом разделе, и я заметил три предупреждения об исправлении ecc. Когда я пишу этот дамп на другую доску, он загружается без проблем.

  2. Когда я использовал nanddump с дополнительной опцией-n (--noecc, чтение без исправления ошибок) и записал его на другую плату (используя nandwrite-n), вторая плата не смогла загрузиться.

Мне кажется, что эти ошибки можно исправить, и именно поэтому nanddump исправил их в первом случае. Я сравнил эти 2 дампа, и они являются только тремя различиями (3 поправки ecc, сообщенные nanddump?)

# diff mtd_without_ecc.hex mtd_with_ecc.hex 

486347c486347
< 076bca0: 59d2 d8bc 3e89 1c67 a6c2 74a0 bc38 4873  Y...>..g..t..8Hs
---
> 076bca0: 59d2 d8bc 3e09 1c67 a6c2 74a0 bc38 4873  Y...>..g..t..8Hs
783769c783769
< 0bf5980: e31e f50a e5b5 6ae5 5a67 8be1 7636 9cf2  ......j.Zg..v6..
---
> 0bf5980: e31e f50a e5b5 6aa5 5a67 8be1 7636 9cf2  ......j.Zg..v6..
1315929c1315929
< 1414580: a9ec ef89 ac52 c8a5 61f5 5d0b 6ee2 af41  .....R..a.].n..A
---
> 1414580: a9ec af89 ac52 c8a5 61f5 5d0b 6ee2 af41  .....R..a.].n..A

Возникает вопрос: почему эти ошибки не были исправлены системой автоматически? Не потому ли, что squashfs не является файловой системой" mtd-aware " и ее не следует использовать на устройствах mtd? Если да, то должен ли я использовать squashfs над UBI? Как насчет ядра (насколько я знаю, это должен быть raw-образ, чтобы загрузить его из u-boot)?

Спасибо за любые помогите!

1 4

1 ответ:

Действительно, уровень MTD Linux не выполняет никакого обслуживания памяти NAND/NOR.

Например, когда bitflip происходит на вашем ПК, это исправляется Экк. Слой MTD знает об этом, но он ничего не делает с этим. Он просто возвращает ошибку.

Поэтому вам нужен еще один слой поверх MTD, чтобы позаботиться об этом.

Одним из решений является использование UBI, который предназначен для решения такого рода проблем. Взгляните на документацию UBI на linux-mtd. Если вы хотите придерживаться squashfs, можно добавить еще одну абстракцию MTD поверх UBI (gluebi), а затем запустить squashfs поверх этого. Результат выглядит так:
---------------------
|      SquashFS     |
---------------------
|     MTD block     |
---------------------
| MTD API (gluebi)  |
---------------------
|        UBI        |
---------------------
|     MTD driver    |
---------------------
|     Flash Chip    |
---------------------

Это делает страшную картину, но это работает довольно хорошо ;)

Посмотрите на эти слайды из свободных электронов для получения дополнительной информации (Изображение взято со слайда 47).

Насчет ядра я не уверен, но я думаю, что U-Boot поддерживает UBI. Хотя никогда не пробовал...