「cp -R --reflink=always」がBtrfsファイルシステムから標準コピーを実行するのはなぜですか?

「cp -R --reflink=always」がBtrfsファイルシステムから標準コピーを実行するのはなぜですか?

Btrfs は書き込み中のコピーをサポートします。この関数を使用してディレクトリを複製しようとしています。

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

コマンドはほぼすぐに完了すると予想しましたが(例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おそらくそれにかかる時間を説明します。

関連情報