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の機能ですか?
- ディレクトリを削除して再作成することなく、ディレクトリのサイズを縮小できますか?
- ボーナスポイント:この動作が実装されているカーネルソースコードを教えてください。