首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQUASHFS错误:无法读取页、.大小

SQUASHFS错误:无法读取页、.大小
EN

Stack Overflow用户
提问于 2013-12-12 18:41:21
回答 1查看 19.6K关注 0票数 5

我正在使用内置NAND闪存的嵌入式ARM平台。我的屋顶隔板是压扁纸。U引导和内核都使用OMAP_ECC_BCH8_CODE_HW。问题是,一些板(而不仅仅是一个)在停电后停止工作(它们被使用了大约2个月)。

在引导时可以看到这些错误:

代码语言:javascript
复制
[    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,读取而没有错误更正)并将其写入另一个板(使用nandwrite -n)时,第二个板无法启动。

在我看来,这些错误是可以恢复的,这就是为什么nanddump在第一种情况下纠正了它们。我比较了这两个转储,它们只是三个差异(nanddump报告的3个ecc校正?)

代码语言:javascript
复制
# 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感知的”文件系统,不应该在mtd设备上使用它吗?如果是这样的话,我应该在UBI之上使用squashfs吗?那么内核呢(据我所知,它必须是原始映像才能从u引导启动)?

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-05 14:42:17

实际上,Linux层不对NAND/NOR内存进行任何维护。

例如,当位翻转发生在您的NAND上时,它会被ECC纠正。MTD层知道这一点,但是它没有做任何事情。它只会返回错误。

所以你需要在MTD上面再加一层来解决这个问题。

一种解决方案是使用UBI,它是为解决此类问题而设计的。看看linux上的UBI文档。如果您想坚持使用squashfs,可以在UBI (gluebi)之上添加另一个MTD抽象,然后在上面运行squashfs。结果如下:

代码语言:javascript
复制
---------------------
|      SquashFS     |
---------------------
|     MTD block     |
---------------------
| MTD API (gluebi)  |
---------------------
|        UBI        |
---------------------
|     MTD driver    |
---------------------
|     Flash Chip    |
---------------------

这张照片很吓人,但效果很好;)

查看这是从自由电子开始的。获得更多信息(图片来自幻灯片47)。

关于内核,我不确定,但我认为About确实支持UBI。但从没试过..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20551600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档