SQUASHFS错误:无法读取页面,…,大小

5
我正在使用嵌入式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(使用-o选项读取oob数据),发现有三个ecc纠错警告。将这个转储文件写入另一个板子时,它会正常启动。
2.当我使用带有附加选项-n(--noecc,无错误纠正)的nanddump,并将其写入另一个板子(使用nandwrite -n),第二个板子无法启动。
对我来说,这些错误似乎是可恢复的,这就是 nanddump 在第一种情况下进行纠正的原因。 我比较了这两个转储文件,它们只有三个不同点(nanddump报告的3个ecc纠正)
# 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设备上使用吗?如果是这样,我应该使用UBI上的squashfs吗?那内核呢(据我所知,必须是原始映像才能从u-boot引导)?谢谢任何帮助!
1个回答

0

事实上,Linux MTD层不会对NAND/NOR存储器进行任何维护。

例如,当您的NAND发生位翻转时,它会通过ECC进行纠正。MTD层知道这一点,但它并不会采取任何措施。它只是返回错误。

因此,您需要在MTD之上使用另一层来处理这个问题。

其中一个解决方案是使用UBI,它被设计用于解决这种问题。请查看linux-mtd上的UBI文档。如果您想坚持使用squashfs,则可以在UBI(gluebi)之上添加另一个MTD抽象,然后在其上运行squashfs。结果如下所示:

---------------------
|      SquashFS     |
---------------------
|     MTD block     |
---------------------
| MTD API (gluebi)  |
---------------------
|        UBI        |
---------------------
|     MTD driver    |
---------------------
|     Flash Chip    |
---------------------

这张图片看起来有点吓人,但实际效果还不错 ;)

如果想了解更多信息,请查看free-electrons的这些幻灯片(图片来自第47页)。

关于内核,我不确定,但我认为U-Boot支持UBI。虽然我从未尝试过...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接