是否有使用 btrfs CoW 作为重复数据删除的重复数据删除脚本?

是否有使用 btrfs CoW 作为重复数据删除的重复数据删除脚本?

在 Linux 上寻找重复数据删除工具有很多,请参见例如这个维基页面

几乎所有脚本都仅执行检测、打印重复文件名或通过将重复文件硬链接到单个副本来删除重复文件。

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

答案1

我写床上用品以此目的。它将增量 btree 扫描与 CoW 重复数据删除相结合。最好与 Linux 3.6 一起使用,您可以在其中运行:

sudo bedup dedup

答案2

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

这太慢了。

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

rdfind 有一个使用 btrfs reflink 的“实验性”功能。 (以及硬链接、符号链接等的“可靠”选项)

rmlint 为 btrfs 克隆、reflink、常规硬链接、符号链接、删除和您自己的自定义命令提供了“可靠”选项。

但更重要的是,rdfind 和 rmlint 是显著地快点。就像,数量级。它不是扫描所有目标文件的校验和,而是执行以下操作:

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

我知道 rmlint 的其他优点:

  • 您可以指定校验和。 md5太可怕了?尝试 sha256。或者512。或者逐位比较。或者您自己的哈希函数。
  • 它为您提供了 Btrfs“克隆”和“引用链接”的选项,而不仅仅是引用链接。 “cp --reflink=always”只是有点冒险,因为它不是原子的,它不知道内核中该文件还发生了什么,并且它并不总是保留元数据。 “Clone”,OTOH(这是一个简写术语...我在官方 API 相关名称上空白),是一个内核级调用,它是原子的并保留元数据。几乎总是产生相同的结果,但更加稳健和安全。 (尽管大多数程序足够聪明,不会删除重复文件,但如果它不能首先成功地建立到另一个文件的临时重新链接。)
  • 它为许多用例提供了大量选项(这也是一个缺点)。

我将 rmlint 与 deduperemove 进行了比较——后者还会盲目扫描所有目标文件的校验和。杜佩雷莫夫拿走了几天我的书要完成(我想是4),全力以赴。弗姆林特采取了几个小时识别重复项,然后用 Btrfs 克隆在不到一天的时间内对它们进行重复数据删除。

(也就是说,任何努力编写和支持高质量、强大的软件并免费赠送它的人都应该受到极大的赞誉!)

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

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

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

作为一个具体的说明:照片缩略图缓存文件是无数程序在包含照片的文件夹中生成的(并且有充分的理由 - 可移植性),可能需要数小时或数天的时间才能生成,但随后使使用照片应用程序变得轻而易举。如果这些初始缓存文件全部硬链接在一起,那么您稍后在目录上打开应用程序,它会构建一个大型缓存...然后猜猜看:现在每个具有先前硬链接缓存的文件夹现在都有错误的缓存。可能会造成灾难性的后果,导致数据意外损坏。并且还可能以某种方式破坏不支持硬链接的备份解决方案。

此外,它可能会毁掉整个快照。快照的全部意义在于,“实时”版本可以继续更改,并且能够回滚到以前的状态。如果一切都硬链接在一起......你“回滚”到同一件事。

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

答案3

11年后:我建议fclones。它正是通过它的dedupe子命令来完成此操作。

它是一个优秀的工具,速度很快(用 Rust 编写),并且作为一个很好的工具来删除重复数据并合理化我的所有备份,这对我来说非常有用。

相关内容