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

Ank*_*wal 6 linux filesystems fat32

我可以通过控制台访问嵌入式 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)
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会这样?根本原因是什么?修复方法是什么?我将不胜感激可以指出如何调查设备上此问题的可能根本原因的答案。

Lau*_*low 7

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

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

要从磁盘读取 FAT 文件,您需要按顺序存储文件的簇号。目录条目给出第一个簇号 ( i)。其余的可以按照 chain等方式找到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 */
Run Code Online (Sandbox Code Playgroud)

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

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

  1. FAT 驱动程序错误。
  2. 宇宙射线
  3. 病毒或其他恶意软件
  4. 也许如果两个程序/驱动程序由于某种原因同时写入和读取同一个 FAT,它们可能会相互绊倒。不知道有没有可能。
  5. 在错误的时刻硬断电。闪存驱动器必须在写入更改之前将块清零,因此理论上在擦除后立即断电会导致这种结果。尽管如此,在大多数驱动器上都有故障保护来防止这种情况。
  6. 用户错误或破坏(例如dd if=/dev/zero of=/dev/sda1 bs=512 count=1 seek=32——不要在家里尝试这个!)

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

不过,在我看来,大多数现代驱动程序可能会将整个 FAT 表保存在 RAM 中,并将更改的部分写入驱动器上的两个副本。因此,即使曾经有过差异,它也可能在正常使用过程中迅速而无声地“修复”。请注意,这只是一个有根据的猜测。

最后,如果没有有关情况的进一步信息,就很难确定地知道,即使这样也可能是猜测。理想的情况是,如果您能够可靠地重现问题。然后我会比较“之前”和“之后”FAT 表(和 FAT 标头)以准确查看已更改的内容和更改的内容,寻找更改位置和内容的提示。


小智 6

由于某种原因,您的 FAT32 已损坏。我的 USB 记忆棒经常以损坏的 FS 结束,因为我目前正在 ARM 平台上调试 USB 主机问题。测试后,我从台式机 (Ubuntu 11.04) 发出以下命令:

$ sudo fsck.msdos -aw /dev/sdb1
Run Code Online (Sandbox Code Playgroud)

参考:https : //askubuntu.com/questions/31614/how-to-delete-edit-files-from-readonly-filesystem