如何在闪存设备上调试此FS错误?

Modified on: Mon, 15 Jul 2019 11:40:03 +0800

我可以通过控制台访问嵌入式Linux设备。该设备的闪存部分被分区为FAT文件系统。

运行linux-2.6.31。

但是这些天我在控制台上看到这些错误,FAT文件系统变为只读。

111109:154925 FAT: Filesystem error (dev loop0)
111109:154925 fat_get_cluster: invalid cluster chain (i_pos 0)
111109:154925 FAT: Filesystem error (dev loop0)
111109:154925 fat_get_cluster: invalid cluster chain (i_pos 0)

我无法理解为什么会这样?根本原因是什么?什么是修复?我希望得到的答案可以指出我如何在设备上调查此问题的可能根本原因。

作者:mdpc,abc

最佳答案

在位和字节级别上实际发生的是文件分配表的4个字节(或更多)已被0x00字节覆盖。

我将简要解释文件分配表的工作原理。它可以看作一个数组,其值是同一个数组的索引。因此,如果我们知道文件的第一个簇号是i,那么下一个簇号是fat[i],接下来的那个是fat[fat[i]],依此类推。 (这稍微简化了一下)。为了表示已到达链的末尾,使用特殊的EOC值而不是有效的簇号。

要从磁盘读取FAT文件,您需要按顺序存储文件所在的群集号。目录条目给出第一个簇号(i)。其余的可以在链fat[i]fat[fat[i]]等之后找到,直到遇到EOC值。然后,这是一个简单的计算,从群集号中获取每个群集的磁盘位置,将每个群集读入内存并连接它们。

发生fat_get_cluster: invalid cluster chain错误当在这样的链之后找到值0x00000000时。这不应该发生。它应该是新的有效簇编号或EOC值。发生这种情况时,不能再读取该文件,因为无法进一步跟踪链。 (0x00000000值用于将群集标记为空闲。群集0从不用于存储数据,因此没有歧义)

您的情况可能是特殊情况,因为i_pos的值为0.当我收到此消息时,这是一个很大的数字。 内核源说:

    loff_t i_pos;           /* on-disk position of directory entry or 0 */

所以i_pos不是群集号,而是磁盘上的位置。当它为零时意味着什么,我不知道。

编辑:关于可能导致它的原因,我只能推测,但这里有一些可能性:

  1. FAT驱动程序错误。
  2. 宇宙射线
  3. 病毒或其他恶意软件
  4. 也许如果两个程序/驱动程序由于某种原因同时写入和读取同一个FAT,它们可能会相互绊倒。不知道是否可能。
  5. 在错误的时刻断电。闪存驱动器必须在写入更改之前将块清零,因此理论上在擦除后立即关闭电源会导致此结果。虽然failsafes可以阻止这种情况发生。
  6. 用户错误或破坏(例如dd if=/dev/zero of=/dev/sda1 bs=512 count=1 seek=32 - 请勿在家中尝试此操作!)< / LI>
    醇>

    FAT文件系统驱动程序实际上使两个FAT表保持最新以实现冗余,第二个位于就在第一个之后。检查它们是否相同可能会提供可能发生的事情的线索。如果它们只是破坏集群链的价值不同,那么我认为它会更有可能以某种形式直接篡改,因为至少应该预期1和3“正确地”完成这项工作。

    我觉得很可能,大多数现代驱动程序会将整个FAT表保留在RAM中,并将更改的部分写回驱动器副本。因此,即使一次存在差异,也可能在正常使用期间快速且无声地“固定”。请注意,这只是一个有根据的猜测。

    最后,如果没有关于具体情况的进一步信息,很难确切地知道,即使这样,也很可能是猜测。理想的情况是,如果你可以可靠地重现问题。然后,我将比较“之前”和“之后”FAT表(以及FAT标题),以确切了解已更改的内容和内容,查找更改位置和内容中的提示。


相关问答

添加新评论