cp --reflink = autoがデフォルトの動作ではないのはなぜですか?


31

なぜcp --reflink=autoデフォルトの動作ではないのですか?それを有効にすることで害を及ぼす可能性はありますか?

コンパイル時に有効にすることは可能ですか?インタラクティブなシェルだけでなく、システム全体で使用されますか?


4
はい、いい質問です。私見では、BTRFSのみがデフォルトのLinuxファイルシステムになり始めます。
アダムリツコフスキ

回答:


38

堅牢性の理由から、データの破損から保護するためにコピーを作成する必要があるため、これはデフォルトではありません。また、パフォーマンス上の理由から、レイテンシーに敏感なプロセスがCoWファイルで動作し、おそらくメカニカルディスクの別の部分への書き込みによって遅延するのではなく、コピー時に書き込みを行うことができます。上記の制約がないため、coreutils v8.24 mvからデフォルトでreflinkされることに注意してください。


8
(PádraigはGNU coreutilsのメンテナーであるため、これは信頼できる回答と見なすことができます)。
ステファンシャゼル

8
少なくともbtrfsでは、この答えが正しいとは思えません。ファイルが後で書き込まれた場合、新しいデータはbtrfs CoWのためにとにかく別のディスクセクターに書き込まれるため、reflinkを行わないことによる遅延の利点はありません。NoDataCoWが設定されているファイルは、とにかく参照リンクできません。また、データの破損から保護する場合は、別のパーティションにコピーする必要があり、reflinksも機能しません。
-JanKanis

3
BTRFSは書き込み時にスペースを見つけて割り当てる必要があるため、待ち時間の問題があります。これでも、書き込み時にENOSPCエラーを投げるように利用できない可能性があります
パドレイグブレイディ

1
reflinkのmvの用途は何ですか?
マチル

1
btrfsのクロスサブボリュームの名前の変更
パドレイグ・ブレイディ

17

それは多分そう、それは他のコピーユーティリティ(と同じように動作していること、デフォルトではない理由を知ってはいけないrsynccpiopaxtarそれはサポートしていない(またはファイルがあることを許可しないインターフェースを介してコピーされたときに...) (NFS、Samba、Fuse File Systems Layerなど)。

私は数年前と同じ状況にあり、GNU cpコードをすばやく見て、それでも同じです。異なるデフォルトの動作を得るためにコードを修正する必要があります:

--- coreutils-8.21/src/cp.c~    2013-06-22 21:50:26.265639114 +0100
+++ coreutils-8.21/src/cp.c     2013-06-22 21:51:06.880513924 +0100
@@ -775,7 +775,7 @@ cp_option_init (struct cp_options *x)
   x->interactive = I_UNSPECIFIED;
   x->move_mode = false;
   x->one_file_system = false;
-  x->reflink_mode = REFLINK_NEVER;
+  x->reflink_mode = REFLINK_AUTO;

   x->preserve_ownership = false;
   x->preserve_links = false;

4

大きな問題の1つは、書き込み時にコピーを実行するためのスペースが不足する可能性です。

通常のコピーでは、コピーが完了するとすぐに、ファイルの既存の部分への書き込みが失敗することを心配する必要はありません。スペースが完全に割り当てられ、ファイルを削除するまで消えません。しかし、reflinkコピーでは、コピーを作成するのに十分なスペースがなかったため、数週間または数か月後に、ファイルの既存の部分への書き込みが失敗するリスクが常にあります。

そのような操作が失敗したときに、システムがあなたの背中の後ろでreflinkコピーを行っていたことを発見することは、かなり厄介な驚きです。


少なくともbtrfsでは、ファイルのすでに割り当てられている部分への書き込みでもENOSPCで失敗することがあります
...-graywolf

2
alias cp='cp --reflink=auto --sparse=always'

コードをパッチするよりも理にかなっています


6
あなたが見落としているように見えますコンパイル時に有効にすることは可能ですので、OPの質問のインタラクティブなシェルだけでなく、システム全体で使用されます
ステファンシャゼラス

5
@StephaneChazelas一つは、常に名前に変更することもでき/bin/cp、同様のシェルスクリプトに置き換える
goncalopp

0
  1. データの「損失」から保護するためにコピーを実行することが必要な堅牢性の理由。

    それが理由だとは知りませんが、起こりうる悪いことはメディアの破壊に限られています。ほとんどすべてのブロックデバイスには、前方誤り訂正(パリティ)でない場合、何らかの形の破損識別(crc)があります。

  2. パフォーマンス上の理由ではありません。

    CoWは、消去の一部のみが発生したときに発生しますか?ブロックが書き込まれます。最新の!disk!デバイスのハードウェアブロックサイズは4kの倍数です。4kの一部を変更すると、ドライブは4k全体を読み取って再度書き込みますが、その上、カーネルは同じことを行うため、ブロックデバイス、SSDなどに到達する部分的な書き込みはありません。 。カーネルは同じ理由でCoWを実行する必要があります。キャッシュされたコピーがない限り、デバイスの他の部分に存在するデータを作成することはできません。論争。ただし、ファイルのコピーをキャッシュすることとファイルをコピーすることは操作が異なるため、前者の方がはるかに安価です。

    書き込みのアドレスは重要ではありませんが、「デバイスの一部の未使用部分」は、「ファイルのブロックが現在存在する場所」よりも安く発見できることを知っておいてください。

実際、CoWの方法は、単にブロックデバイスを更新するよりも安価であるか、同等です。ブロックデバイスについて話していないのなら、それはまた別の話になるでしょう...どこかにテープで書かれています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.