为什么“ cp -R --reflink = always”在btrfs文件系统上执行标准副本?


12

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

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

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

根据手册页,我希望--reflink=always强制执行写时复制:

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

问题:

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

Answers:


20

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。这最有可能解释执行该操作所花费的时间。


3
是的,它包含大量文件,其中大多数是小型文本文件。我不知道cp仍然必须处理每个文件。谢谢,那是我不理解的部分。我认为在用例中,最好创建可写快照。
PhilippClaßen'15

1
是的,如果您可以创建快照,请使用快照。cp --reflink=always当您要克隆的内容不是子卷的根时,它仍然可以派上用场,因为它btrfs subvolume snapshot仅对子卷起作用,而不对子卷的某些部分起作用。
Celada
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.