web-dev-qa-db-ja.com

Linuxの `fallocate --Dig-holes`と` fallocate --punch-hole`の違いは何ですか?

--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の操作上の違いは何ですか(論理的または言語的にではありません!)

6
direprobs

--Dig-holesは、ファイルの読み取り時に決定されるように、ファイルの内容を変更しません。単に、穴と置き換えることができるゼロの連続を識別します。

--punch-hole--offsetおよび--length引数は、ファイルがそのオフセットで何を含んでいるかに関係なく、ファイルに穴を開けます。ファイルにゼロ以外のものが含まれている場合でも機能しますが、結果としてファイルの内容changeとなります。サンプルファイルを考慮して、fallocate --punch-hole --offset 2 --length 10は、2番目の文字の後に、10個のa文字をゼロで置き換えます。

10
Stephen Kitt

要するに:

  • --Dig-holesは、ファイルの内容を変更せずにファイルをスパースにします(プログラムがファイルを読み取っているように見えます)。
  • --punch-holeはファイルに穴を開け、既存のデータを変更する可能性があります。

違いは、--Dig-holesは、スパースにできる領域のファイルを分析する(--offset--lengthを使用して、分析するファイルの範囲を示す)のに対し、--punch-holes--offset--lengthを使用して、実際にファイルの一部をゼロアウトして穴を作成します。

複数の「掘り穴」と単数の「パンチ穴」にも注意してください。

マニュアル から、--Dig-holesに関して:

このオプションは、cp --sparseを実行し、追加のディスク領域を必要とせずに宛先ファイルの名前を元のファイルに変更するものと考えることができます。

10
Kusalananda