为什么 dosfsck 会截断文件?

为什么 dosfsck 会截断文件?

我遇到了一个众所周知的问题,但不幸的是我在这里缺乏一些知识,希望在这里找到更好的见解。

因此,我有一个损坏的 FAT32 文件系统的 USB 棒。我用 克隆并ddrescue运行testdisk。发现了一个分区(呼!),所以我用 创建了一个循环设备并losetup -f -P USB_clone.img挂载了它。到目前为止一切顺利,现在问题来了:所有文件都找到了,大小似乎正确(ls -al),但当我尝试复制文件时,出现了 I/O 错误。因此我再次卸载了分区并运行dosfsck -l -r -v /dev/loop1p1。一些文件可以恢复,但大多数文件的修复方式相当有趣:

  File size is 27589006 bytes, cluster chain length is 32768 bytes.
  Truncating file to 32768 bytes.

这会导致文件被截断;这显然不是我想要的......

这让我想到一些问题:

  1. 这是怎么回事?似乎可以正确检测文件大小,但是,嗯,什么地方出了问题?也许是分区表?为什么dosfsck可以正确检测文件名和文件大小却无法修复此问题?

  2. 当然更重要的是:有没有办法恢复这些文件?

如果您需要更多信息,请向他们提出请求!

多谢!

答案1

关于 FAT 文件系统碎片的很好的解释Quora:操作系统如何处理fat32格式的碎片扇区以恢复完整的数据?作者:Irné Barnard。

每个扇区后面都有一部分(或前面,无论详细设计如何 - 但在该扇区内的某个地方)……有内容表明“下一个扇区位于位置 X”。这是所有基于 FAT 的文件系统(包括 FAT32)的设计。这也是碎片导致 FAT 上的文件访问速度变慢的原因。

工作原理如下:

  1. 您(或您正在运行的某些程序)向操作系统发送打开文件的请求。
  2. 操作系统将请求传递给文件系统。
  3. FS(FAT)检查路径+文件名,找到给定路径中的第一个文件夹。
  4. 然后它读取根文件夹表(即驱动器文件夹层次结构的起始位置)。这将为路径中的第一个文件夹提供扇区编号。
  5. 然后它继续读取该文件夹的表,将其与给定路径中的下一个文件夹进行匹配。重复此过程,直到找到路径中的最后一个文件名/文件夹名。
  6. 这为它提供了文件起始的扇区以及文件的大小 - 因此它知道何时找到其所有扇区(简单地添加扇区大小)。
  7. 它读取第一个扇区,检查其元数据(即指向下一个扇区的指针)。
  8. 也读取该扇区,将该扇区的数据大小添加到已读取的计数中。如果仍然小于文件大小,则继续读取元数据中的下一个扇区并重复。

问题的关键在于被截断的文件很可能是碎片化的。当恢复程序遍历这些块并试图找到下一个碎片时,它决定不相信它认为的下一个块的位置。

用于比较和决定何时截断的规则和问题dosfsck如下https://linux.die.net/man/8/dosfsck并且很难知道它为什么会截断,因为不知道磁盘一开始遭受了什么损坏。如果 FAT 被擦除,那么可能是它不相信簇链中列出的任何簇正在使用,并且你触及了规则File contains bad or free clusters. The file is truncated.

dosfsck不是恢复工具。它是一种修复工具,假定磁盘一开始基本上是“没问题的”。

您可能需要考虑运行适当的恢复工具,例如photorec 它可以恢复的远不止照片或者testdisk可以做不仅仅是复制分区

相关内容