有没有办法创建目录的写时复制副本?

有没有办法创建目录的写时复制副本?

我在考虑这样一种情况:我会创建一个目录的副本,调整一些文件,然后对结果进行一些处理。这会经常进行,可能一天几十次。(确切的用例是测试补丁提交;复制代码、修补代码、构建/测试/报告/等等。)

我所寻找的可以通过创建一个新的目录结构并用来自原始目录的硬链接填充它来实现。但是,这只有在您使用的所有工具都删除并重新创建文件而不是就地编辑文件时才有效。

有没有办法让文件系统写时复制寻找文件?


注意:我知道许多 FS 在块级别使用 COW(所有更新都是通过写入新块来完成的)但这不是我想要的。

答案1

如果您可以选择文件服务器的平台,我会选择最新的 OpenSolaris 版本并使用 ZFS 的重复数据删除功能。这样,文件的副本就不会占用额外的空间,甚至文件之间的公共段也不会被复制。

您可以在此处阅读有关 ZFS 重复数据删除的所有内容Jeff Bonwick 博客上的这篇文章

答案2

我在寻找比我目前的解决方案更好的解决方案时发现了这个问题,如下所示cp -al SOURCEDIRNAME copy.SOURCEDIRNAME

find SOURCEDIRNAME -type d -exec mkdir -p copy.{} ';'
find SOURCEDIRNAME -type f -exec ln {} copy.{} ';'

此时,我有一个带有一堆硬链接的结构副本。这个工作相对较快,并且不需要更多的磁盘空间,因为我们并不是真的复制所有文件。现在我可以patch在复制目录上做一些“东西”(比如或构建)。如果他们不修改原始文件,只需重命名它们和/或创建新文件。完成工作后,我有一些结果,可以删除复制目录并重新开始。

如果你使用更复杂的工具并且不信任它们(或者你知道它们会试图覆盖现有文件),你可能需要牛舞者

答案3

尝试使用 UniouFS、AUFS 或覆盖文件系统(取决于你的发行版支持哪种)

例如,docker 使用 OverlayFS 作为合并层的驱动程序之一

覆盖文件系统

覆盖主要涉及目录。如果给定名称同时出现在上层和下层文件系统中,并且引用其中任一文件系统中的非目录,则下层对象将被隐藏 - 该名称仅引用上层对象。

当上层对象和下层对象都是目录时,会形成合并目录。

在挂载时,作为挂载选项“lowerdir”和“upperdir”给出的两个目录将合并为一个合并目录:

mount -t overlay overlay -olowerdir=/lower,upperdir=/upper,workdir=/work /merged

“workdir” 需要是与 upperdir 位于同一文件系统上的空目录。

答案4

可能是 SVN 或者其他版本控制工具 (git, cvs)?

相关内容