我正在尝试在Ubuntu上设置一个备份脚本。 我每天都想将本地源目录复制到以date唯一命名的远程服务器上的备份目录。 (例如,backup-jan1 /,backup-jan2 /等)应该存储最早状态的镜像并使用差异文件来重新创build新的备份点。
rsync很简单。 我已经设置了一个脚本来做备份,在当天命名备份目录,并且创build一个符号链接到最近的备份(IP已被编辑):
date=`date "+%m%d"` rsync -ave ssh /srv [email protected]:/backup/backup-$date/ ssh [email protected] rm -rf /backup/current ssh [email protected] ln -s backup-$date/ /backup/current
但是,这里是棘手的部分: 我不希望它复制没有改变的文件。 所以,如果自上次每日备份以来有任何文件发生了变化,它将像正常一样复制它们。 否则, 它会将先前已备份的文件从其第一个备份目录符号化为新备份。 (有点像git)
因此,举个例子,假设我开始备份Jan 1。backup-jan1 /目录将包含所有的原始备份文件。 第二天1月2日的备份应该只复制在24小时内更改的文件。 对于所有其他文件,它将从Jan 1备份文件中创build符号链接。 在1月3日,我添加了一个文件并删除了另一个文件。 如果一个文件被删除,它不应该继续被链接。
示例目录/文件结构:
backup-jan1/ (initial backup) file_a file_b backup-jan2/ (no changes) file_a (symlink to ../backup-jan1/file_a) file_b (symlink to ../backup-jan1/file_b) backup-jan3/ (removed file_a symlink and added file_c) file_b (symlink to ../backup-jan1/file_b) file_c ...
我试图在rsync和rsnapshot中寻找这个版本控制types的function,但我还没有find它。 任何人都可以提出这样的备份策略吗?
你似乎在寻找的是rsync的一部分 – --link-destfunction。 你似乎描述的是如何运作。
link-dest选项创build从目标path到结构的另一个副本的硬链接。
随着你的决定,你执行一个初始备份,它只是使用rsync。
之后,每增加一个回退,就会硬链接到以前的成功备份。 意思是没有重复的文件。 您可以直接从保险库内访问任何单个备份,并且每个备份都是完整的完整备份。 您可以随时删除以前的备份。
这是一个你可以用来演示的脚本。
# create test area mkdir -p /tmp/backuptest/{source,dest1,dest2,dest3} for a in `seq 10` ; do dd if=/dev/urandom of=/tmp/backuptest/source/file$a bs=1M count=1; done # look find /tmp/backuptest/ -ls ; du find /tmp/backuptest/ # initial backup rsync -va /tmp/backuptest/source/ /tmp/backuptest/dest1/ # look find /tmp/backuptest/ -ls ; du find /tmp/backuptest/ # make chagnes rm /tmp/backuptest/source/file[2-4] cat /tmp/backuptest/source/file[6-7] >/tmp/backuptest/source/file11 # new backup linked to previous rsync -va /tmp/backuptest/source/ /tmp/backuptest/dest2/ --link-dest=/tmp/backuptest/dest1/ # look find /tmp/backuptest/ -ls ; du find /tmp/backuptest/ # make changes rm /tmp/backuptest/source/file5 cat /tmp/backuptest/source/file[5-7] >/tmp/backuptest/source/file12 # new backup linked to previous rsync -va /tmp/backuptest/source/ /tmp/backuptest/dest3/ --link-dest=/tmp/backuptest/dest2/ # look find /tmp/backuptest/ -ls ; du find /tmp/backuptest/ # remove dest1 rm -r /tmp/backuptest/dest1/ # see your dest2, and dest3 are still complete backups for the state at those times. find /tmp/backuptest/ -ls ; du find /tmp/backuptest/
您可以使用带“-l”选项的“cp”作为硬链接复制。 如果你所有的源和目标都在同一个文件系统上,这将会非常快。
所以,你的原始目录是“backup-jan1”,下一个是“backup-jan2”。 在这种情况下,请执行:
cp -al backup-jan1 backup-jan2
然后运行你的rsync对backup-jan2。 当rsync遇到更改的文件时,它将从backup-jan1中的原始文件中取消链接,并在backup-jan2中创build一个新的文件(名称相同)。
第二天,你会做:
cp -al backup-jan2 backup-jan3
与您的rsync备份jan3。 同样,备份中的新文件将导致backup-jan3等中的链接断开。
在这种情况下,如果在backup-jan1中有3个文件,并且在这三天中file1保持不变,file2只在jan2上变化,并且file3每天都在变化,那么您将拥有file1作为所有硬链接三个目录,file2作为两个文件(一个在backup-jan1中,一个在backup-jan2和backup-jan3中硬连接),file3作为每个目录中的三个文件。