Linuxでは(おそらくファイルシステムのブロックサイズの関数として)、ディレクトリを作成してstat
すると、サイズは4096になります。このディレクトリにファイルを作成できます。ディレクトリの認識されるサイズを増やす(stat
によって報告される)。
ある時点で、ディレクトリが多くのファイルでいっぱいになると、ディレクトリサイズが膨らみます(ディレクトリの内容について話しているのではなく、ディレクトリ自体を表すために消費されるブロックについて話している)。ファイルが削除されても、ディレクトリサイズは同じままです。
簡単な例を次に示します。
[root@uxlabtest:/]$ mkdir test
[root@uxlabtest:/]$ stat test
File: `test'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd00h/64768d Inode: 1396685 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2011-07-26 14:06:04.000000000 -0400
Modify: 2011-07-26 14:06:04.000000000 -0400
Change: 2011-07-26 14:06:04.000000000 -0400
次に、ファイルの束に触れます。
[root@uxlabtest:/]$ for i in `seq 1 10000`; do touch /test/$i; done
[root@uxlabtest:/]$ stat test
File: `test'
Size: 155648 Blocks: 312 IO Block: 4096 directory
Device: fd00h/64768d Inode: 1396685 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2011-07-26 14:06:04.000000000 -0400
Modify: 2011-07-26 14:06:56.000000000 -0400
Change: 2011-07-26 14:06:56.000000000 -0400
次に、ファイルを削除します。
[root@uxlabtest:/]$ rm -rf /test/*
[root@uxlabtest:/]$ stat test
File: `test'
Size: 155648 Blocks: 312 IO Block: 4096 directory
Device: fd00h/64768d Inode: 1396685 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2011-07-26 14:07:11.000000000 -0400
Modify: 2011-07-26 14:07:12.000000000 -0400
Change: 2011-07-26 14:07:12.000000000 -0400
私の質問は:
Ext2/ext3/ext4に当てはまる答えは次のとおりです。それらが他のファイルシステムに当てはまるかどうかは、それらの実装によって異なります。
しかし、あなたには運があります。すでに削除したのと同じ量のファイルを再作成すると、ディレクトリサイズは同じままになります。さらにファイルを追加した場合にのみ、ファイルは増加します。
表示されているブロックの増分は、ファイルシステムがファイルのストレージと関連するファイル管理情報を管理する方法によるものです。説明した状況では、これは4Kの増分に見えるため、実際のデータサイズが4K全体を占めるかどうかに関係なく、ファイルシステムへの「新しい」/「一意の」エントリごとに4Kが予約されます。関連データが4K全体を占める場合、関連データストリーム/シーケンス全体を保存するために、必要に応じて別の4Kブロックが予約および入力されます。
ファイルシステムによって管理される「ハード」削除と「ソフト」削除によっては、削除によって、予約されたブロックがすぐに解放されない場合があります(通常は「削除解除」機能ではありません)。一部のファイルシステムは、さまざまなタイプの「削除」を区別し、対応するストレージブロック管理機能を提供する場合があります。
ストレージ管理へのアプローチと実装の方法はファイルシステムによって異なるため、複数/モジュラーファイルシステムをサポートするOSでは、OSは通常、ファイルシステムを統合するための「フック」のみを提供します。
User48838の良い答えにいくつかのとりとめのない解説を追加します。
ディレクトリを含め、すべてがファイルです。そのすべてのファイル情報を保存するには、スペースが必要です。
たとえば、小さなディレクトリに「64B使用済み」を表示して実際に使用されているスペースの量を表示することも有効ですが、とにかくディスク上で4Kの倍数を使用するため、単に表示することは設計上の決定でした。使用済みスペースの量。
FS設計の観点から、使用されたものを計算するのに苦労するのはなぜですか?必要ありません。そして、穴を残さないようにエントリを移動する必要があります…。
削除が発生し、ディレクトリサイズが減少して、couldがブロックを解放できる場合、実際に実行する前に、すべての管理を実行する必要があります。なぜわざわざ数KBを節約するのですか?とにかく後で拡張する必要がある可能性があります。
読者のための演習として残しました:/ lost + foundディレクトリが空で作成されているのに16Kを占める理由を考えてください(少なくともext3では)。