如何让 rsync 建立到源目录的硬链接,同时备份更改的文件?

如何让 rsync 建立到源目录的硬链接,同时备份更改的文件?

我有两个备份目录位于备份服务器上的同一文件系统上。第一个称为“克隆” - 它包含我的笔记本电脑的克隆,每晚通过 rsync 远程更新。第二个称为“备份”,它是仅克隆重要部分的每周 rsync 快照。为了节省空间,使用 --link-dest 将“备份”创建为克隆而不是副本的硬链接:

rsync -avum --link-dest=/clone /clone/ /backup

现在我还想使用 --backup 选项将已更改文件的旧版本从备份复制到保留区域,以防我需要它们或意外删除重要的内容。这在没有 --link-dest 的情况下工作正常:

rsync -avumb --backup-dir=/holding/2016_10_22 /clone/ /backup

但是,这会在备份中创建已更改文件的副本,浪费空间 - 我想要硬链接。但是如果我将 --link-dest parm 添加回来:

rsync -avumb --backup-dir=/holding/2016_10_22 --link-dest=/clone /clone/ /backup

...那么只有已删除文件已备份。更改的文件会默默地硬链接。原因(我相信)是 --link-dest 共享 --copy-dest 的逻辑。即,如果源文件相对于复制目标(或链接目标)文件没有更改,则不会传输它,而是从复制/链接目标目录复制/链接到目标目录。因为我使用源目录作为链接目标目录,所以所有未删除的文件都是“不变的”,并以静默方式处理。

我可以分两步完成此操作:首先 --backup 不带 --link-dest,然后再次 --link-dest 不带 --backup。 (较新版本的 rsync 将用硬链接替换相同的文件。)但我真的更喜欢一次性完成所有操作。

有没有一种方法可以在仅创建硬链接的情况下进行 --backup ? (我真正想要的是带有硬链接而不是文件传输的“常规”rsync。考虑到该选项的预期逻辑,我对 --link-dest 的使用似乎有点像黑客。)

额外问题:手册页似乎表明仅在空目标上使用 --link-dest 是首选:

当复制到空目标层次结构时,此选项效果最佳,因为现有文件可能会调整其属性,并且这可能会通过硬链接影响备用目标文件。此外,逐项列出更改可能会有点混乱。

关于逐项列出“混乱”的部分有点含糊。假设我不太关心文件属性,在非空目标上使用 --link-dest 真的“危险”吗?谁能举个例子吗?

答案1

如上所述,我最终分两步运行了该过程。

src = the "live" clone directory, a mirror of my laptop = primary backup
dst = the weekly snapshot of important parts clone
trashdir = the items from src that don't exist in dst, because they have since been deleted, sorted into date-stamped directories

cmd = ("rsync -avumb --stats --delete --delete-excluded --filter='merge %s' --backup-dir=%s %s %s" %
       (filterfile, trashdir, src, dst))

cmd = ("rsync -avum --stats --delete --delete-excluded --filter='merge %s' --link-dest=%s %s %s" %
       (filterfile, src, src, dst))

第一步对克隆的重要部分进行备份,并将自上次备份以来删除的文件保存到trashdir。 (出于某些原因,我只希望对选定的文件进行中间备份,并且只希望每周更新一次。)

第二步将备份中的文件转换为指向克隆的硬链接。结果是备份占用的实际空间为零。根据定义,trashdir 不是硬链接文件,因为它仅包含从克隆和备份中删除的文件。

我不完全确定 --delete-excluded 标志是否必要(特别是在第二个命令中)。我把它们留在那里,以防我更改过滤文件,它定义了创建备份时要忽略克隆的哪些部分。

我发现五年内,trashdir 已经增长到大约克隆的大小,因此总大小 = 克隆 x2,这对我来说是可以接受的,因为我有六年的已删除文件历史,并且可以通过以下方式轻松修剪它们日期。

除了上述内容之外,我还有一个脚本,可以运行cp -al将克隆复制到大约一个月的带有日期标记的旋转硬链接快照中。这涵盖了已更改而不是已删除的文件。一个月的总大小似乎约为克隆大小的一半。

所以总磁盘空间约为克隆的 2.5 倍,我有:

  • 克隆本身,每晚更新
  • 选定文件的备份,稳定一周
  • 一个月的版本化克隆快照
  • 六年的已删除文件

我认为这可以很好地防止丢失原始磁盘、覆盖文件并需要旧版本以及删除文件并稍后需要它。

这有点复杂,可能可以通过第三方软件来实现,但它对我有用,并且基于低级工具构建,这些工具不太可能消失或显着改变功能。

(@gsl - 实际上,感谢您请求更新。我发现当我更新到 python3 时,我的一个脚本坏了,并且已经几个月没有运行了。我需要更多地关注我的错误日志!)

不过,我仍然对简化此操作的方法感兴趣 - 因此,如果我正在做的事情可以通过某种更简单的方式完成,请随时发表评论。

相关内容