我一直在使用rsync snapshot script from Mike Rubel的修改版本,并且已经有一些问题调整它来做我想做的事情。他只拍小时快照;我希望通过crontab每小时,每天,每周和每月拍摄快照。
这是我的每小时剧本:
if [ -d $BUP/temp ] ; then
rm -rf $BUP/temp ;
fi;
rsync -avzO --delete --exclude-from=$CONFIG/rsync-excludes /home/jwhendy/ $DAT/jwhendy/ ;
rsync -avzO --delete --exclude=vault* --link-dest=../vault.hourly.0 $DAT/ $BUP/temp ;
if [ -d $BUP/vault.hourly.2 ] ; then
rm -rf $BUP/vault.hourly.2 ;
fi;
if [ -d $BUP/vault.hourly.1 ] ; then
mv $BUP/vault.hourly.1 $BUP/vault.hourly.2 ;
fi;
if [ -d $BUP/vault.hourly.0 ] ; then
mv $BUP/vault.hourly.0 $BUP/vault.hourly.1 ;
fi;
mv $BUP/temp $BUP/vault.hourly.0 ;
这是每日脚本(每周/每月的脚本几乎相同):
if [ -d $BUP/vault.daily.2 ] ; then
rm -rf $BUP/vault.daily.2 ;
fi;
if [ -d $BUP/vault.daily.1 ] ; then
mv $BUP/vault.daily.1 $BUP/vault.daily.2 ;
fi;
if [ -d $BUP/vault.daily.0 ] ; then
mv $BUP/vault.daily.0 $BUP/vault.daily.1 ;
fi;
if [ -d $BUP/vault.hourly.2 ] ; then
cp -al $BUP/vault.hourly.2 $BUP/vault.daily.0 ;
fi;
每小时脚本效果很好。我正在努力的是从每小时过渡 - >每日(和每日 - >每周等)。
目前,如果每小时脚本在一天内运行6次并且每日脚本在此之后运行(“hourly.n”缩写为“hr.n”并且“b_m”代表个人快照):
| hour 1 | hour 2 | hour 3 | hour 4 | hour 5 | end of day |
|------------+------------+------------+------------+------------+---------------|
| hr.0 (b_0) | hr.0 (b_1) | hr.0 (b_2) | hr.0 (b_3) | hr.0 (b_4) | hr.0 (b_5) |
| | hr.1 (b_0) | hr.1 (b_1) | hr.1 (b_2) | hr.1 (b_3) | hr.1 (b_4) |
| | | hr.2 (b_0) | hr.2 (b_1) | hr.2 (b_2) | hr.2 (b_3) |
| | | | | | daily.0 (b_3) |
因为hourly.sh每小时点击一次。如果它存在,我们可以看到daily.0是第一次用b_3创建的,我丢失了b_0,b_1和b_2。在删除它之前,我宁愿每小时进行一次增量转储每小时2次。这样,在任何给定的时间我都会有每小时0,1和2,而每日0将包含最新版本的hourly.2,然后才会被删除。
希望这是有道理的。
我尝试过cp -al $BUP/hourly.2 $BUP/daily.0 ;
行并将其放入每小时脚本中。我遇到了三个问题:
cp -al
行似乎在每日都保持稳定。它永远不会回到每日.1等等(这可能是对du
如何运作的误解。mv $BUP/daily.0 $BUP/daily.1
将使daily.0不再存在。因此,必须在下次hourly.sh运行时从头开始重新创建。无论如何,希望很清楚我正在努力实现的目标。我希望协助将每个脚本(每小时,每天,每周)转换到下一个“桶”(每日,每周,每月),而不必破坏硬链接。
我也希望不会丢失重要的快照,如上表所示。
非常感谢任何建议。
答案 0 :(得分:2)
好的,我对硬链接做了一个测试,这就是我发生的事情:
➜ rsync -az0 /home/jan/tmp/Source /home/jan/tmp/Dir1
➜ rsync -az0 /home/jan/tmp/Source /home/jan/tmp/Dir2 --link-dest=/home/jan/tmp/Dir1
➜ du -hs /home/jan/tmp/Source
124M /home/jan/tmp/Source
➜ du -hs /home/jan/tmp/Dir1
124M /home/jan/tmp/Dir1
➜ du -hs /home/jan/tmp/Dir2
124M /home/jan/tmp/Dir2
您可以看到文件的所有硬链接确实相同。这意味着,每个备份本身就是一个“完整”备份,如果你只在那个备份上执行“du”,它就会为你提供完整的文件大小。
➜ du -hs /home/jan/tmp/Dir1 /home/jan/tmp/Dir2
124M /home/jan/tmp/Dir1
0 /home/jan/tmp/Dir2
但是,如果你对它们进行“du”(比如上面的第6个命令),它将识别硬链接,并为之前遇到的所有硬链接显示“零”大小。但是,这仅取决于参数的顺序,而不取决于哪个硬链接是“第一个”:
➜ du -hs /home/jan/tmp/Dir2 /home/jan/tmp/Dir1
124M /home/jan/tmp/Dir2
0 /home/jan/tmp/Dir1
针对您的实际问题:
而不是执行cp -al $BUP/hourly.2 $BUP/daily.0
然后删除hourly.2无论如何,你不能只做mv $BUP/hourly.2 $BUP/daily.0
,多会更快?