なぜcp --reflink=auto
デフォルトの動作ではありませんか?それを有効にするために害を及ぼす可能性はありますか?
コンパイル時に有効にして、対話型シェルだけでなく、システム全体で使用できるようにすることは可能ですか?
堅牢性の理由から、データの破損を防ぐためにコピーを作成する必要がある場合があるため、これはデフォルトではありません。また、パフォーマンス上の理由から、CoWファイルで作業していて、メカニカルディスクの別の部分への書き込みによって遅延される可能性がある一部のレイテンシの影響を受けやすいプロセスではなく、コピー時に書き込みを実行したい場合があります。 coreutils v8.24以降、mvには上記の制約がないため、デフォルトでreflinkすることに注意してください。
なぜそれがデフォルトではないのかわからない、おそらく他のコピーユーティリティ(rsync
、cpio
、pax
、tar
。 ..)それをサポートしていない(またはそれを許可しないインターフェース(NFS、samba、Fuseファイルシステムレイヤーなど)を介してファイルがコピーされた場合)。
私は数年前に同じ状況にあり、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;
1つの大きな問題は、書き込み時にコピーを実行するためのスペースが不足する可能性があることです。
通常のコピーでは、コピーが完了するとすぐに、ファイルの既存の部分への書き込みが失敗することを心配する必要はありません。スペースは完全に割り当てられ、ファイルを削除するまで消えません。しかし、reflinkコピーでは、いつか数週間または数か月後に、コピーを作成するための十分なスペースがなかったため、ファイルの既存の部分への書き込みが失敗するリスクが常にあります。
このような操作が失敗したときに、システムが背後でreflinkコピーを実行していたことを発見すると、かなり厄介な驚きになります。
alias cp='cp --reflink=auto --sparse=always'
コードをパッチするよりも理にかなっています
データの「損失」を防ぐためにコピーを作成する必要がある堅牢性の理由。
それが理由かどうかはわかりませんが、起こり得る悪いことはメディアの破壊に限られています。ほとんどすべてのブロックデバイスには、前方誤り訂正(パリティ)でない場合、何らかの形式の破損識別(crc)があります。
パフォーマンス上の理由ではありません。
消去の一部だけが発生すると、牛が発生しますか?ブロックに書き込まれます。最新の!disk!デバイスのハードウェアブロックサイズは4kの倍数です。 4kの一部を変更すると、ドライブは4k全体を読み取って再度書き込みますが、それに加えてカーネルは同じことを行うため、ブロックデバイスやSSDなどに到達する部分的な書き込みはありません。カーネルは、同じ理由でCoWを実行する必要があります。キャッシュされたコピーがない限り、デバイスの他の部分に存在するデータを作成できません。ファイルの最後の部分を除いて保存しますが、ポイントは愚か。ただし、ファイルのコピーをキャッシュすることとファイルをコピーすることはさまざまな操作であり、前者の方がはるかに安価です。
書き込みのアドレスは重要ではありませんが、「デバイスの一部の未使用部分」は「ファイルのブロックが現在存在する場所」よりも発見する方が安価であることを知らせてください。
実際のところ、どのCoWメソッドも、ブロックデバイスを単に更新するよりも安価または同等です。さて、ブロックデバイスについて話していなければ、それはまた別の話になるでしょう...テープのどこかに書かれています。