有没有办法确保文件与索引节点表中存储的文件大小相比不会被截断? (dd命令可以吗?)

有没有办法确保文件与索引节点表中存储的文件大小相比不会被截断? (dd命令可以吗?)

我使用 ext4 文件系统。我对从 NTFS 文件系统复制的文件描述的目录条目的准确性存有疑问,该文件可能跨越了一些坏扇区(但我不确定)。我现在相信该文件在从源复制时可能已被截断,但 ext4 文件系统中的目录条目并不反映现在截断的文件大小,而是保留了 NTFS 文件系统表中的文件大小信息。我不知道这种情况是否可能,但我想确保该文件没有被截断(不幸的是该文件采用专有格式,我不能只打开该文件来检查它)。

dd对文件运行一个命令/dev/null,它似乎已经“复制”了与原始文件大小一样多的内容。但是,我现在想知道该dd命令是否使用了索引节点表中有关文件大小的元数据,这会破坏目标。

  • 复制文件后,inode 表是否无法反映实际复制内容的实际大小? (我想我只是在文件资源管理器中单击并拖动)?
  • 使用dd命令是一个好的选择吗?
  • ext4 文件系统中是否有元数据可用于独立检查文件的大小,从而检查 inode 表中信息的准确性(我考虑的是数据完整性字段)?

答案1

因此,首先,这里涉及的不可信文件系统似乎是原始文件系统,而不是目标文件系统。如果源读取到无意义的内容,则该无意义的内容会“正确”写入目标文件,之后您将无能为力 - 对于所有信息,这就是原始文件的样子。

所以,不,我们可以从你的用例排除写入端发生任何形式的数据损坏。如果有的话,那就是数据读取已损坏。

然后:

保留 NTFS 文件系统表中的文件大小信息。

这不是文件系统之间复制的工作原理。您创建目标文件,重写源文件的内容(通过reading 源文件并writeing 到目标文件,或者通过copy_file_range系统调用),但元数据由目标文件系统本身保留和构造,这知道没有什么关于原始文件。所以,不,这不会发生。

复制文件后,inode 表是否无法反映实际复制内容的实际大小? (我想我只是在文件资源管理器中单击并拖动)?

不,或者:非常非常不可能。在 ext4 中,元数据(因此,除了实际数据之外的所有内容)实际上都会被记录下来。换句话说,元数据要么完全改变,要么根本不改变。

对于 ext4,相对于元数据记录数据的默认模式是data=ordered(请参阅 参考资料man ext4);这意味着在元数据更新之前数据已完全写入文件系统。所以,有一件事是可以例如,如果您的系统断电,则发生的情况是数据写入已发生,但元数据尚未写入。这会影响文件大小较少的比复制的内容多,而不是更多。

所以,因为数据是在元数据之前写入的,并且元数据是正确的,所以我们可以确定数据是正确的。 (同样,如果源上的数据已损坏,垃圾输入、垃圾输出仍然适用)

使用 dd 命令是一个好的选择吗?

不,因为任何程序都会准确地获取文件系统提供的数据量。如果文件系统曾是损坏和错误地认为文件更长,它会给出一些它错误归因的数据,这样你dd就不会变得更聪明。不是因为它具有任何元数据访问权限,而是因为您想要用它捕获的错误意味着它看起来好像错误不存在,对于所有关心的人来说dd

ext4 文件系统中是否有元数据可用于独立检查文件的大小,从而检查 inode 表中信息的准确性(我考虑的是数据完整性字段)?

不,除非您想要文件系统元数据的第二个副本,这正是您所要求的正确性。

如上所述,Ext4 是一个日志文件系统,它保证元数据写入完成或未发生。

相关内容