【问题标题】:Copy file in Python with copy-on-write (COW)使用写时复制(COW)在 Python 中复制文件
【发布时间】:2020-12-29 12:41:45
【问题描述】:

我的文件系统 (FS)(特别是 ZFS)支持写时复制 (COW),即复制(如果操作正确)是一种非常便宜的常量操作,实际上并不复制底层内容。仅在我编写/修改新文件后才会复制内容。

实际上,我刚刚发现,ZFS-on-Linux 实际上还没有为用户空间实现这一点(对吧?)。 但是例如BTRFS 或 XFS 都有。 (见herehere, here, here.)

对于 (GNU) cp 实用程序,您将传递 --reflink=always 选项 (见here。) cp 致电ioctl (dest_fd, FICLONE, src_fd) (见herehere)。

如何在 Python 中获得这种行为(如果可能)?

我假设“零拷贝”(例如here via os.sendfile)不会导致这种行为,对吧?因为查看shutils _fastcopy_sendfile 实现(here),它仍然是使用一些自定义字节数(假设是块大小,max(os.fstat(infd).st_size, 2 ** 23))围绕os.sendfile 的循环。还是会?

COW,这是文件级别还是块级别?

如果可能的话,我也希望它是通用的和跨平台的,尽管我的问题有点集中在 Linux 上。 一个专门关于 Mac 的相关问题似乎是this。 MacOSX cp-c 选项来克隆文件。

【问题讨论】:

    标签: python copy-on-write


    【解决方案1】:

    在进一步搜索的过程中,我实际上找到了答案,以及相关的问题报告。

    Issue 37157 (shutil: add reflink=False to file copy functions to control clone/CoW copies (use copy_file_range)) 正是这样,它将在 Linux 上使用FICLONE/FICLONERANGE

    所以我假设shutil 将在即将推出的 Python 版本中支持此功能(可能从 Python 3.9 开始?)。

    os.copy_file_range(从 Python 3.8 开始),它包装了 copy_file_range (Linux)。

    但是,根据issue 37159 (Use copy_file_range() in shutil.copyfile() (server-side copy)),Giampaolo Rodola:

    不,[copy_file_range] 不[支持 CoW](参见手册页)。我们可以简单地使用 FICLONE(cp 也是如此)。

    但是,我不确定这是否正确,正如 copy_file_range man page 所说:

    copy_file_range() 为文件系统提供了实现的机会 “复制加速”技术,例如使用 reflink (即,两个或多个 inode 共享指向同一副本的指针- on-write 磁盘块)或服务器端复制(在 NFS 的情况下)。

    Issue 26826 (Expose new copy_file_range() syscall in os module) 有 Giampaolo Rodola 的评论:

    我认为通过 FICLONE 更好地实现重复数据删除/CoW/reflink 复制。 “cp --reflink”使用它,我想是因为它比 copy_file_range() 更老。 ...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-17
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      相关资源
      最近更新 更多