GNU/Linux >> Linux の 問題 >  >> Linux

ファイルは順番にディスクに保存されますか?

<ブロック引用>

ファイルを保存できますかできません ディスク上で順次?つまり、ファイルの一部は物理アドレス X の下にあり、他の部分は X + オフセットに近くない物理アドレス Y の下にあります)。

はい;これはファイルの断片化と呼ばれ、特に大きなファイルでは珍しくありません。ほとんどのファイル システムは、必要に応じて多かれ少なかれ順次に領域を割り当てますが、将来の動作を推測することはできません。そのため、ファイルに 200MiB を書き込んでからさらに 100MiB を追加すると、両方のデータ セットが失われる可能性がゼロではありません。ディスクの異なる領域に保存されます (基本的に、最初の書き込みの後、2 番目の書き込みの前に発生する、ディスク上により多くのスペースを必要とする他の書き込みは、2 つの間に入る可能性があります)。ファイルシステムが満杯に近い場合、通常は状況が悪化します。新しいファイルを保持するのに十分な大きさの連続した空き領域がない可能性があるため、断片化する必要があります。

<ブロック引用>

10GBの大きなファイルを割り当てたいディスク内でシーケンシャルにし、異なるオフセット間で分割しないようにしたい.

ファイルの作成時に、ファイルの目標サイズをファイルシステムに伝えることができます。これは、ファイルシステムが最適に保存するのに役立ちます。最新のファイルシステムの多くは、遅延割り当てと呼ばれる手法を使用しています。この手法では、新しいファイルのディスク上のレイアウトが可能な限り遅く計算され、計算の実行時に利用可能な情報が最大化されます。 posix_fallocate(3) を使用すると、このプロセスを支援できます。 合計でどれだけのディスクスペースを割り当てる必要があるかをファイルシステムに伝える関数。最新のファイルシステムは、この割り当てを順番に実行しようとします。

<ブロック引用>

異なるタイプ間で異なる動作をしますか?

はい、ファイルシステムが異なれば動作も異なります。 NILFS2 などのログベースのファイルシステムは、Ext4 などのエクステントベースのファイルシステムと同じ方法でストレージを割り当てません。これはバリエーションの一例にすぎません。


コマンド filefrag ファイルがデバイスに物理的にどのように保存されているかがわかります:

# filefrag -v /var/log/messages.1 
Filesystem type is: ef53
File size of /var/log/messages.1 is 41733 (11 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0  2130567               1 
   1       1 15907576  2130568      1 
   2       2 15910400 15907577      1 
   3       3 15902720 15910401      7 
   4      10  2838546 15902727      1 eof
/var/log/messages.1: 5 extents found

ファイルを 1 回のパスで書き込めば、ファイルは断片化されないと思います。

fallocate の man ページ (1) はかなり明確です:

<ブロック引用>

fallocate ブロックをファイルに事前に割り当てるために使用されます。 fallocate をサポートするファイルシステムの場合 これは、ブロックを割り当てて未初期化としてマークすることで迅速に行われ、データ ブロックへの IO は必要ありません。これは、ゼロで埋めてファイルを作成するよりもはるかに高速です。

Linux カーネル v2.6.31 の時点で、fallocate システム コールは、btrfs、ext4、ocfs2、および xfs ファイルシステムでサポートされています。

シーケンシャルですか?システムは、最初にブロックを順番に割り当てようとします。できない場合、警告は表示されません。


あなたはスパースファイルに言及していますが、他の回答はそれらに言及していません.

ほとんどのファイルはスパースではありません。ファイルを作成する最も一般的な方法は、最初から最後まですべてを一度に書き込むことです。そこに穴はありません。

ただし、「1,000,000,000,000 の位置に移動して、そこに 1 バイト書き込む」ということはできます。これにより、1 etabyte のサイズのように見えるファイルが作成されますが、実際には (おそらく) ディスク上で 4k しか使用されません。これはスパース ファイルです。

同じファイルに対してこれを何度も行うことができ、少量のデータが広大な空白に散らばって残ります。

これは便利ですが、2 つの欠点があります。

1 つ目は、ファイルが断片化されることです。これが心配です。

2 つ目は、すべてのプログラムがこれらのファイルを適切に処理できるわけではないということです。例えば。一部のバックアップ ソフトウェアは、空をバックアップしようとするため、必要以上に大きなバックアップが作成されます。 バックアップ メディアとしては大きい


Linux
  1. Linuxでmvなしでファイルを移動する

  2. ファイルが画像であるかどうかを判断するためのスクリプト?

  3. Linux のスパース ファイルとは

  1. 大きなファイルの行数を数える

  2. ファイルを削除していますが、ディスク容量はまだいっぱいです

  3. なぜ .so ファイルは実行可能ですか?

  1. ファイルシステムにデータを隠す?

  2. Linux でのファイル編集はディスクに直接保存されますか?

  3. 巨大なスパース ファイル (VM ディスク イメージ) をマシン間でどのように同期しますか?