V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
ch2
V2EX  ›  Linux

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

  •  
  •   ch2 · 2021-06-08 10:59:49 +08:00 · 3702 次点击
    这是一个创建于 1265 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求:

    1. 多个进程可以从同一个路径读取文件,这些进程也可以同时修改同一个文件
    2. 但是每个进程对文件的修改都是独立的,一个进程的修改不会影响到另一个进程的读写
    3. 每个进程修改的文件都被单独保存到自己的私有目录,但是对该进程透明,该进程感受不到文件路径的变化
    4. 不用 docker 这些容器来实现(好像用了也不行)
      问题:
      多个独立的进程(互相之间都认为自己是独占一个目录的)对同一个文件目录会产生大量读(只读文件)和少量写(日志文件)的操作,不想为每个进程单独复制一份各自的文件目录(数据量较大,而且进程的数量不定,会产生大量的重复复制)
    第 1 条附言  ·  2021-06-08 14:49:59 +08:00
    overlayfs 跟 aufs 在大的二进制文件有修改的时候会发生全复制,pass 掉
    只能试试 brtfs 跟 zfs 了
    第 2 条附言  ·  2021-06-08 21:09:42 +08:00
    建立完 brtfs 分区后,用 cp -R --reflink=always -a SRC DEST
    即可实现题中的需求,不足之处是 brtfs 本身性能有点差
    14 条回复    2021-06-09 00:11:58 +08:00
    janus77
        1
    janus77  
       2021-06-08 11:03:36 +08:00
    git ?
    ch2
        2
    ch2  
    OP
       2021-06-08 11:07:39 +08:00
    @janus77 读写是并行的,而且是二进制文件,git 不太行
    no1xsyzy
        3
    no1xsyzy  
       2021-06-08 11:12:10 +08:00   ❤️ 1
    CoW 的话,ZFS 和 Btrfs 都能通过 dedup 来做到。
    除此以外也可以用 overlayFS ?

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

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

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

    不过需要注意这些方法都不可避免产生文件碎片,虽然节省空间但 IO 性能可能会下降。
    masterclock
        10
    masterclock  
       2021-06-08 11:46:44 +08:00   ❤️ 1
    https://ostreedev.github.io/ostree/
    好像用 ostree 可以搞定
    yanqiyu
        11
    yanqiyu  
       2021-06-08 14:14:06 +08:00   ❤️ 1
    btrfs+snapshot/reflink+mountns?
    做一个启动器,任务就是吧目标文件所在的子卷做一个快照或者路径做一个 reflink,然后创建 mountns 设置好新的挂载点保证对于程序透明,然后执行程序?
    muzuiget
        12
    muzuiget  
       2021-06-08 14:46:57 +08:00
    应该是 overlayfs,相当于在一个文件系统快照上操作。
    lqf96
        13
    lqf96  
       2021-06-08 14:59:59 +08:00 via iPhone   ❤️ 1
    再提供一个办法:lvm 有 block-level 的 cow 支持,可以适用各种文件系统,docker 应该也有相应的后端…
    itplanes01
        14
    itplanes01  
       2021-06-09 00:11:58 +08:00 via Android
    几周前装的 Fedora 34 btrfs 在安装软件时崩了,数据全无
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   919 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:43 · PVG 03:43 · LAX 11:43 · JFK 14:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.