如果我想要复制的千兆字节中有一个非常大的连续文件,那么我的磁盘必须分配所有必要的空间,并编写每个块的副本。
为什么复制不能“快速”,因为它只能在更改时复制对块的引用并写入新的块?
我理解,这将导致磁盘上有多少数据(由于块引用)与磁盘可能包含的数据超过其实际容量的可能性脱钩。这也可能导致在写入时占用大量空间,因为在从源块更改时必须编写全新的块。
这样的文件系统当然会受到独特的惩罚,但这听起来像是一个有趣的用例。
现在是否有任何文件系统利用类似的方式来处理数据?
请注意,我不是一个文件系统专家,所以我的一些假设可能是令人尴尬的错误。我欢迎对评论的任何更正。
发布于 2019-10-16 10:45:43
您所指的是一个reflink。根据Linuxcp手册页:
当指定
--reflink[=always]时,执行轻量级副本,其中数据块仅在修改时被复制。如果这是不可能的,复制失败,或者如果指定了--reflink=auto,则返回到标准副本。使用--reflink=never确保执行标准副本。
在Linux上,这是由这个FICLONEioctl()打电话实现的:
如果文件系统支持在多个文件("reflink")之间共享物理存储的文件,则此
ioctl(2)操作可用于通过共享底层存储使src_fd文件中的某些数据出现在dest_fd文件中,这比创建数据的单独物理副本更快。两个文件必须驻留在同一个文件系统中。如果文件写入发生在共享区域,则文件系统必须确保这些更改对正在写入的文件保持私有。这种行为通常被称为“在写上复制”。
BTRFS支持反射,Linux内核4.8中的XFS:
2016年8月,Linux内核4.8增加了一个新特性,即“反向映射”。这是大量计划功能的基础:快照、写入复制(COW)数据、数据去重复、reflink副本、在线数据和元数据清除、数据丢失或坏扇区的高度准确报告,以及严重损坏或损坏的文件系统的重建。这项工作需要更改XFS的磁盘上格式。
cp -z ...和这个reflink()函数可以在ZFS的Solaris11.4上使用。ZFSonLinux支持可能在某个时候在OpenZFS和ZFSonLinux中可用。请参阅https://github.com/zfsonlinux/zfs/issues/405
发布于 2019-09-26 04:43:41
您指的是一个文件系统,它是“复制在写上”或“牛”,您所指的具体特性是一个reflink文件副本。
与复制文件内容不同,COW文件系统可以使一个新文件引用另一个文件的内容,只记录两个文件之间的交互增量。这使得你所说的复制过程几乎是瞬间的。
COW文件系统还能够使用相同的模型去复制现有的数据。例如,请参阅带有bedup或ZFS的BTRFS。
这种方法的一个惩罚是,维护此类文件链接所需的元数据维护它还需要相当多的CPU时间来支持这一功能和其他相关功能。
发布于 2019-09-26 15:57:41
只需在@Spooler的回答中添加几个链接:
https://serverfault.com/questions/985659
复制相似问题