我使用tar
在我的服务器上创建文件系统不同部分的快照,然后将该快照 ftp 到异地位置进行归档。
我只想在某些事情发生变化时开始该操作。一些备份在所有很少更改的系统文件夹上运行(即,当安装新软件或修改配置时)。
每当发生变化时,我都想要一个完整的快照。我可以使用 生成修改文件的列表find
,但我真的只需要知道该列表的长度是否为 0 或更大。使用 find 太慢了。
我知道存在增量备份,并且我已经在其他情况下将 rsync 与 ZFS 结合使用。但是,这里的备份主机是一个 FTP 服务器(所以没有 rsync),我需要完整的备份(因为备份存档用作恢复或克隆服务器的映像)并且我想要压缩输出(所以 tar 很方便)。
编辑:请注意,我不是在寻找增量备份(我有),而是寻找一种快速(有点排除 find 等)和简单的方法来确定完整快照是否与上一个快照相同。也许我的措辞不是很好。我现在编辑了标题。
GNU tar 有一个 --newer-mtime 选项,它需要一个日期参数,这可能是您最后一次进行备份的时间。根据您要恢复文件系统的工作量,这可能是最后一次完整备份,在这种情况下,您需要恢复完整转储和最后一天,或者您可以从最后一次增量备份开始执行此操作,其中在这种情况下,您需要恢复完整转储以及之后的每个转储。
此选项确实依赖于文件上的修改时间戳,因此如果已明确更改,那么您的备份可能会丢失它。
当文件系统事件发生时, incron实用程序使用 inotify 运行命令。配置文件就像一个 crontab,但不是您指定路径和事件的时间。
该命令可以是您的备份脚本(在这种情况下,备份将在文件修改后几乎立即开始),或者您可以让它创建一些文件,并让备份脚本检查该文件是否存在,然后将其删除。如果文件存在,则自上次运行以来发生的事件之一。
您始终可以将find的输出通过管道传输到wc并获取已更改文件的整数计数:
虽然大卫的回答需要更少的代码更改:)
这是一个有点疯狂的想法,但你可以用 md5sum 和 ls 玩一下。
这个想法是只查看一个文件的 md5sum,并且该文件是您正在观看的目录的文件列表。只要没有任何变化,md5sum 是一样的。但是如果时间戳被更新,md5sum 将会改变,你知道你需要做一个新的 tar 并将它发送到你的 ftp 服务器。
我们可以从这样的事情开始
然后你需要在旧的 md5 和当前的......等等之间添加一个比较
/约翰
最新版本的 GNU find 具有操作“-quit”,这会导致 find 立即停止搜索:
您可以使用 find-expression 查找已更改的文件,并在找到后立即使用 -quit 停止。这应该比 find 继续扫描要快。
-quit 在 fileutils V4.2.3 中添加
tar 有一个
--diff
选项可以“查找存档和文件系统之间的差异”。如果您保留上传文件的本地副本,则可以将它们与该文件进行比较。您还有小写的 -g 选项 -g, --listed-incremental F 创建/列出/提取新的 GNU 格式增量备份
我从来没有玩过它,但你可以编写一些东西,所以首先在非关键的情况下测试它。;) 进行完整备份
然后
我将备份完全切换到rsnapshot(perlscript,它使用 rsync 和硬链接,它可以备份远程主机)
每天晚上 rsync 只复制较新的文件 - 由于硬链接 - 每个备份文件夹都代表完整的数据。
rsnapshot 速度超快,恢复也很简单——试试吧!
激进的想法:您可以让系统审核每次访问的相关文件。
这在日志记录方面非常冗长,但会在每次读/写时为您提供日期戳。是的,它在概念上类似于 Windows NT 审计日志记录。对于您的设置来说,这可能有点矫枉过正,但为了完整起见,我放弃了这个概念......
您可以在此处使用此简短教程设置审核。
优点:
缺点:
您可以使用该
ausearch
工具根据每个文件名定位对文件的更改。在每个文件的基础上迭代目录(和子目录?)的简单脚本将允许您对简单文件发出更改,为您提供在您指定的标准中“触及”的文件列表。您可以使用其他过滤选项轻松扩展此功能,ausearch
适用于每个用户(如果您有服务的用户帐户,则很有用)、每个命令等。您可以安装 git 并解析相关目录的“git status”(或者可能是退出代码?)的输出。Git 的工作速度非常快。
只需确保提交更改,因此对“git status”的连续调用将显示更改。
另一个想法是使用tripwire 或一些类似的工具。
更暴力的方法是定期对目录进行 tar,并比较前一个 tar 的 MD5。但是,如果目录很大,这将不会很好地扩展。