我想使用一个非“崩溃安全”的应用程序 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(有些人说它运行良好)— 快照