在家里,我有以下备份方案:所有计算机每天 rsync 到服务器 $FULL_COPY 目录。服务器每天(也每周/每月)拍摄该目录的快照,最多保留 X 个快照。还使用rsync:
rsync -ar --link-dest=$LATEST_SNAPSHOT $FULL_COPY $NEW_SNAPSHOT
这很好用,自上次快照以来未更改的文件被硬链接。问题是大文件(准确地说是 Thunderbird 的收件箱),一个小更改就意味着文件的完整副本。我的快照很容易就有几 GB,但也许只有几 MB 发生了变化。
有没有更聪明的方法来做到这一点? (我的 $FULL_COPY 也被复制到远程计算机上,所以我不需要这种冗余)。我唯一的想法是支持快照的 CoW 文件系统。但这意味着对我的系统进行重大手术,而我不喜欢这样做。
答案1
我在这里写了一篇很长的文章,但它真的很简单,使用补丁。
像往常一样制作 $FULL_COPY,但对于 $NEW_SNAPSHOT,排除非常大的文件。
现在,假设它是一个文件,并且该文件的路径是 /home/myuser/.mail/INBOX,您将运行:
rsync -ar --link-dest=$LATEST_SNAPSHOT $FULL_COPY $NEW_SNAPSHOT --exclude=/home/myuser/.mail/INBOX
这将大大减少拍摄快照的时间。
接下来,让我们填写路径以更加清晰。假设 $FULL_COPY 的“根”目录位于 /mnt/full 下,因此用户邮件目录的完整备份位于 /mnt/full/home/myuser/.mail/INBOX。同样,快照同样位于 /mnt/snap-mm-dd-yy 下。
然后,要仅获取收件箱的增量并将其放入有意义的位置的正确日期快照中,请运行:
diff -u /mnt/full/home/myuser/.mail/INBOX /home/myuser/.mail/INBOX > /mnt/snap-mm-dd-yy/home/myuser/.mail/INBOX.delta
这里你所做的是使用 diff 为完整备份邮件文件创建今天邮箱文件的补丁文件(diff 的 -u 选项可以做到这一点),并将补丁文件发送到可预测位置(即用户的该日期的 .mail 目录)。
最后,如果/当您因为丢失原始邮箱而需要将邮箱恢复到快照当天的样子时,请首先使用 $FULL_COPY 和 $SNAP_SHOT 将所有内容恢复到原始路径。然后,运行补丁程序来恢复 INBOX 增量:
patch < /mnt/snap-mm-dd-yy/home/myuser/.mail/INBOX.delta
就是这样。
笔记:
1) 如果您查看 INBOX.delta,前两行是旧文件和新文件的路径,因此如果您不想使用原始路径进行修补,可以对其进行编辑。
2)尽管三角洲每天都在变大一点,但它仍然比整体小得多。增加增量直到下一次完整将比创建多个补丁更有效地利用资源。