是否存在可以为用户有效且透明地处理数据重复的文件系统?
例子:
- 我有
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_a
并file_b
共享 1MB 的公共块。
当然,这出于多种原因而非常棘手:假设我们有 2 个重复的文件file_a
,file_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 错误永远不会进入磁盘来解决这个问题。