我每天将文件复制到不同的 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
您可以独立于副本运行重复数据删除步骤。
要直接执行您所要求的操作,您可以反转您的过程。
就像是:
从昨天的副本创建参考链接以创建基线
cp --reflink=始终 /mnt/disk2/monday/huge.file /mnt/disk2/tuesday/huge.file
从其他位置读取源文件并直接将更新写入其中,例如:
rsync --inplace --no-whole-file /mnt/disk1/huge.file /mnt/disk2/tuesday/huge.file
希望周一和周二的备份之间仅根据需要共享未更改的块。
警告:我还没有尝试过这个,也不知道它实际上会做你想要的事情。
这可能是无关紧要的,但也有一些讨论直接向 rsync 添加 reflink 支持。看:
- https://github.com/WayneD/rsync/issues/153
- https://www.reddit.com/r/btrfs/comments/ijby0b/does_rsync_support_reflinks_for_btrfs/
我对那里的问题不太清楚。