如果我想要复制一个数 GB 的非常大的连续文件,那么我的磁盘必须分配所有必要的空间并写入每个块的副本。
为什么复制不能“快速”到只复制对块的引用并且仅在发生更改时写入新块?
我理解这会导致磁盘上的数据量(由于块引用)与磁盘可能包含的数据超出其实际容量的脱钩。这也可能导致写入时占用大量空间,因为当它们从源块更改时必须写入全新的块。
这样的文件系统肯定会有独特的惩罚,但这听起来像一个有趣的用例。
目前是否存在采用类似方式处理数据的文件系统?
请注意,我不是文件系统专家,所以我的一些假设可能非常错误。欢迎在评论中提出任何更正。
答案1
你指的是reflink
。每Linuxcp
手册页:
指定时
--reflink[=always]
,执行轻量级复制,即仅在修改时复制数据块。如果无法做到这一点,则复制失败;如果--reflink=auto
指定,则退回到标准复制。用于--reflink=never
确保执行标准复制。
在 Linux 上,这是通过以下方式实现的:电话FICLONE
ioctl()
:
如果文件系统支持在多个文件之间共享物理存储(“reflink”),则
ioctl(2)
可以通过共享底层存储来使用此操作使src_fd
文件中的某些数据显示在文件中dest_fd
,这比单独复制数据要快。两个文件必须位于同一文件系统中。如果文件写入共享区域,则文件系统必须确保更改对于正在写入的文件保持私密。此行为通常称为“写时复制”。
BTRFS 支持 Reflink,并且Linux 内核 4.8 中的 XFS:
2016 年 8 月,Linux 内核 4.8 添加了一项新功能“反向映射”。这是大量计划功能的基础:快照、写时复制 (COW) 数据、数据重复数据删除、重新链接副本、在线数据和元数据清理、高度准确地报告数据丢失或坏扇区,以及显著改善受损或损坏的文件系统的重建。这项工作需要更改 XFS 的磁盘格式。
cp -z ...
和功能reflink()
在 Solaris 11.4 的 ZFS 上可用。ZFS reflink 支持可能在某个时候在 OpenZFS 和 ZFSonLinux 中可用。请参阅https://github.com/zfsonlinux/zfs/issues/405
答案2
您指的是“写时复制”或 COW 的文件系统,而您所指的特定功能是 reflink 文件复制。
COW 文件系统无需复制文件内容,而是可以让新文件引用另一个文件的内容,只记录两个文件之间的相互差异。这使得您所说的复制过程几乎是即时的。
COW 文件系统也能够使用相同的模型对现有数据进行重复数据删除。有关示例,请参阅带有 bedup 的 BTRFS 或 ZFS。
这种方法的缺点是需要维护元数据来维护此类文件链接 - COW 文件系统往往会消耗大量磁盘空间来存储元数据。它还需要大量 CPU 时间来支持此功能和其他相关功能。
答案3
只需添加几个指向@Spooler 答案的链接:
- Linux 上的 ZFS 项目。开发非常积极,根据我的经验,效果非常好。许多流行的 Linux 发行版都有可用的软件包。(与 Ubuntu 捆绑在一起。)
- Aaron Toponce 的 ZFS 页面. 有点过时,但是一个很好的介绍