如何让已经复制的文件共享片段(reflink)?

如何让已经复制的文件共享片段(reflink)?

我每天将文件复制到不同的 XFS 卷,如下所示:

# on monday
cp --sparse=always /mnt/disk1/huge.file /mnt/disk2/monday/huge.file
# on tuesday
cp --sparse=always /mnt/disk1/huge.file /mnt/disk2/tuesday/huge.file

现在它占据了disk2 上两个文件的全部大小。

在同一分区上,我通常会使用--reflink=auto,因此复制的文件共享片段并仅占用更改的块。但由于如果目标位于不同的卷上,这将不起作用,因此我需要一个解决方案来重新链接两个已存在的副本。

遗憾的是,cp它不会像rsync(没有引用链接支持)那样只复制更改的块,否则我会这样做:

# on monday
cp --sparse=always /mnt/disk1/huge.file /mnt/disk2/huge.file
cp --reflink=always /mnt/disk2/huge.file /mnt/disk2/monday/huge.file
# on tuesday
cp --sparse=always /mnt/disk1/huge.file /mnt/disk2/huge.file
cp --reflink=always /mnt/disk2/huge.file /mnt/disk2/tuesday/huge.file

答案1

我不知道 xfs,但 btrfs 有一个执行此操作的重复数据删除命令。看https://btrfs.wiki.kernel.org/index.php/Deduplication

您可以独立于副本运行重复数据删除步骤。

要直接执行您所要求的操作,您可以反转您的过程。

就像是:

  1. 从昨天的副本创建参考链接以创建基线

    cp --reflink=始终 /mnt/disk2/monday/huge.file /mnt/disk2/tuesday/huge.file

  2. 从其他位置读取源文件并直接将更新写入其中,例如:

    rsync --inplace --no-whole-file /mnt/disk1/huge.file /mnt/disk2/tuesday/huge.file

希望周一和周二的备份之间仅根据需要共享未更改的块。

警告:我还没有尝试过这个,也不知道它实际上会做你想要的事情。

https://superuser.com/questions/576035/does-rsync-inplace-write-to-the-entire-file-or-just-to-the-parts-that-need-to

这可能是无关紧要的,但也有一些讨论直接向 rsync 添加 reflink 支持。看:

我对那里的问题不太清楚。

相关内容