是否有任何文件系统为CP实现写入时复制机制


16

我们已经看到OS在分叉过程时会执行写时复制优化。原因是大多数时候fork是由exec处理的,因此我们不想承担页面分配和不必要地从调用者地址空间复制数据的开销。

在具有ext4或xfs(日记)文件系统的linux上执行CP时,也会发生这种情况。如果没有发生,那为什么不呢?


希望有人会回答这个有趣的问题
Karim Manaouil,2017年

但是我不这么认为,因为,例如,压缩一个大文件将花费相当长的时间(将数据复制到新块)。如果这样的文件系统中存在一个COW(至少是ext3 / ext4),您将不会注意到时间延迟(也许在这种情况下,仅复制inode而没有指向数据块的指针并标记一些COW标志)。
卡里姆·马纳维尔

写时复制在ZFS上实现,并且确实具有非常便宜的文件系统/卷克隆。我相信ext4 / xfs的磁盘格式太原始了,无法支持这种格式
myaut

Answers:


7

要搜索的关键字是reflink。它最近在XFS中实现。

编辑:XFS实现最初被标记为EXPERIMENTAL。在我写上面的:-)几个月后,该警告在内核版本4.16中被删除。


11

cp 手册页

当指定--reflink [= always]时,执行轻量级复制,仅在修改时复制数据块。如果这不可能,则复制失败,或者如果指定了--reflink = auto,则退回到标准副本。

这适用于支持写时复制reflink)的文件系统,目前主要是BTRFS。XFS reflink实现正在开发中[1] [2]


1
诸如NFS,CIFS,OCFS2之类的某些网络文件系统也可能会将这些文件系统传递给服务器。
斯特凡Chazelas

2

Linux有一个系统调用,它允许用户空间进程告诉内核在文件的写副本上进行复制。用作ioctl的选项的FICLONERANGE和FICLONE允许在文件的写副本上进行复制以及在文件中进行范围复制。

cp --reflink使用它在文件系统支持的位置创建副本。


1

除非为您引入系统调用cp(或至少要复制一个块),否则操作系统很难确定cp程序要写入的数据与从另一个块读取的数据相同。最重要的是,您将需要额外的开销来管理“多个文件共享相同的块”方案。大型相似文件只有几个块之间的差异很少发生。因此,仅复制这些块,然后将此管理开销添加到所有文件中,总体上来说比较便宜。

现在,如果您通过在BTRFS中添加文件系统的另一个克隆/快照来“复制”文件(很多文件),情况将有所不同:现在,您已经“复制”了文件 文件系统中的所有文件,并且对它们将是写时复制。它存在,但在ext4中不存在。

“日记”是一个完全独立的概念,重要的是文件的管理结构。


大文件(一个文件是另一种极为罕见的文件的二进制副本)的单个位不同,并且发生这种错误是由于错误。
bitifet

引入了系统要求复制的功能(请参阅我的答案)。
鸭嘴兽Q
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.