我正在尝试在Ubuntu上设置备份脚本.每天我都想将本地源目录复制到使用日期唯一命名的远程服务器上的备份目录. (例如,backup-jan1 /,backup-jan2 /等)它应该存储最早状态的镜像并使用差异文件来重新创建新的备份点.
使用rsync非常简单.我已经设置了一个脚本来进行备份,使用当天命名备份目录,并为最新备份创建一个符号链接(已经编辑了IP):
date=`date "+%m%d"` rsync -ave ssh /srv root@150.69.32.8:/backup/backup-$date/ ssh root@150.69.32.8 rm -rf /backup/current ssh root@150.69.32.8 ln -s backup-$date/ /backup/current
但是,这是一个棘手的部分:我不希望它复制没有改变的文件.因此,如果自上次每日备份以来任何文件发生了更改,它将像平常一样复制它们.否则,它会将未更改的先前备份文件从其第一个备份目录符号链接到新备份. (有点像git)
因此,例如,假设我开始备份Jan 1. backup-jan1 /目录将包含所有原始备份文件.第二天,1月2日备份应该只复制24小时内更改的文件.对于所有其他文件,它将从Jan 1备份文件中创建符号链接. 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中寻找这种版本控制类型的功能,但我还没有找到它.任何人都可以建议像这样的备份策略吗?
解决方法
您似乎正在寻找的是–link-dest功能,它是rsync的一部分.你似乎描述的是
dirvish的运作方式.
link-dest选项创建从目标路径到结构的另一个副本的硬链接.
使用dirvish执行初始备份,只使用rsync.
之后,每个额外的后退都与之前的成功备份硬链接.意思是没有重复的文件.您可以直接从Vault中访问任何单个备份,每个备份都是完整的备份.您可以随时删除以前的备份.
这是一个可用于演示的脚本.
# 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/