计算写入硬盘的每个文件的校验和

计算写入硬盘的每个文件的校验和

是否可以自动计算写入硬盘的每个文件的校验和?我的操作系统是 Linux,我读到 btrfs 会存储某种文件校验和。那么,是否可以转储这些校验和?其他文件系统呢?

答案1

文件系统虚拟文件系统在 Windows 上重新文件系统是提供内置数据完整性检查功能的主流文件系统产品之一。这是通过在写入期间计算校验和并将该校验和与数据一起存储来实现的。校验和的物理存储通常位于不同的磁盘位置,以避免本地错误破坏数据和校验和,以及允许检测到失败或未对齐的写入(驱动器报告写入成功,但写入没有“粘住”或数据写入了错误的物理位置)。

然而,这个功能并不像你想象的那样。简而言之,ZFS 在块级别工作和其他文件系统的设计类似。这避免了必须重写(或重新计算整个)大型文件的开销(用于微不足道的更改);相反,只需重新计算更改的块的完整性数据。对于大型文件,小的、就地的更改很常见,例如虚拟机磁盘映像,这归结为非常明显的区别。固定块大小基本上已经成为过去;我不知道其他的,但 ZFS 使用可变块大小,从一个扇区(通常为 512 或 4096 字节)到几百千字节到一兆字节。使用基于块级数据完整性检查的文件系统,这些文件块是您能够提取校验和的最佳选择。我们甚至不讨论这个问题,例如,去重数据存储...

您的问题类似于是否可以访问 ZFS 校验和来比较文件关于 Server Fault,虽然你的问题涉及的文件系统比那个特定的文件系统要多,但我认为回答经过陸州无论如何都适用:

我不相信有可能从 ZFS 文件系统中提取块级校验和,但由于校验和处于块级而不是文件级,所以它可能对您没有帮助。

这并不是说你所寻求的事情无法实现。事实上,利用 Linux 上可用的工具,人们可能可以拼凑出一个解决方案,使用诸如 之类的工具inotify和您选择的校验和计算程序来计算文件写入时的校验和。Windows 提供了类似的编程接口,几乎可以肯定可以投入使用。这应该同样可行于任何文件系统之上,因为您基本上只是利用普通的 I/O 工作流程,而不是通过任何特殊方式更改磁盘上的数据。(您显然,必须排除用于存储校验和的文件。)

然而,就其本身而言,只能让你成功一半。进行数据完整性检查的文件系统的真正杀手级功能不在于它们在写入时计算校验和;而在于它能够自动强制验证读取时的校验和。这样,您就可以确定您要么得到有效的数据,要么得到 I/O 错误;任何不完美的情况都会让计算机大声宣布您的存储存在问题和/或使用冗余数据自行修复。由于这是由操作系统在文件系统级别完成的,因此绕过它的唯一方法是故意直接读取磁盘,完全绕过文件系统层;几乎没有用户空间软件会这样做。(碎片整理程序和文件系统完整性检查器是两大类有理由这样做的软件。这里还值得注意的是,至少对于 ZFS,我不知道任何常见的数据恢复软件可以处理 ZFS 池,但 ZFS 工具本身由于某种原因无法导入。ZFS 工具有一些选项可以尝试恢复无法导入的池,但如果这些选项失败,您很可能就倒霉了。)

更实用的解决方案文件完整性检查,如果你不想全力以赴地使用 ZFS、Btrfs 或 ReFS,或者你真的需要整个文件校验和,或者你需要检测目录内容更改,是一个像这样的工具哈希深度,可用于计算并验证哈希值在整个目录树上。用该项目官方网站的话来说:

hashdeep 是一个用于计算、匹配和审计哈希集的程序。使用传统的匹配方法,程序会报告输入文件是否与一组已知文件匹配,或者输入文件是否不匹配。很难完全了解输入文件与一组已知文件相比的状态。可能存在匹配的文件、缺失的文件、集合中已移动的文件,以及找到不在集合中的新文件。Hashdeep 可以报告所有这些情况。当输入文件在一种哈希算法中与已知文件匹配,但在其他哈希算法中不匹配时,它甚至可以发现哈希冲突。结果显示在审计报告中。

正如上面的代码片段所指出的,像 hashdeep 这样的工具还具有能够检测文件的优点,例如,已被删除通过正常方式。这是文件系统级数据完整性检查根本无法做到的,在某些情况下,该功能非常有用。

答案2

使用 BTRFS,就在几天前,我发送了一个补丁来转储 csumshttp://www.spinics.net/lists/linux-btrfs/msg51256.html 您可以下载补丁并应用它。如果您遇到任何问题,请告诉我。

用法:

btrfs inspect-internal dump-csums /btrfs/50gbfile /dev/sda4
csum for /btrfs/50gbfile dumped to /btrfs/50gbfile.csumdump

观看实际操作 这里

编辑:最新补丁可以在这里找到:https://patchwork.kernel.org/patch/9696379/ 稍微改变了一下命令行。它使用“btrfs inspect-internal dump-csum”而不是“dump-csums”

btrfs inspect-internal dump-csum /btrfs/filepath /dev/name

相关内容