如何使用从C++代码写入时复制 BTRFS?

How can I use the Copy on Write of a BTRFS from C++ code?

本文关键字:复制 BTRFS 何使用 C++ 代码      更新时间:2023-10-16

如何使用 bttrfs 文件系统中的文件C++写时复制从假定支持它的 Linux 系统上的C++代码中复制文件?该解决方案是否适用于所有 Unix 系统?

CoW 根本不包含在文件系统C++标准的任何部分中。它在Linux的文档中也没有出现,也不是POSIX标准。

事实上,即使 GNU cp 实用程序可以处理写入时复制,它也可能并不总是被执行,因为它需要一个参数,即--reflink=true来强制使用它

因此,使用 CoW 很可能需要使用低级原语,显然没有为 Linux 或更广泛的 POSIX 准备文档。

您可以通过cp --reflink=always notes.txt notes.txt.backupstrace查看哪些系统调用完成。

因此,如果您运行strace cp --reflink=always notes.txt notes.txt.backup则可以在输出中找到以下内容:

openat(AT_FDCWD, "notes.txt", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0664, st_size=760, ...}) = 0
openat(AT_FDCWD, "notes.txt.backup", O_WRONLY|O_TRUNC) = 4
fstat(4, {st_mode=S_IFREG|0664, st_size=0, ...}) = 0
ioctl(4, BTRFS_IOC_CLONE or FICLONE, 3) = 0

ioctl调用是创建文件的显式 CoW 副本的 CoW 魔术。

您可以阅读man ioctl_ficlone