有没有支持按日期部分备份的备份工具?我的意思是,我有一些小型驱动器,例如笔记本电脑上的驱动器,无法保存外部 2TB 驱动器上所有文件的完整副本。我想在笔记本电脑上保留最新的文件,这些文件通常是我正在使用的文件。但同时我希望能够同步其他存储空间有限的驱动器。因此,每个小驱动器应包含在特定日期(例如 3 个月前)之后创建或修改的文件。假设我有两台笔记本电脑,每台都有不同的磁盘大小。对于驱动器较小的笔记本电脑,我可能只希望显示上个月的文件。两台笔记本电脑上的所有文件以及 3 个月以上的所有其他存档文件都应备份在大型外部驱动器上。因此,外部驱动器应该镜像两个较小的驱动器并保持它们同步。我尝试过使用unison
,但似乎不支持按日期备份。也许rsync
使用一些 shell 脚本就可以工作,但我想在实施新解决方案之前先检查是否存在解决方案。
答案1
我没有为此使用任何专用程序,但通过 cron、bash、tar 的组合来组织和微调非常容易(增量转储) 和/或 rsync。在我看来,有两种最佳解决方案,我根据具体情况使用两者或其中之一。我认为第一个更适合您,但我将在这里描述两者。
增量 tar 档案
该解决方案的核心是一个可能如下所示的脚本:
#!/bin/bash
# You will need to set the variables $EXCLUDE, $DATA and $BACKUPS
# as environment variables, in ~/.bashrc or somewhere.
OPTS="--create --no-check-device --bzip2 --verbose -X $EXCLUDE"
for d in `ls $DATA`; do
SNAPSHOT=$BACKUPS/$d.snar
if [ $1 == full ]; then
echo "Archiving $d (full)..."
rm -rvf $SNAPSHOT
ARCHIVE=$DATA/$d.`date --iso-8601`.full.tar.bz2
tar $OPTS --file=$ARCHIVE --listed-incremental=$SNAPSHOT $DATA/$d
fi
if [ $1 == increment ]; then
echo "Archiving data/$d (increment)..."
ARCHIVE=$DATA/$d.`date --iso-8601`.tar.bz2
tar $OPTS --file=$ARCHIVE --listed-incremental=$SNAPSHOT $DATA/$d
fi
done
这假设有子目录,$DATA
并且每个子目录都备份在单独的存档中。如果您的设置不同,请自定义脚本。
您可以在 crontab 中安排备份,如下所示:
# m h dom mon dow command
44 1 1 */2 * ~/bin/backup_data full > ~/backups/data/logs/`date --iso-8601`.full.log 2>&1
44 5 * * * ~/bin/backup_data increment > ~/backups/data/logs/`date --iso-8601`.log 2>&1
正如您所看到的,在这种情况下,每两个月创建一次完整备份,并且每天都会创建从该完整转储开始的增量备份。当您丢失一个文件甚至更改时间戳时,tar 中的增量存档就会出现问题。因此,偶尔创建一次完整转储是谨慎的做法。
至于机器之间的同步和删除旧文件,您应该将该任务与备份本身分开,因为它确实是正交的。当然,使用 rsync 进行同步,不使用该--delete
选项,这样您就不会丢失大型外部驱动器上的任何数据。所以你的命令可能是:
rsync -av /backups/data /mnt/external
如果笔记本电脑上安装了外部驱动器。否则,您将需要通过网络执行此操作,如下所示:
rsync -av /backups/data user@external:/backups/data
如果您想从笔记本电脑中清除超过 90 天的存档,您可以这样做:
find /path/to/files -type f -mtime +90 -delete
再次,将这些内容放入您的 crontab 中。
使用 rsync 进行增量备份
您可以单独使用 rsync 来增量备份。我特别喜欢使用带时间戳的快照和硬链接,这只是一个命令。这是一个接近我通常使用的示例:
rsync --verbose --progress --stats --human-readable --archive --link-dest=/backups/data/`date --iso-8601 -d "one day ago"` /data/ /backups/data/`date --iso-8601`/
--link-dest
它基本上为未更改的文件创建到前一天快照(由 给出的快照)的硬链接。如果您运行不规律,您可以使用指向最新快照的符号链接,并在备份后更新该符号链接,如下所示:
rsync --verbose --progress --stats --human-readable --archive --link-dest=/backups/data/last /data/ /backups/data/`date --iso-8601`/ && rm -rvf /backups/data/last && ln -vs /backups/data/`date --iso-8601`/ /backups/data/last
最重要的是,您需要组织与外部驱动器的同步并删除旧快照。一般来说,这与我上面概述的第一个解决方案中的方法相同。但是,在计算机之间重新同步快照时,请确保使用-H
保留硬链接的选项。
概括
与使用 的解决方案相比tar
,我认为第二个解决方案管理起来更简单,并且所有文件始终可用。另一方面,使用存档可以利用压缩、使用更少的索引节点,并且在非服务器计算机上还有其他优点。
再次强调,尽可能在 crontab 中执行所有这些操作,这样您就不必记住它。如果您没有一直打开笔记本电脑,请选择经常使用的时间,也许每天执行几次,以便至少启动一些 cron 作业。更好的是,使用类似的东西纳克朗。
如果您想每天进行多次增量操作,您还可以手动运行备份脚本,并细化文件名/目录中的日期。显然,您需要尝试使用这些解决方案以使它们适合您的用例。
更新:带有我使用的示例脚本的存储库:https://github.com/langner/backup.sh/blob/master/backup.sh