是否有任何将btrfs CoW用作重复数据删除的重复数据删除脚本?


9

在Linux上寻找重复数据删除工具的地方很多,例如,参见此Wiki页面

所有脚本几乎都只检测,打印重复的文件名或通过将它们硬链接到单个副本来删除重复的文件。

随着btrfs的兴起,将有另一种选择:创建文件的CoW(写时复制)副本(如cp reflink=always)。我没有找到执行此操作的任何工具,有人知道执行此操作的工具吗?


更新:rmlint的development分支(我相信也是master)添加了以下内容:1)增量文件哈希。除非自上次运行以来已更改文件,否则它不会重新哈希文件。2)增量重复数据删除。它仅对尚未或已更改的文件进行重复数据删除。[甚至更大。]在所有其他快速比较方法均失败后,仅与哈希文件结合使用,使其无与伦比。Bedup已被放弃,显然无法编译。我做了详细的比较:docs.google.com/spreadsheets/d/…–
吉姆

Answers:


17

我为此目的写了一张床。它结合了增量btree扫描和CoW重复数据删除。最适合与Linux 3.6结合使用,您可以在其中运行:

sudo bedup dedup

@Gabriel,您好,以下对我的回答的评论指出:“ ... bedup ...将内容放入大小存储桶,仅读取整个文件,以在必要时创建校验和。” 真的吗?如果是这样,我想在下面更新我的答案。(并且自己使用bedup!)不幸的是,我无法在任何地方进行验证。我试过Google,在您的github页面上搜索,然后在代码上搜索。谢谢。
吉姆(Jim)

4

我试过了 虽然不错(并且具有一些有用的差异化功能,可能使其成为许多人的最佳选择),但它似乎会扫描所有目标文件的全部以获取校验和。

这太慢了。

另一方面,其他程序(例如rdfind和rmlint)的扫描方式也不同。

rdfind具有使用btrfs reflink的“实验”功能。(以及硬链接,符号链接等的“固定”选项)

rmlint具有btrfs克隆,reflink,常规硬链接,符号链接,删除和您自己的自定义命令的“可靠”选项。

但更重要的是,rdfind和rmlint 明显更快。如数量级。而不是扫描所有目标文件中的校验和,它大约执行此操作:

  • 扫描整个目标文件系统,仅收集路径和文件大小。
  • 从考虑中删除具有唯一文件大小的文件。仅此一项,可以节省大量时间和磁盘活动。(“ Scads”是一些反指数函数或其他函数。)
  • 在其余候选对象中,扫描前N个字节。从考虑中删除具有相同文件大小但前N个字节不同的文件。
  • 对最后N个字节执行相同的操作。
  • 仅保留剩余的(通常很小的一部分)扫描校验和。

我知道的rmlint的其他优点:

  • 您可以指定校验和。md5太吓人了吗?尝试sha256。或512。或逐位比较。或您自己的哈希函数。
  • 它为您提供了Btrfs“克隆”和“ reflink”的选项,而不仅仅是reflink。“ cp --reflink = always”只是有点风险,因为它不是原子的,它不知道内核中该文件的其他情况,并且它并不总是保留元数据。OTOH“ Clone”(这是一个简写……我正在掩盖与API相关的正式名称),是一个原子级的内核级调用,并保留元数据。几乎总是导致相同的结果,但是更加健壮和安全。(尽管大多数程序足够聪明,因此不能删除重复的文件,如果它不能首先成功建立到另一个文件的临时reflink。)
  • 对于许多用例,它都有很多选择(这也是一个缺点)。

我将rmlint与deduperemove进行了比较,后者也盲目地扫描了每个目标文件中的校验和。Duperemove用了几天的时间才能完成(我认为是4),完全倾斜。fmlint花了几个小时来确定重复项,然后用不到一天的时间用Btrfs克隆对其进行了消隐。

(也就是说,任何努力编写和支持高质量,健壮软件并免费提供的人,都应该受到大赞!)

顺便说一句:您应该不惜一切代价避免使用常规的硬链接作为“通用”重复数据删除解决方案进行重复数据删除。

尽管在某些特定使用情况下,硬链接可能非常方便(例如,单个文件或使用可以扫描超过最小最小大小的特定文件类型的工具,或者作为许多免费的商业备份/快照解决方案的一部分),但这可能是灾难性的用于大型通用文件系统上的“重复数据删除”。原因是大多数用户的文件系统上可能有成千上万个文件,这些文件是二进制相同的,但功能却完全不同。

例如,许多程序会生成模板和/或隐藏的设置文件(有时在它可以看到的每个文件夹中),它们最初是相同的,而且大多数保持不变,直到您(用户)不需要它们为止。

举一个具体的例子:照片缩略图缓存文件(包含有充分的理由-可移植性)在包含照片的文件夹中生成无数个程序,这些文件可能要花费数小时或数天才能生成,但是使用照片应用程序变得轻而易举。如果所有最初的缓存文件都被硬链接在一起,那么您以后可以在目录上打开该应用程序,它会建立一个大的缓存...然后猜测:现在,每个以前具有硬链接缓存的文件夹现在都有错误的缓存。潜在的灾难性结果可能会导致意外的数据破坏。并且还可能以某种方式爆炸不支持硬链接的备份解决方案。

此外,它可能会破坏整个快照。快照的全部目的是使“实时”版本可以继续更改,并具有回滚到先前状态的能力。如果所有内容都硬链接在一起,则...“回滚”到同一件事。

好消息是,使用Btrfs克隆/ reflink进行重复数据删除可以消除这种损害(我认为-自扫描以来,它应该将硬链接的文件视为相同...除非它有不考虑硬链接的逻辑。这可能取决于进行重复数据删除的特定实用程序。)


这是不正确的。bedup的操作相同,将其放入大小存储桶中,仅在需要时才读取整个文件以创建校验和。同样,bedup可以存储此结果,因此后续运行甚至更快。
彼得·史密特

@PeterSmit,如果我可以验证您评论的第一部分,我想更新我的答案(并考虑自己改回就寝)。Bedup的github自述文件没有提及它,并且搜索“文件大小”或“文件大小”没有明显的答案。我该如何验证?
吉姆(Jim)

此外,最近3年似乎没有放弃卧床休息。真可惜,我想使用这个想法真是太棒了!我希望你把它备份。
吉姆(Jim)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.