是否有适用于 Linux 的通用文件系统校验和工具?

是否有适用于 Linux 的通用文件系统校验和工具?

编辑:澄清背景

我在不同的机器上有几个松散同步的文件系统。(有些内容是冗余的,有些不是,用户手动移动内容)。这些是大型科学数据集(数十 TB);它们根据我们对它们执行的工作类型跨集群移动。它们没有标准的命名约定(文件有时会随着各种实验的进行而重命名,或者在选择或合并文件子集时重命名)。

我想找到一个工具,让我能够有效地在远程文件系统中查找冗余,以便我们可以删除冗余数据,并在退役存储块时复制非冗余数据。(旁注:像 Ceph 这样的分布式文件系统承诺处理这些情况;这将是未来的路线,但现在我们必须按原样处理现有系统)

自从许多对象已被手动移动和重命名,我无法依靠它们的文件名进行比较使用 diff 或 rsync。我宁愿使用诸如 sha256 之类的加密校验和来识别我的数据文件。

我也不想每次运行比较时都对整个数据集进行校验和。文件一旦创建,就不太可能经常更改,因此应该缓存校验和。

是否有现成的工具可以执行此操作?也许是将校验和存储在 Posix 扩展属性中(使用时间戳检查校验和的新鲜度),以及可以提取该信息以有效地区分文件系统内容的工具,而无需关心文件名?

答案1

我不知道文件系统级校验和;您可以使用 md5sum 编写脚本(或手工制作)并将其存储在文本文件中以供比较,并且有适用于多个平台的 md5sum 端口。

如果这些是大文件,您可以考虑设置一个系统,让用户使用 bittorrent 复制数据;它具有内置的数据校验方式,如果您有多个存储文件的地方,那么您将获得额外的好处,因为不必通过传输来加载一个或两个系统。

如果您正在管理系统或数据,您可能需要考虑更改有关如何复制或移动数据的策略;如果出现问题,这可能会让您少受伤,如果发生意外并且“这次”数据没有由 Bob 备份,您的用户可能会感谢您。如果您在现有基础设施中工作,则无需做任何过于复杂的事情;即使是几台通过网络运行定期 rsync 的服务器(这也相对较快,因为它在通过网络传输时只传输大文件中的更改,如果它认为它是本地文件,则速度不会太快)也会创建同步文件。

我要提醒的是,像这样复制文件并使用校验和从技术上来说并不是备份;而是一种重复。备份意味着当您的主文件损坏时,您可以“回滚”到以前的版本(想设置类似于 CVS 的东西来检查您的大型数据文件吗?...)而复制,即使使用校验和,也意味着如果您的原始文件损坏(意外删除、驱动器中的坏扇区等),损坏的文件将被复制到您的副本中,包括校验和,从而使它们变得毫无用处。您需要为这种情况做好计划。

答案2

由于我没有找到可以满足我需求的工具,因此我开始自己动手:

http://bitbucket.org/maugier/shatag

- 编辑 -

在开发该工具之后,我了解到git 附件这与我的目标不同,但仍然是一个理想的解决方案。

答案3

也许您可以使用带有选项 --dry-run (-n) 的 rsync。它会尝试复制(但不执行任何操作),然后您会看到差异。有很多有关过滤的选项(时间戳、所有者等等)可以准确定义您想要的内容。

答案4

有人已经提到了“rsync”。

如果您可以在第一台机器上安装第二个文件系统,您可以尝试运行“diff -r /localfs /remotefs”并查看差异。

您还可以尝试使用 tripwire 或 AIDE 之类的工具来对一棵树进行快照并将其与另一棵树进行比较。

根据相关数据集的大小,您可以考虑使用 git 或其他一些高效的版本控制程序来定期拍摄“快照”(自动、无人值守的添加和提交)以跟踪更改。如果您正确设置,您甚至可以使用此方法将特定更改从一台机器同步到另一台机器。

对于重复数据删除,“fdupes”程序运行良好。

相关内容