高效、透明地处理数据重复的文件系统

Bas*_*asj 5 windows linux mac filesystems duplicate

是否有文件系统可以为用户高效且透明地处理数据重复?

例子:

  • 我有C:\documents\2019\bigfile.csv(250 MB)
  • 我将其复制到C:\temp\bigfile.csv,磁盘上的已用空间仍然是 250 MB(而不是 500 MB!),写时复制样式
  • 我修改了几行bigfile.csv:磁盘上使用的空间可能是 251 MB(但仍然不是 500 MB)

示例2:

  • myOSinstalldisk.iso我在磁盘上某处有一个文件
  • 6 个月后,我在没有注意到的情况下从互联网上重新下载了相同的文件,并将其保存在其他地方:操作系统自动注意到这一点,实际上磁盘上没有使用新空间

如果操作系统自动将每个文件分割成 1 MB 大小的块,并保存它们的 SHA256 哈希值(对于每个 I/O 操作),那么这可以透明地工作。在示例 2 中,当保存myOSinstalldisk.iso到磁盘时,操作系统会注意到块已经在 FS 中(哈希表中已经存在 SHA256 哈希值),并且无需为此再次浪费磁盘空间。

Windows 上哪个 FS 支持此功能?有一些 Mac 版的吗?Linux?

另请参阅:在 Linux 上有效存储重复文件

PS:我不是在寻找Windows快捷方式,也不是符号链接,也不是连接点等(我已经知道并使用这个)


这样的 FS 将具有例如:

Chunk table
==========
SHA256 of the chunk         Location on disk (sector)
2cb4b1431b84ec15...         3467634
d35ed83bb927e27e...         23789
8967d75f4bcd9cc4...         872372
b25c8d879ae23e18...         1265152
...

File table 
==========
File                        Chunks
/home/user/file_a           8967d75f4bcd9cc4... b25c8d879ae23e18... 2cb4b1431b84ec15...
/home/user/file_b           b25c8d879ae23e18... d35ed83bb927e27e...
Run Code Online (Sandbox Code Playgroud)

在这个(伪)示例中,我们看到了这一点file_afile_b共享 1MB 的公共块。

当然,由于多种原因,这很棘手:假设我们有 2 个重复的文件file_a,并且file_b我们只是在 的开头附加 1 个字节file_b,那么每个块的 SHA256 哈希值将不同,因此被视为不同的数据...也这样FS 需要保留使用特定块的文件数量的计数器,以便知道何时不再需要它(垃圾收集器样式)等。

gro*_*taj 5

ZFS

ZFS 支持带内基于块的重复数据删除。它是一个文件系统/LVM 混合体,对 Linux 和 FreeBSD 有良好的支持。ZFS 提供了很多令人惊叹的功能:基本上,从文件数据到文件系统元数据的所有内容都会进行校验和,因此可以立即检测到文件系统损坏,甚至可以使用 RAID-Z(由 ZFS 本身单独管理的 RAID)进行修复。

但要付出代价。首先,性能不如传统文件系统。ZFS 关注的是可靠性,而不是速度。其次,基本 ZFS 至少需要 1 GB RAM + 对于您希望进行重复数据删除的每 1 TB 存储,需要 1 GB RAM(有关可用块的信息必须存储在某处,以便高效进行重复数据删除)。重要的是它必须是 ECC RAM(用于服务器和 Apple 计算机,普通 PC 使用非 ECC),因为与传统文件系统不同,翻转位不仅会损坏数据 - 例如。元数据校验和损坏,它可能会不可挽回地损坏文件系统。ECC 通过确保 RAM 错误永远不会写入磁盘来修复此问题。