![在 Linux 中“克隆”文件的最快方法是什么?](https://linux22.com/image/575468/%E5%9C%A8%20Linux%20%E4%B8%AD%E2%80%9C%E5%85%8B%E9%9A%86%E2%80%9D%E6%96%87%E4%BB%B6%E7%9A%84%E6%9C%80%E5%BF%AB%E6%96%B9%E6%B3%95%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我想使用一个非“崩溃安全”的应用程序 API;换句话说,如果应用程序崩溃,数据文件很有可能损坏且无法读取。
该文件本身是一个“元数据文件”,不会太大:最多几百 MB。
我想要做的是:
- 强制应用程序以“直接模式”(无操作系统缓存)访问文件。
- 以定期的“检查点”间隔暂停更新
- 执行 flush() (某些数据可能已被自动刷新)
- 现在我知道文件是一致的,就克隆它。
- 如果有“旧克隆”,请将其删除。
- 继续对原始文件进行更改。
- 环形。
我是否可以使用一种特殊用途的文件系统来对文件进行某种“零拷贝”,并结合对原始文件的已修改扇区的写时复制,以使克隆“几乎免费”(具有最少的磁盘 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
答案3
- Btrfs ×
cp --reflink
或快照 - Nilfs — 由 AFAIU 设计
- Linux 上的 ZFS(有些人说它运行良好)— 快照