在 Linux 中“克隆”文件的最快方法是什么?

在 Linux 中“克隆”文件的最快方法是什么?

我想使用一个非“崩溃安全”的应用程序 API;换句话说,如果应用程序崩溃,数据文件很有可能损坏且无法读取。

该文件本身是一个“元数据文件”,不会太大:最多几百 MB。

我想要做的是:

  1. 强制应用程序以“直接模式”(无操作系统缓存)访问文件。
  2. 以定期的“检查点”间隔暂停更新
  3. 执行 flush() (某些数据可能已被自动刷新)
  4. 现在我知道文件是一致的,就克隆它。
  5. 如果有“旧克隆”,请将其删除。
  6. 继续对原始文件进行更改。
  7. 环形。

我是否可以使用一种特殊用途的文件系统来对文件进行某种“零拷贝”,并结合对原始文件的已修改扇区的写时复制,以使克隆“几乎免费”(具有最少的磁盘 IO)?

另外,我可以不用分叉进程来执行“克隆”吗?(我不知道 Linux 文件 API 是否提供“cp”系统调用)。

答案1

您可以使用 LVM 快照来实现这一点,而不是克隆。如果出现问题,只需从克隆中复制文件即可。

有一个 libdevmapper/libdevmapper-event-lvm2snapshot 可以帮助以编程方式执行此操作(无需分叉):http://sourceware.org/dm/

编辑:

如果你可以改变你的程序,这里是另一个解决方案: https://stackoverflow.com/questions/1565177/can-i-do-a-copy-on-write-memcpy-in-linux

对文件进行两次 mmap() 操作,一次正常操作,一次使用MAP_PRIVATE

这将避免 lvm 的外部性(尤其是性能)

答案2

以下是一个不涉及 LVM 的快速建议。使用R1Soft热拷贝拍摄相关文件系统的一个或多个时间点快照。请参阅提示页面。它使用写时复制技术。这已经解决了一些类似问题这里,但也适用于您要做的事情。

答案3

  • Btrfs ×cp --reflink或快照
  • Nilfs — 由 AFAIU 设计
  • Linux 上的 ZFS(有些人说它运行良好)— 快照

相关内容