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
私の質問は:
- ディレクトリのサイズ/ブロック数が単調に増加するのはなぜですか?
- これは、基盤となるファイルシステムまたはLinux VFSの機能ですか?
- ディレクトリを削除して再作成することなく、ディレクトリのサイズを縮小できますか?
- ボーナスポイント:この動作が実装されているカーネルソースコードを教えてください。