如果我想要复制一个非常大的连续文件(千兆字节),我的磁盘必须分配所有必要的空间并写入每个块的副本。
为什么从某种意义上说,副本不能“快速”,而是复制对块的引用并仅在进行更改时才写入新块?
我知道这将导致磁盘上的数据量(由于块引用)与磁盘似乎包含超过其实际容量的数据的可能性脱钩。这也可能导致写入占用大量空间,因为当它们从源块更改时必须写入全新的块。
这样的文件系统肯定会有独特的惩罚,但这听起来像是一个有趣的用例。
当今是否存在任何利用类似方式处理数据的文件系统?
请注意,我不是文件系统方面的专家,所以我的一些假设可能是令人尴尬的错误。我欢迎评论中的任何更正。
您指的是“写入时复制”或 COW 的文件系统,您所指的特定功能是 reflink 文件副本。
COW 文件系统可以让一个新文件引用另一个文件的内容,而不是复制文件内容,只记录两个文件之间的相互增量。这使得您所说的复制过程几乎是瞬时的。
COW 文件系统也能够使用相同的模型对现有数据进行重复数据删除。例如,请参阅带有 bedup 或 ZFS 的 BTRFS。
这种方法的一个缺点是维护此类文件链接所需的元数据维护 - COW 文件系统往往会消耗相当多的磁盘空间来存储元数据。支持此功能和其他相关功能也需要相当多的 CPU 时间。
你指的是一个
reflink
. 根据Linuxcp
手册页:在 Linux 上,这是通过调用实现的
FICLONE
ioctl()
:BTRFS 和Linux 内核 4.8 中的 XFS支持 Reflink :
cp -z ...
并且该reflink()
功能在 Solaris 11.4 for ZFS 上可用。ZFS reflink 支持可能会在某个时候在 OpenZFS 和 ZFSonLinux 中可用。见https://github.com/zfsonlinux/zfs/issues/405只需添加几个链接到@Spooler 的答案: