是否有一个文件系统仅保留一个文件的副本,而其他副本仅是引用?


18

这个问题可能不精确,因此我将尝试更详细地解释它。

由于多种原因,我在Linux文件系统上有很多相同文件的副本。其中许多很大。

说我有/path/to/some.file该文件/other/path/file.name和的副本/yet/another/path/third.copy。我想知道是否有一个文件系统可以从字面上使其中两个文件充当对原始文件的引用。自然,如果用户修改了其中之一,则只有这样,它们才成为独立文件。

PS。我知道这可以(部分)通过使用链接来完成。但是我希望我在上面试图解释的功能可以由文件系统透明地处理。


由于似乎还没有一个完美的答案,为什么不编写一个用硬链接(或者,如果对某些文件安全的话,用符号链接)代替硬链接的脚本(也许从cron运行)?无论如何,如果您不知道所有重复项在哪里,请查看fdupes code.google.com/p/fdupes
2012年

1
我不能这样做,因为当某些用户更改重复项之一中的数据时,他们应该成为独立文件,因为更改后内容有所不同...如果我进行符号链接,则修改实际上将更改原始文件。将原始文件视为功能性编程语言中的值-修改该文件时,实际上会得到一个新对象并对其进行引用。
DejanLekic 2012年

好。只是一些想法:您是否可以通过某种方式在用户和这些文件之间进行访问?如果可以,则可以从链接(符号或硬链接)开始,然后在他们向文件中写入任何内容时断开链接。您还可以使用diff之类的东西来存储差异,以节省大量空间,例如在版本控制系统中。如果将文件放在其中之一中,则可以为您管理差异。我没有太多使用vcs系统,所以我不知道详细信息。
2012年

Answers:


17

此功能称为重复数据删除。没有一种流行的Linux文件系统(ext *)支持它,但是显然,ZFS部分支持它。还有一个文件系统表,其中列出了重复数据删除,但似乎没有任何流行的选择-不过,这是Btrfs的计划功能。

我想定期检查您的文件系统并创建适当的硬链接是目前您能做的最好的事情,尽管这并不意味着写时复制。


我希望BTRFS有它的风头。我不知道他们打算拥有此功能-好消息!谢谢!
DejanLekic 2012年

10

您要查找的主要关键字是“写时复制”。如果cp --reflink系统具有足够现代的内核和coreutils 7.5 ,则BTRFS确实具有克隆操作,该克隆操作完全可以满足您的需求,并且可以满足您的需求。 Wiki Source同样,bedup是一种工具,它将合并整个卷中的重复项。CoW还是btrfs快照技术IIRC的驱动功能。


我知道,cp --reflink但请注意,我实际上希望FS透明地检测克隆并使用引用。我也不喜欢这个bedup工具。
DejanLekic 2012年

当用户级进程从一个文件读取并写入另一个文件时,FS层如何知道它是一个精确副本而不是修改后的副本?这就是为什么有一个单独的ioctl用于克隆而不是读写的原因。想要克隆文件并希望使用CoW的应用程序应该在可用时使用此类东西,否则回退。FS层没有可靠的魔术方法可以检测到正在发生的复制并执行CoW。应用程序必须使用正确的作业调用(cp --reflink/ clone)或单独的工具才能稍后完成作业(bedup)。
afrazier 2012年

通过比较哈希值(更安全)或crc + timestamp值。写入肯定会导致FS创建文件的独立副本。此外,可以在页面级上实现此系统...
DejanLekic 2012年

在内核中到底是在哪里完成的?您所说的不是一个简单的问题。也可以在页面级别执行此操作,但需要大量RAM进行内联-ZFS可能超过每TB数据20 GB的RAM [来源 ],而OpenDedup希望每TB数据8 GB的RAM。 / 4k页[来源 ]。使用L2ARC可以降低ZFS的要求,但会降低性能。
afrazier 2012年

1
WHS不会进行重复数据删除,除非您正在谈论备份存储。对于备份软件,客户端可以完成大部分工作,并在向服务器发送任何要写入的数据之前与服务器一起检查哈希。备份服务是与文件系统完全不同的野兽。对一个人有用的策略可能对另一个人不可行。
afrazier 2012年


0

Zfs,btrfs,ext3cow,bcachefs(afaik,但有可能尚未实现)。微软有一个正在开发中,但是由于未知原因他们停止了。

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.