web-dev-qa-db-ja.com

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

Btrfsはコピーオンライトをサポートしています。私はその機能を使用してディレクトリを複製しようとしました:

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

btrfs subvolume snapshotのように)コマンドがほぼ瞬時に終了することを期待していましたが、cpコマンドは低速で標準的なコピーを実行しているようです。

マニュアルページによると、私は--reflink=alwaysがコピーオンライトを実施することを期待していました:

--reflink [= always]が指定されている場合、軽量コピーを実行します。データブロックは変更された場合にのみコピーされます。これが不可能な場合、コピーは失敗するか、または--reflink = autoが指定されている場合は、標準のコピーにフォールバックします。

質問:

  • --reflink=alwaysが機能しない理由を知っていますか?
  • 代わりにどのオプション(または他のコマンド)を使用する必要がありますか?
12
Philipp Claßen

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とは異なり、まだ時間がかかります。これはおそらく、操作の実行にかかる時間を説明しています。

20
Celada