Linux 上有没有这样一种“写时复制”的文件系统或者工具?

2021-06-08 10:59:49 +08:00
 ch2

需求:

  1. 多个进程可以从同一个路径读取文件,这些进程也可以同时修改同一个文件
  2. 但是每个进程对文件的修改都是独立的,一个进程的修改不会影响到另一个进程的读写
  3. 每个进程修改的文件都被单独保存到自己的私有目录,但是对该进程透明,该进程感受不到文件路径的变化
  4. 不用 docker 这些容器来实现(好像用了也不行)
    问题:
    多个独立的进程(互相之间都认为自己是独占一个目录的)对同一个文件目录会产生大量读(只读文件)和少量写(日志文件)的操作,不想为每个进程单独复制一份各自的文件目录(数据量较大,而且进程的数量不定,会产生大量的重复复制)
3559 次点击
所在节点    Linux
14 条回复
janus77
2021-06-08 11:03:36 +08:00
git ?
ch2
2021-06-08 11:07:39 +08:00
@janus77 读写是并行的,而且是二进制文件,git 不太行
no1xsyzy
2021-06-08 11:12:10 +08:00
CoW 的话,ZFS 和 Btrfs 都能通过 dedup 来做到。
除此以外也可以用 overlayFS ?

说实话,第一反应是内存,fork() 就是 CoW 的。
HUNYXV
2021-06-08 11:12:20 +08:00
估计得自己造轮子
XiaoxiaoPu
2021-06-08 11:14:15 +08:00
文件路径对进程透明,需要 chroot
linux 下支持写时复制的文件系统,可以用 Btrfs

粗略看可行的方案,是使用 Btrfs 的快照功能,要启动进程前,创建一个新的快照,chroot 快照,启动进程
thunderw
2021-06-08 11:21:51 +08:00
我感觉你想要的就是 docker 的 Union FS 啊。
https://en.wikipedia.org/wiki/UnionFS
SingeeKing
2021-06-08 11:28:20 +08:00
自己基于 FUSE 写一个不难,但不确定是否可以感知到读的进程
generic
2021-06-08 11:31:43 +08:00
overlayfs 。
jim9606
2021-06-08 11:45:37 +08:00
使用支持 Reflink 的文件系统,CoW 的文件系统是最佳方案( ZFS 、BtrFS 甚至不需要打开 dedup 都能做到),非 CoW 文件系统中 OverlayFS 、XFS 也可以支持

不同程序先通过 cp --reflink=always 创建轻量副本,之后所有修改都放在私有副本上进行。

不过需要注意这些方法都不可避免产生文件碎片,虽然节省空间但 IO 性能可能会下降。
masterclock
2021-06-08 11:46:44 +08:00
https://ostreedev.github.io/ostree/
好像用 ostree 可以搞定
yanqiyu
2021-06-08 14:14:06 +08:00
btrfs+snapshot/reflink+mountns?
做一个启动器,任务就是吧目标文件所在的子卷做一个快照或者路径做一个 reflink,然后创建 mountns 设置好新的挂载点保证对于程序透明,然后执行程序?
muzuiget
2021-06-08 14:46:57 +08:00
应该是 overlayfs,相当于在一个文件系统快照上操作。
lqf96
2021-06-08 14:59:59 +08:00
再提供一个办法:lvm 有 block-level 的 cow 支持,可以适用各种文件系统,docker 应该也有相应的后端…
itplanes01
2021-06-09 00:11:58 +08:00
几周前装的 Fedora 34 btrfs 在安装软件时崩了,数据全无

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/782096

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX