web-dev-qa-db-ja.com

UNIXでディレクトリのサイズが常に4096バイトになるのはなぜですか?

ディレクトリファイルの情報は4096バイトよりはるかに少ないと思います。セクターサイズは4096バイトです。しかし、それよりも小さい通常のファイルは存在します。

Unixが各フォルダに4096バイトを予約するのはなぜですか?

26
Lazer

これは、そのディレクトリに含まれるファイルに関するメタデータ(名前を含む)を格納するために必要な初期サイズです。最初の割り当ては1セクターのサイズと同じですが、必要に応じてそれを超える可能性があります。一度割り当てられると、断片化を減らすために、ファイルが削除されてもスペースは解放されません。

例えば:

$ mkdir testdir
$ cd testdir
$ ls -ld .
drwxr-xr-x 2 matthew matthew 4096 2007-12-03 20:28 ./
$ for ((i=0; i<1000; i++)); do touch some_longish_file_name_$i; done
$ ls -ld .
drwxr-xr-x 2 matthew matthew 36864 2007-12-03 20:29 ./
$ rm some_longish_file_name_*
$ ls -ld .
drwxr-xr-x 2 matthew matthew 36864 2007-12-03 20:29 ./
$ cd ..
$ ls -ld testdir
drwxr-xr-x 2 matthew matthew 36864 2007-12-03 20:29 testdir/
$ rmdir testdir ; mkdir testdir
$ ls -ld testdir
drwxr-xr-x 2 matthew matthew 4096 2007-12-03 20:29 testdir/

ソース

30
harrymc

一部のファイルシステムでは、4096バイトが最小の割り当て単位になる場合があります。これが、ディレクトリに4096がある理由です。

同じことがファイルにも当てはまります。一部のファイルは4096未満を報告する場合がありますが、実際にはディスクから少なくとも4096のストレージを使用しています。

11

4096は断片化を減らすために予約されています。これは、含まれるメタデータの実際のサイズがディレクトリの内容に基づいて変動することが多いためです。時間の経過とともに常に拡大および縮小している(たとえば、ログファイルや動的コンテンツが含まれている)場合、パフォーマンスが低下する可能性があります。これはおそらく1つのフォルダーでは発生しませんが、ファイルシステム全体で急速に増加します。

5
MDMarra

それはファイルシステムに依存します。 ext2/3/4では "is" 4096です。reiserfsでは9608(my $HOME)1032(/tmp)または48(/tmpのディレクトリ)になります。

デフォルトでは、ext2/3/4ブロックは4096であり、ファイルはそれよりも小さい値を取ることはできません。ファイルが小さい場合、とにかく全体のブロックがかかります。ディレクトリの論理サイズについて尋ねるのは無意味であり、この情報はおそらくディスクにないので、ブロックのサイズと取得されたブロックの数、つまり取得された物理スペースを報告する何かを報告する必要があります。

3