【问题标题】:Reason for ubi filesystem corruptionubi文件系统损坏的原因
【发布时间】:2013-10-24 07:21:43
【问题描述】:

我使用 ubi 文件系统和 mtd 子系统在 NAND 闪存上工作。 它工作正常。

但现在我发现以下错误:

UBI 错误:ubi_io_read: error -74 while reading 516096 bytes from PEB 2701:8192, read 516096 bytes

end_request:I/O 错误,dev mtdblock5,扇区 49160

我上面提到的那些错误的原因是什么? 如何从这些错误中恢复?

【问题讨论】:

  • 这些消息本身并不表示存在问题。如果你有 Linux 源,你可以编译 drivers/mtd/test 模块并在你的设备上运行它们。如果您的硬件组合(闪存芯片 + 闪存控制器)存在一些软件问题,这些测试应表明。 注意:有些测试是破坏性的。

标签: linux filesystems flash-memory ubifs


【解决方案1】:

错误 -74 是 EBADMSG。看ubi.h我们可以看到,

  • UBI_IO_FF:flash的读取区域只包含0xFFs
  • UBI_IO_FF_BITFLIPS:同%UBI_IO_FF,但也有数据 MTD 驱动程序报告的完整性错误 (在 NAND 的情况下无法纠正的 ECC 错误)
  • UBI_IO_BAD_HDR:EC 或 VID 标头已损坏(坏魔法或 CRC)
  • UBI_IO_BAD_HDR_EBADMSG:同 %UBI_IO_BAD_HDR,但也有一个 MTD 驱动程序报告的数据完整性错误 (在 NAND 的情况下无法纠正的 ECC 错误)
  • UBI_IO_BITFLIPS:检测并纠正位翻转

每个 UBI 块是一个闪存擦除块(通常为 128K),这些块有两个 UBI 标头,它们是一个页面大小(通常为 2k)。读取此页时,出现错误。无法通过纠错码或 ECC 恢复。

如果您在 UbiFs 之上使用 UBI,则应安排对这些块进行折磨。这涉及擦除和重写擦除块。如果多次读取 Flash,它可能会陈旧。这些位可以翻转并要求重新写入数据。事实证明,UBI 标头只需要重新编程,flash 就可以了。

如果没有,所有 NAND mtd 驱动程序都有一个bad block table。在数据确实不可恢复的情况下,擦除块将在此表中标记为坏,Ubi不应再使用该扇区。

如果错误仍然存​​在,那么这可能是一个问题。但是,在正常使用 NAND 闪存的情况下,这是有些意料之中的。 NAND 闪存的典型周期为 1,000 到 100,000。经过一定程度的磨损后,闪光灯可能完全无法使用。这取决于闪存类型、文件系统(和wear leveling)以及系统上的应用程序。

错误配置的闪存驱动程序可能会导致这些错误。不正确的闪存 ECC 代码可能会导致过早的错误(闪存为 4 位 ECC 提供空间,但驱动程序仅实现 1 位)。也可能是由于应用程序每隔 1ms-100ms 不断fsync() 磁盘造成的;即使所有其他组件都处于最佳状态,这种行为也会在几年内磨损闪光灯。 Ubi 应该有一些最好的磨损均衡 可用的。如果你经常重新刷一张图片,你可以打折扣ubi磨损均衡并导致这种问题。

【讨论】:

  • 我认为您发布的错误日志不完整。请参阅io.c, ubi_io_read(),因为它对您发布的消息有重试计数(至少在当前主线中)。所以这个消息应该出现了多次。
【解决方案2】:

两者都显示与您的 NAND 闪存损坏或坏块有关的 I/O 错误,请尝试使用另一个闪存并使用它。您也可以尝试擦除闪存并重试。

感谢和问候,
阿洛克·萨克

【讨论】:

  • 有哪些预防措施可以避免 NAND 闪存损坏?
  • 嗨 NAND 闪存损坏可能由于许多因素而发生,没有正确安装或多次读/写等。
猜你喜欢
  • 2011-09-25
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 2012-03-28
  • 2017-05-20
  • 2018-08-20
相关资源
最近更新 更多