Btrfsはコピーオンライトをサポートしています。私はその機能を使用してディレクトリを複製しようとしました:
cp -R --reflink=always foo_directory foo_directory.mirror
(btrfs subvolume snapshot
のように)コマンドがほぼ瞬時に終了することを期待していましたが、cp
コマンドは低速で標準的なコピーを実行しているようです。
マニュアルページによると、私は--reflink=always
がコピーオンライトを実施することを期待していました:
--reflink [= always]が指定されている場合、軽量コピーを実行します。データブロックは変更された場合にのみコピーされます。これが不可能な場合、コピーは失敗するか、または--reflink = autoが指定されている場合は、標準のコピーにフォールバックします。
質問:
--reflink=always
が機能しない理由を知っていますか?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
とは異なり、まだ時間がかかります。これはおそらく、操作の実行にかかる時間を説明しています。