创建硬链接差异备份(尝试使用 rsync)

创建硬链接差异备份(尝试使用 rsync)

我正在尝试创建一个脚本来创建两个都快照备份差异备份,使用硬链接代替重复文件。换句话说:

  • 当前快照备份和上一个快照之间所有未更改的文件都被硬链接,而不是被复制;
  • 差异备份上的所有文件都是当前快照上的文件的硬链接。


让我试着澄清一下。Be:

  • $SRC:源树,需要备份的原始文件
  • $PREV:上一个快照备份
  • $SNAPSHOT:当前快照备份
  • $DIFF:差异备份(仅更改的文件)
  • $RF:rsync 标志,例如 -aPhvv


我可以使用以下命令创建硬链接快照:

rsync $RF --link-dest=$PREV $SRC $SNAPSHOT

这工作得很好。


现在我想创建另一棵树,,仅包含和$DIFF之间的差异。 $SNAPSHOT$PREV

我可以使用以下命令来做到这一点:

rsync $RF --compare-dest=$PREV $SNAPSHOT $DIFF

$PREV这也很好用,非常接近我想要实现的效果。唯一的问题是,在和之间更改的所有文件$SNAPSHOT现在都复制到 上$DIFF,我希望它们是硬链接,$SNAPTSHOT而不是纯副本。


从 rsync 的角度来看,我想要做的是:创建快照后,它将成为我的新源树。$SNAPSHOT目标是$DIFF。与源进行比较的基础是$PREV,因此参数--compare-dest=$PREV应该处理它。这与上一个命令一样,只会复制上一个快照和当前快照之间更改的文件。现在,对于要复制的文件,我希望先将它们与 $SNAPSHOT 中的文件进行比较,然后(如果存在)链接它们而不是复制。这就是它的作用--link-dest=$SNAPSHOT,而且也有效。这两个选项单独使用效果都很好,compare-dest可以创建差异副本并link-dest创建链接树,但我想以上述方式混合使用两者,即 rsync才不是允许。

如果 rsync 允许的话,这就是我想要做的:

# Create the snapshot backup:
myhost:~$ rsync $RF --link-dest=$PREV $SRC $SNAPSHOT
     // successful. output suppressed...

# Try to create the hard linked differential backup:
myhost:~$ rsync $RF --compare-dest=$PREV --link-dest=$SNAPSHOT $SNAPSHOT $DIFF
rsync: You may not mix --compare-dest, --copy-dest, and --link-dest.
rsync error: syntax or usage error (code 1) at main.c(1567) [client=3.1.2]


关于如何创建$DIFF树,使树上的文件全部成为硬链接,您有什么想法$SNAPSHOT吗?或者关于如何使用其他 Linux 命令实现我的目标的其他建议?

答案1

您可以通过以相反的顺序创建$DIFF和来完成此操作。首次运行$SNAPSHOT

rsync $RF --compare-dest=$PREV $SRC $DIFF

然后创建上一个备份的硬链接副本:

cp -al $PREV $SNAPSHOT

最后,将更改硬链接复制到那里:

cp -al $DIFF $SNAPSHOT

注意:我实际上还没有测试过这一点,所以不能保证它有效。

答案2

请注意,--link-dest可以多次指定选项(自 rsync 版本 2.6.4 起)。它允许$SNAPSHOT以以下方式创建:

rsync $RF --compare-dest=$PREV $SRC $DIFF

rsync $RF --link-dest=$PREV --link-dest=$DIFF $SRC $SNAPSHOT

注意:如果文件内容相同,但有些保存属性不同(时间戳、权限、所有权等)——目标文件不会被跳过或链接,而是被复制。

关于时间戳属性——当时间戳不同时,文件(具有相同内容)将被复制,即使时间戳不被保留但仅用于文件比较(至少在 rsync 3.1.1 中)。解决方法:使用--size-only--checksum选项。

相关内容