1

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

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

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

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

4

1 回答 1

3

You can see what system calls are done by cp --reflink=always notes.txt notes.txt.backup with strace.

So if you run strace cp --reflink=always notes.txt notes.txt.backup you can find this in the output:

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

That ioctl call is the CoW magic that creates an explicit CoW copy of a file.

You can read man ioctl_ficlone

于 2018-10-14T02:39:53.697 回答