--Dig-holes
がスパースファイルをインプレースで作成することを完全に理解しています。つまり、ファイルに穴がある場合、--Dig-holes
オプションはそれらの穴を削除します。
それを非常に単純化した方法で考えてみましょう。non-sparseという名前の巨大なファイルがあるとします。
非スパース:
aaaaaaaaaaaaaaaaaaaaaaaaaaaa
\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00
bbbbbbbbbbbbbbbbbbbbbbbbbbbb
\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00
cccccccccccccccccccccccccccc
non-sparseには多くのゼロが含まれます。インターリーブするゼロはギガバイト単位であると想定します。 fallocate --Dig-holes
は、実際のファイルサイズが同じまま(維持される)、ゼロ(穴)に使用可能なスペースの割り当てを解除します。
さて、--punch-hole
は本当に何をしているのですか?私はマニュアルページを読みましたが、まだ理解できません:
-p, --punch-hole
Deallocates space (i.e., creates a hole) in the byte range
starting at offset and continuing for length bytes. Within
the specified range, partial filesystem blocks are zeroed,
and whole filesystem blocks are removed from the file.
After a successful call, subsequent reads from this range
will return zeroes.
穴を作成することは、--Dig-hole
オプションの反対であり、穴を掘ることが穴を作成することと同じではないのはなぜですか?助けて!論理学者が必要です:).
2つのオプションの命名は、言語的に同義であり、おそらく混乱を招きます。
--Dig-holes
と--punch-holes
の操作上の違いは何ですか(論理的または言語的にではありません!)
--Dig-holes
は、ファイルの読み取り時に決定されるように、ファイルの内容を変更しません。単に、穴と置き換えることができるゼロの連続を識別します。
--punch-hole
は--offset
および--length
引数は、ファイルがそのオフセットで何を含んでいるかに関係なく、ファイルに穴を開けます。ファイルにゼロ以外のものが含まれている場合でも機能しますが、結果としてファイルの内容changeとなります。サンプルファイルを考慮して、fallocate --punch-hole --offset 2 --length 10
は、2番目の文字の後に、10個のa
文字をゼロで置き換えます。
要するに:
--Dig-holes
は、ファイルの内容を変更せずにファイルをスパースにします(プログラムがファイルを読み取っているように見えます)。--punch-hole
はファイルに穴を開け、既存のデータを変更する可能性があります。違いは、--Dig-holes
は、スパースにできる領域のファイルを分析する(--offset
と--length
を使用して、分析するファイルの範囲を示す)のに対し、--punch-holes
は--offset
と--length
を使用して、実際にファイルの一部をゼロアウトして穴を作成します。
複数の「掘り穴」と単数の「パンチ穴」にも注意してください。
マニュアル から、--Dig-holes
に関して:
このオプションは、
cp --sparse
を実行し、追加のディスク領域を必要とせずに宛先ファイルの名前を元のファイルに変更するものと考えることができます。