技术解析

Linux 上有没有这样一种“写时复制”的文件系统或者工具?
0
2021-06-12 00:47:24
idczone

需求:

  1. 多个进程可以从同一个路径读取文件,这些进程也可以同时修改同一个文件
  2. 但是每个进程对文件的修改都是独立的,一个进程的修改不会影响到另一个进程的读写
  3. 每个进程修改的文件都被大带宽服务器单独保存到自己的私有目录,但是对该进程透明,该进程感受不到文件路径的变化
  4. 不用 docker 这些容器来实现(好像用了也不行)
    问题:
    多个独立的进程(互相之间都认为自己是独占一个目录的)对同一个文件目录会产生大量读(只读文件)和少量写(日志文件)的操作,不想为每个进程单独复制一份各自的文件目录(数据量较大,而且进程的数量不定,会产生大量的重复复制)

git ?

读写是并行的,而且是二进制文件,git 不太行

CoW 的话,ZFS 和 Btrfs 都能通过 dedup 来做到。
除此以外也可以用 overlayFS ?
说实话,第一反应是内存,fork() 就是 CoW 的。

估计得自己造轮子

文件路径对进程透明,需要 chroot
linux 下支持写时复制的文件系统,可以用 Btrfs
粗略看可行的方案,是使用 Btrfs 的快照功能,要启动进程前,创建一个新的快照,chroot 快照,启动进程

我感觉你想要的就是 docker 的 Union FS 啊。
https://en.wikipedia.org/wiki/UnionFS

自己基于 FUSE 写一个不难,但不确定是否可以感知到读的进程

overlayfs 。

使用支持 Reflink 的文件系统,CoW 的文件系统是最佳方案( ZFS 、BtrFS 甚至不需要打开 dedup 都能做到),非 CoW 文件系统中 OverlayFS 、XFS 也可以支持
不同程序先通过 cp --reflink=always 创建轻量副本,之后所有修改都放在私有副本上进行。
不过需要注意这些方法都不可避免产生文件碎片,虽然节省空间但 IO 性能可能会下降。

https://ostreedev.github.io/ostree/
好像用 ostree 可以搞定

btrfs+snapshot/reflink+mountns?
做一个启动器,任务就是吧目标文件所在的子卷做一个快照或者路径做一个 reflink,然后创建 mountns 设置好新的挂载点保证对于程序透明,然后执行程序?

应该是 overlayfs,相当于在一个文件系统快照上操作。

再提供一个办法:lvm 有 block-level 的 cow 支持,可以适用各种文件系统,docker 应该也有相应的后端…

几周前装的 Fedora 34 btrfs 在安装软件时崩了,数据全无

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服