首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何捕获目录及其所有子目录的一致快照?

问如何捕获目录及其所有子目录的一致快照?
EN

Unix & Linux用户
提问于 2014-06-06 19:18:03
回答 3查看 2.7K关注 0票数 6

我们有一个应用程序,它定期将自己备份到本地文件系统上的一个目录。在这个目录中还有几个文件和目录。

我希望生成所有这些文件的“快照”,这些文件可以复制到备份存储中。

最重要的是,如何以原子的方式生成这个“快照”?请记住,所有这些文件都可能被备份守护进程修改,使我们的“快照”不一致。

编辑:

也许我应该提到,这个系统有一个ext4文件系统。

EN

回答 3

Unix & Linux用户

发布于 2014-12-11 16:41:06

如果您知道哪些进程正在写入该目录中的文件,则可以使用kill -SIGSTOP <pid>冻结它们,然后执行备份,然后使用kill -SIGCONT <pid>恢复进程。

票数 3
EN

Unix & Linux用户

发布于 2014-12-11 16:23:17

据我所知,如果没有并发访问数据的应用程序的合作,ext4本身就无法保证这种事务的原子性。在底层设备映射器中使用一些快照机制也不能工作,因为您基本上需要卸载文件系统(或者至少需要重新挂载-ro)才能在块设备级别上获得一致的状态。

我认为如果没有更多关于应用程序行为的知识,这将是相当复杂的。因此,最简单的方法可能是以某种方式修改应用程序(比如引入锁文件)。但是,如果您需要将其视为一个黑匣子,我将对其做一些假设:

  1. 与执行时间间隔相比,应用程序的定期备份只需要较短的时间。
  2. 完成备份后,它将关闭所有文件句柄,直到下一次备份运行。

基于这些假设,我建议采取一种乐观的态度。简单地说,只需尝试创建一个常规的、递归的、非原子的目录副本,然后检查应用程序是否触及了任何文件。如果是这样的话,这表明您的副本不幸地与应用程序的定期自备份相吻合。在这种情况下,放弃您刚才创建的副本,然后再试一次。也许退一段时间;避免占用资源的无限循环。

您可以通过在Linux中使用inotify机制来实现这一点,作为监视进程中要复制的文件的一种方式。如果要使用一个简单的shell脚本,请看一下inotify-工具。在大多数发行版上都有包装。我不完全确定inotify在文件已经打开时的行为,因此参考假设2,您可能还想使用lsof来确保应用程序在源代码目录的任何内容上都没有打开的文件句柄。在你设置了inotify手表之后再这么做。

所以我会这样处理你的处境。我希望你不介意我跳过勾勒出这方面的实际实现。如果有什么不清楚的话请随便问我。

票数 2
EN

Unix & Linux用户

发布于 2022-10-05 23:37:28

代码语言:javascript
复制
/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

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/134910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档