星期二, 一月 30, 2007

"tar -T/-X" for my backup design

在我设计的备份方案中,应该根据 backup ID 有若干文件列表,备份程序在执行时应该是从这个列表中查找所有的目录和文件来打包。因为涉及到差分和增量备份的问题,所有不能直接利用这个列表来 tar,而是需要比较时间戳,因此还需要根据这个列表来查找更新的所有文件(可利用 find),并记录到一个新的列表中,随后的 tar 利用这个实际的列表来操作(当然这个过程都是自动完成的,也不一定要调用 find/tar,而可以编写 python 时使用 tarfile 等模块,但直接 wrap 可能比较方便)。

tar 可以使用 -T/-I 参数来读取列表,-X 读取排除列表,但列表生成以后,其中某些文件可能会被删除,例如 web 产生的一些 cache。这时候运行 tar -T 就会报错并退出,而后续的打包就不再进行。

可能需要忽略这一点,用 --ignore-failed-read 可以,问题就是他不会报告哪些被忽略了。我想可以在使用的使用 wrap 这个参数,由用户来进行选择,再传递给 tar 处理。

如果同时使用 -T i-files -X x-files 会怎样呢?
sh$ find `pwd`/lamp01 >i-files
sh$ echo "/tmp/temp/lamp01/profiles" >x-files
sh$ tar -c -z -f lamp01.tgz -T i-files -X x-files /tmp/temp/lamp01
sh$ tar tfz lamp01.tgz | grep profiles | sort
tmp/temp/lamp01/.svn/prop-base/profiles.svn-base
tmp/temp/lamp01/.svn/prop-base/profiles.svn-base
tmp/temp/lamp01/.svn/prop-base/profiles.svn-base
tmp/temp/lamp01/.svn/prop-base/profiles.svn-base
tmp/temp/lamp01/.svn/prop-base/profiles.svn-base
tmp/temp/lamp01/.svn/props/profiles.svn-work
tmp/temp/lamp01/.svn/props/profiles.svn-work
tmp/temp/lamp01/.svn/props/profiles.svn-work
tmp/temp/lamp01/.svn/props/profiles.svn-work
tmp/temp/lamp01/.svn/props/profiles.svn-work
tmp/temp/lamp01/.svn/text-base/profiles.svn-base
tmp/temp/lamp01/.svn/text-base/profiles.svn-base
tmp/temp/lamp01/.svn/text-base/profiles.svn-base
tmp/temp/lamp01/.svn/text-base/profiles.svn-base
tmp/temp/lamp01/.svn/text-base/profiles.svn-base
会发现很多重复的项,而且 tar 归档的大小是普通情况下的 3 倍,这意味着同时使用 -T/-X 选项会有问题。因此如果要排除某个目录,只能将希望放在 find 上了——如果使用 shell script 或在 python 中使用 os.popen() 直接调用这些命令来实现的时候。

例如可以使用如下命令:
find `pwd`/lamp01 -path `pwd`/lamp01/profiles -prune -o -print | grep profiles
这里最好使用绝对路径,在备份的这个脚本设计中也最好使用绝对路径,能够避免很多混乱的情况!可以使用 tar -P 参数。

如果要排除两个目录:
find `pwd`/lamp01 \( -path `pwd`/lamp01/profiles -o -path /tmp/temp/lamp01/confiles \) -prune -o -print | grep profiles
对一个目录也同样可以使用 \(\):
find `pwd`/lamp01 \( -path `pwd`/lamp01/profiles \) -prune -o -print
即便是有不相干的目录加入进来也没有关系
find `pwd`/lamp01 \( -path `pwd`/lamp01/profiles -o -path /etc \) -prune -o -print
不过可以认真考虑一下 backup list 应该以怎样的形式为好?

没有评论: