如何使用 bttrfs 文件系统中的文件C++写时复制从假定支持它的 Linux 系统上的C++代码中复制文件?该解决方案是否适用于所有 Unix 系统?
CoW 根本不包含在文件系统C++标准的任何部分中。它在Linux的文档中也没有出现,也不是POSIX标准。
事实上,即使 GNU cp 实用程序可以处理写入时复制,它也可能并不总是被执行,因为它需要一个参数,即--reflink=true
来强制使用它
因此,使用 CoW 很可能需要使用低级原语,显然没有为 Linux 或更广泛的 POSIX 准备文档。
您可以通过cp --reflink=always notes.txt notes.txt.backup
strace
查看哪些系统调用完成。
因此,如果您运行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