虚拟文件系统

虚拟文件系统

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

例子:

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

示例 2:

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

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

在 Windows 上哪些 FS 支持此功能?有适用于 Mac 和 Linux 的吗?

也可以看看:在 Linux 上高效存储重复文件

附言:我不是在寻找 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...

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

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

答案1

虚拟文件系统

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 错误永远不会进入磁盘来解决这个问题。

相关内容