我正在尝试创建一个脚本来创建两个都快照备份和差异备份,但使用硬链接代替重复文件。换句话说:
- 当前快照备份和上一个快照之间所有未更改的文件都被硬链接,而不是被复制;
- 差异备份上的所有文件都是当前快照上的文件的硬链接。
让我试着澄清一下。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
选项。