我们已经看到操作系统在分叉进程时进行写入时复制优化。原因是大多数情况下 fork 之前都是 exec,因此我们不希望产生不必要的页面分配和从调用者地址空间复制数据的成本。
那么,在具有 ext4 或 xfs(日志)文件系统的 Linux 上执行 CP 时也会发生这种情况吗?如果它没有发生,那为什么不呢?
答案1
答案2
要搜索的关键字是reflink
。它最近在 XFS 中实现。
编辑:XFS 实现最初被标记为实验性的。在我写下上述内容几个月后,这个警告在内核版本 4.16 中被删除了:-)。
答案3
Linux 有一个系统调用,允许用户空间进程告诉内核在写时复制文件副本。 FICLONERANGE 和 FICLONE 用作 ioctl 的选项,允许在写入时复制文件和文件内的范围。
cp --reflink 使用它来制作文件系统支持的副本。
答案4
除非您引入系统调用cp
(或至少复制块),否则操作系统很难确定程序cp
要写入的数据与刚刚从另一个块读取的数据相同。最重要的是,您需要额外的开销来管理“多个文件共享相同的块”场景。仅少数块不同的大型相似文件很少发生。因此,总体而言,仅复制这些块,然后将管理开销添加到全部文件。
现在,如果您通过在 BTRFS 中添加文件系统的另一个克隆/快照来“复制”文件(很多),情况就会有所不同:现在您已经“复制”了全部文件系统中的文件,对它们的任何更改都将是写时复制。这个存在,但在 ext4 中不存在。
“日记”是一个完全独立的概念,重要的是文件的管理结构。