为什么存储设备的文件系统更改时其中的所有数据都会丢失?

为什么存储设备的文件系统更改时其中的所有数据都会丢失?

我对存储设备了解以下几点:

  • 它们分为两部分:文件表和文件数据
  • 这些工作方式由文件系统决定
  • 所有文件系统都有一个文件表和文件数据
  • 可以在不改变文件数据的情况下更改文件表,反之亦然
  • 可以从文件表中删除文件,以便快速删除,而无需实际删除文件的数据

所以,我的问题是:当您更改驱动器上的文件系统(或“格式化”)时,为什么所有文件数据都会丢失?计算机难道不能简单地记住文件表并按照新系统的格式重新创建它吗?

如果新文件系统需要比旧系统更大的表,那么我确信您会遇到完全满驱动器的一些问题,但除此之外,我不明白为什么不能这样做。

我还知道,经过“快速格式化”(仅替换文件表,但新的文件表为空)之后,所有文件数据仍然存在,可以使用取证工具恢复。

答案1

您似乎认为存储设备上有两个分离的、明确定义的区域:“文件表”(元数据)和“文件数据”(数据),因此您可以在删除和重新创建元数据区域时保持数据区域不变。

事实并非如此。不仅每个文件系统将其固定元数据放在不同的地方,而且在大多数文件系统中,部分元数据与数据混合在一起。这种情况经常发生在目录中,目录在内部的处理方式有点类似于“特殊文件”。

例如,FAT32 的元数据区域位于存储设备的开头,另外目录与数据混合在一起;NTFS,IIRC 将其主元数据区域 (MFT) 位于存储设备中间的固定位置;ext 系列 (ext2、ext3、ext4) 将存储设备分成“块组”,每个块组都有自己的元数据,位于固定位置,因此您有多个元数据区域分布在整个存储设备上,另外还有作为特殊文件存储的目录;btrfs 使用树结构,其中大多数元数据几乎可以位于任何地方。

如您所见,一个文件系统中的数据可能与另一个文件系统中的元数据重叠。要从一个文件系统转换为另一个文件系统,转换工具不仅必须转换目录结构,还必须将部分数据移开。这是可以做到的(例如,请参阅从 ext3/ext4 转换为 btrfs),但由于它很复杂并且很少完成(大多数存储设备都用一个文件系统格式化一次并在其余生中一直使用它),所以没有太多的动力去实现它(并测试它,这在处理用户数据时很重要)。

答案2

它们分为两部分:文件表和文件数据

部分正确,实际上大多数文件系统会将一些元数据存储在固定位置,将其他元数据存储为“特殊文件”。具体将哪些元数据存储在何处取决于文件系统。

固定位置通常并非全部位于起点,而是以某种方式分布于整个存储量中。

所以,我的问题是:当您更改(或“格式化”)驱动器上的文件系统时,为什么所有文件数据都会丢失?计算机难道不能简单地记住文件表并以新系统的格式重新创建它吗?

由于多种原因,就地转换文件系统比较棘手。

  1. 元数据的布局几乎肯定会有所不同,这基本上意味着您需要保留所有旧元数据,直到生成所有新元数据。
  2. 元数据可能太大,无法存储在内存中。因此,简单地读取所有旧元数据,然后根据内存中的副本写出所有新元数据并不是一个好选择。
  3. 大多数文件系统将重要的元数据存储在固定位置。这意味着对于许多转换,工具无法简单地在旧数据/元数据留下的“空白处”创建新的元数据。
  4. 数据本身可能以不同的方式存储,例如在 NTFS 上,簇始终对齐,而在 FAT 上则不需要。某些文件系统可能会压缩数据。

这些问题都不是不可克服的,但它们意味着编写文件系统转换器是一项艰巨的工作,并且运行它通常会带来不可忽略的数据丢失风险。

我知道以下转换器。

  • Windows 98 和 ME 带有一个转换器,可以将 FAT16 转换为 FAT32。在 Windows 98 中,这一点显而易见,但在 Windows ME 中,他们只将其设置为命令行。
  • Windows 2000 及更高版本附带一个转换器,可以将 FAT16 和 FAT32 转换为 NTFS。同样,此转换器仅支持命令行。另外,AIUI 转换过程有时会产生 512 字节簇,这是由于我上面提到的对齐问题。
  • BTRFS 工具附带一个可以将 ext2/3/4 转换为 BTRFS 的程序。
  • Linux 上有一个叫做 fstransform 的工具,自述文件声称它支持 ext2、ext3、ext4 和 reiserfs。它似乎使用了一些处理稀疏文件的技巧,让内核中的文件系统驱动程序完成繁重的工作,因此理论上可以与支持某些功能的任何 Linux 文件系统一起使用。显然,它还提供了对 NTFS 的一些实验性支持(https://github.com/cosmos72/fstransform/issues/1)。

答案3

当您更改驱动器上的文件系统(或“格式化”)时,为什么所有文件数据都会丢失?

不一定非要这样。通常,格式化驱动器是为了初始化一个没有数据的新驱动器或丢弃其中的数据。

如果您有一个存储有数据的存储介质,您可以通过多种方式轻松地将文件系统结构从一个更改为另一个(例如 FAT -> ext3)。最终用户和多用户环境很少这样做。方法因您未提供的详细信息而异。请注意,并非所有假设都一定有效。

了解有关文件系统检出的更多信息http://en.wikipedia.org/wiki/Filesystems

相关内容