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

mon*_*ter 3 linux filesystems

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

该文件本身是一个“元数据文件”,不应变得很大:最大只有几百 MB。

我想做的是:

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

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

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

And*_*asM 6

您可以为此使用 LVM 快照而不是克隆。如果出现问题,只需从克隆中复制文件。

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

编辑:

如果您可以在此处更改程序,则是另一种解决方案:https : //stackoverflow.com/questions/1565177/can-i-do-a-copy-on-write-memcpy-in-linux

mmap() 文件两次,一次正常一次,一次使用MAP_PRIVATE.

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