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

我想使用不“安全”的应用程序API; 换句话说,如果应用程序崩溃,则数据文件很可能被破坏且不可读。

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

我想要做的是:

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

我可以使用一个专门的文件系统,使文件“零复制”,结合原始文件的修改扇区的写时复制,使克隆“几乎空闲”(使用最less的磁盘IO)?

另外,我可以做“克隆”,而不必分叉过程? (我不知道Linux文件API是否提供了“cp”系统调用)。

您可以使用LVM快照来代替克隆。 如果出现问题,只需复制克隆中的文件。

有一个libdevmapper / libdevmapper-event-lvm2snapshot,这可能会有助于以编程方式执行此操作(无需fork): http : //sourceware.org/dm/

编辑:

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

mmap()文件两次,一次正常,一次与MAP_PRIVATE

这将避免lvm的外部性(特别是性能)

这里有一个不涉及LVM的快速build议。 使用R1Soft Hot Copy可以对有问题的文件系统执行一个或多个时间点快照。 查看提示页面 。 它使用写入时复制技术。 这是解决一些类似的问题 ,但也适用于你想要做的事情。

  • Btrfs× cp --reflink或快照
  • Nilfs – 由deviseAFAIU
  • Linux上的ZFS“(某些人认为它适用于他们) – 快照