为什么“cp -R --reflink=always”在 Btrfs 文件系统上执行标准复制?

为什么“cp -R --reflink=always”在 Btrfs 文件系统上执行标准复制?

Btrfs 支持写入时复制。我尝试使用该功能来克隆目录:

cp -R --reflink=always foo_directory foo_directory.mirror

我期望该命令几乎立即完成(如 a btrfs subvolume snapshot),但该cp命令似乎执行缓慢的标准复制。

根据手册页,我希望--reflink=always强制执行 Copy-On-Write:

--reflink[=always]指定时,执行轻量级复制,其中数据块仅在修改时才复制。如果不可能,则复制失败,或者如果--reflink=auto指定,则回退到标准副本。

问题:

  • 你知道为什么--reflink=always不起作用吗?
  • 我应该使用哪些选项(或其他命令)?

答案1

cp --reflink=always几乎可以肯定工作正常。如果不是,您将会收到错误。根据设计,这就是--reflink=always和之间的区别--reflink=auto。错误看起来像这样:

# Filesystem that does not support the feature at all
cp: failed to clone `xx' from `yy': Inappropriate ioctl for device

# Filesystem that does support it, but copy across filesystems
cp: failed to clone `xx' from `yy': Invalid cross-device link

您是否正在复制包含大量小文件的目录结构?在这种情况下cp,仍然需要创建每个目录并打开和关闭每个文件,因此仍然需要时间,这与btrfs subvolume snapshot.这很可能解释了执行该操作所需的时间。

相关内容