我使用tar在我的服务器上创build文件系统不同部分的快照,然后将该快照ftp到异地位置进行归档。
我只想在事情发生变化时才开始这个操作。 一些备份运行在所有系统的文件夹上,很less更改(例如,当安装新软件或修改configuration时)。
每当发生变化,我想要一个完整的快照。 我可以用find来产生一个修改过的文件列表,但是我真的只需要知道这个列表的长度是0还是更大。 使用查找太慢了。
我知道有增量备份,我已经在其他情况下与ZFS一起使用rsync。 但是,这里的备份主机是一个FTP服务器(所以没有rsync),我需要完整的备份(因为备份存档用作图像来恢复或克隆服务器),我想压缩输出(所以焦油是方便的)。
编辑 :请注意,我不是在寻找增量备份(我有),而是为了一个快速(有点排除寻找之类)和简单的方法来决定是否一个完整的快照是相同的最后一个。 也许我的措辞不太好。 我现在编辑标题。
GNU find的最新版本有“-quit”动作,导致find立即停止search:
– 行动: – 点
立即退出(如果没有错误发生,返回值为零)。 这与'-prune'不同,因为'-prune'只适用于修剪过的目录的内容,'–quit'只是简单地让find停止。 没有任何subprocess将保持运行,但不会处理命令行上指定的更多文件。 例如,find / tmp / foo / tmp / bar -print -quit将仅打印'/ tmp / foo'。 在程序退出之前调用由“-exec … +”或“-execdir … +”构build的任何命令行。
您可以使用find-expression来查找已更改的文件,并在find一个文件时立即使用-quit来停止。 这应该比发现继续其扫描更快。
-quit是在fileutils V4.2.3中添加的
GNU tar有一个–newer-mtime选项,它需要一个date参数,这可能是你最后一次备份的时间。 根据您想要恢复文件系统的工作量,这可能是最后一次完整备份,在这种情况下,您需要恢复完整转储,每天最后一次,或者您可以从上次增量完成情况下,你需要恢复完整的转储和每个转储之后。
该选项依赖于文件上的修改时间戳,所以如果已经明确更改,那么您的备份就有可能错过它。
你总是可以find输出到wc,并获得一个整数改变的文件:
find . -ctime 1 | wc -l
尽pipeDavid的回答需要更less的代码更改:)
这是一个疯狂的想法,但是你可以用md5sum和ls来玩一点。
这个想法是只看一个文件的md5sum,该文件是你正在看的目录的文件列表。 只要没有任何变化,md5sum是一样的。 但是,如果更新了时间戳,则md5sum将会更改,并且您需要执行新的tar并将其发送到您的ftp服务器。
我们可以从这样的事情开始
ls -lR /path/to/dir/ | md5sum > file_list.txt.md5
那么你需要在旧的md5和现在的…等之间加一个比较
/约翰
incron实用程序使用inotify在发生文件系统事件时运行命令。 configuration文件就像一个crontab,而不是指定path和事件的次数。
该命令可以是您的备份脚本(在这种情况下,备份将在文件修改后立即启动),也可以让它创build一些文件,并让备份脚本检查该文件的存在,然后删除它。 如果文件存在,则自上次运行以来发生的其中一个事件。
tar有一个--diff选项,可以“find存档和文件系统之间的区别”。 如果你保存了你上传的文件的本地副本,那么你可以将它与之相比较。
你也有小写-g选项-g,–listed-incremental F创build/列表/提取新的GNU格式增量备份
我从来没有玩过它,但你可以脚本的东西,所以先testing这个非关键。 ;)进行完整备份
tar -zcvf /home/backup.tar.gz /backup_dir
然后
NOW=$(date +"%d-%m-%Y") i=$(date +"%Hh%Mm%Ss") FILE="i.$NOW-$i.tar.gz" tar -g /home/backup.incremental.txt -zcvf /backup/$FILE /backup_dir
这在日志logging中是非常详细的,但会在每次读/写时为您提供date戳。 是的,它在概念上与Windows NT审计日志类似。 这可能是你的设置矫枉过正,但为了完整性,我正在讨论这个概念。
您可以在这里使用这个简短的教程来设置审计。
优点:
缺点:
您可以使用ausearch工具以每个文件名为基础查找对文件的更改。 一个简单的脚本来遍历目录(和子目录?)在每个文件的基础上,将允许你发出一个简单的文件的变化,给你一个在你指定的标准“触及”的文件列表。 您可以在每个用户的ausearch使用其他过滤选项(如果您拥有服务的用户帐户时很有用),per-command等,可以轻松扩展此function。
你可以安装git,并parsing相关目录的“git status”(或者退出代码?)的输出。 Git的function相当快。
只要确保提交更改,连续调用“git status”就会显示更改。
另一个想法是使用tripwire或类似的工具。
更强大的方法是定期tar目录,并比较以前焦油的MD5。 如果目录很大,但是这不会太好。
这听起来像你真正想要的就是触发一个备份过程,只要有一个目录层次结构发生变化。 inotify可能可以在这里帮助。
我把我的备份完全切换到rsnapshot (perlscript,它使用rsync和硬链接,它可以备份远程主机)
每天晚上rsync只复制较新的文件和 – 由于硬链接 – 每个备份文件夹代表完整的数据。
rsnapshot是超级快速和恢复是如此容易 – 试试吧!