我们有一个应用程序,它定期将自己备份到本地文件系统上的一个目录。在这个目录中还有几个文件和目录。
我希望生成所有这些文件的“快照”,这些文件可以复制到备份存储中。
最重要的是,如何以原子的方式生成这个“快照”?请记住,所有这些文件都可能被备份守护进程修改,使我们的“快照”不一致。
编辑:
也许我应该提到,这个系统有一个ext4文件系统。
发布于 2014-12-11 16:41:06
如果您知道哪些进程正在写入该目录中的文件,则可以使用kill -SIGSTOP <pid>冻结它们,然后执行备份,然后使用kill -SIGCONT <pid>恢复进程。
发布于 2014-12-11 16:23:17
据我所知,如果没有并发访问数据的应用程序的合作,ext4本身就无法保证这种事务的原子性。在底层设备映射器中使用一些快照机制也不能工作,因为您基本上需要卸载文件系统(或者至少需要重新挂载-ro)才能在块设备级别上获得一致的状态。
我认为如果没有更多关于应用程序行为的知识,这将是相当复杂的。因此,最简单的方法可能是以某种方式修改应用程序(比如引入锁文件)。但是,如果您需要将其视为一个黑匣子,我将对其做一些假设:
基于这些假设,我建议采取一种乐观的态度。简单地说,只需尝试创建一个常规的、递归的、非原子的目录副本,然后检查应用程序是否触及了任何文件。如果是这样的话,这表明您的副本不幸地与应用程序的定期自备份相吻合。在这种情况下,放弃您刚才创建的副本,然后再试一次。也许退一段时间;避免占用资源的无限循环。
您可以通过在Linux中使用inotify机制来实现这一点,作为监视进程中要复制的文件的一种方式。如果要使用一个简单的shell脚本,请看一下inotify-工具。在大多数发行版上都有包装。我不完全确定inotify在文件已经打开时的行为,因此参考假设2,您可能还想使用lsof来确保应用程序在源代码目录的任何内容上都没有打开的文件句柄。在你设置了inotify手表之后再这么做。
所以我会这样处理你的处境。我希望你不介意我跳过勾勒出这方面的实际实现。如果有什么不清楚的话请随便问我。
发布于 2022-10-05 23:37:28
/sbin/fsfreeze --freeze /data
# do a backup
/sbin/fsfreeze --unfreeze /data对文件系统(Ext3 3/4,ReiserFS,JFS,XFS)的挂起访问
如果需要更多信息:https://manpages.ubuntu.com/manpages/focal/man8/fsfreeze.8.html
https://unix.stackexchange.com/questions/134910
复制相似问题