目录大小 .(DOT) 不会减少?

Size of directory .(DOT) does not decrease?

我正在研究linux文件系统。我有一个实验来探索 linux 如何节省 link 的困难。

我为同一目录中的一个文件制作了 1000 个硬 links。 .(DOT)的大小增加到28672;我删除了 500 hard links,.(DOT) 的大小没有减少。 (我用"stat ."查看大小。)为什么大小没有减小?

这是我的实验: 我有一个名为test的文件夹,里面只有一个小文件testfile和一个脚本,状态是这样的:

York:~/test$ ll -li
total 84
7995940 drwxr-xr-x 2 York domain_users  4096 Jul 17 19:20 ./
7995939 drwxr-xr-x 3 York domain_users 69632 Jul 17 19:20 ../
7996494 -rwxrwxrwx 1 York domain_users    94 Jul 17 19:14 copy.sh*
8026281 -rw-r--r-- 1 York domain_users     7 Jul 17 19:17 testfile

York:~/test$ stat .
  File: `.'
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: fc03h/64515d    Inode: 7995940     Links: 2
Access: (0755/drwxr-xr-x)  Uid: (2060469376/York)   Gid: (2060452353/domain_users)
Access: 2015-07-17 19:20:06.288345960 +0200
Modify: 2015-07-17 19:20:05.420340318 +0200
Change: 2015-07-17 19:20:05.420340318 +0200
 Birth: -

然后我运行脚本:

for i in `seq 200000 200999`;
do
  ln testfile "$i"
done 

之后,我得到了以下结果:

York:~/test$ stat .
  File: `.'
  Size: 28672       Blocks: 64         IO Block: 4096   directory
Device: fc03h/64515d    Inode: 7995940     Links: 2
Access: (0755/drwxr-xr-x)  Uid: (2060469376/York)   Gid: (2060452353/domain_users)
Access: 2015-07-17 19:21:25.364862751 +0200
Modify: 2015-07-17 19:21:11.064768884 +0200
Change: 2015-07-17 19:21:11.064768884 +0200
 Birth: -

而且我可以看到 inode 计数器是 1001,这是我所期望的:

York:~/test$ ll -li testfile 
8026281 -rw-r--r-- 1001 York domain_users 7 Jul 17 19:17 testfile

我用"rm"删除了500个硬links,我看到:

York:~/test$ ll -li testfile 
8026281 -rw-r--r-- 501 York domain_users 7 Jul 17 19:17 testfile

但是目录的大小并没有减少:

York:~/test$ stat .
  File: `.'
  Size: 28672       Blocks: 64         IO Block: 4096   directory
Device: fc03h/64515d    Inode: 7995940     Links: 2
Access: (0755/drwxr-xr-x)  Uid: (2060469376/York)   Gid: (2060452353/domain_users)
Access: 2015-07-17 19:24:35.138125221 +0200
Modify: 2015-07-17 19:24:35.142125246 +0200
Change: 2015-07-17 19:24:35.142125246 +0200
 Birth: -

我对文件系统中目录的理解是这样的:对于每个目录,分配一个inode用于文件夹名称等属性,还有一块数据用于保存该文件夹中文件和目录的条目.因为每个hardlink需要一个entry,所以1000个hardlink需要的数据块space比一个数据块还多,需要另外一个数据块。因此目录 .(DOT) 的大小增加了。反之亦然,如果我删除 500 个硬 links,大小应该减小。

但是实验证明尺寸并没有变小。我哪里错了?

提前致谢!

最良好的祝愿, 约克

您所看到的是正确的。许多 Linux 文件系统从不缩小目录 inode 的大小;他们只是清空已删除文件的条目,以便在以后将更多文件添加到目录时重新使用它们。 return 将目录恢复到原始大小的唯一方法可能是删除它并创建一个同名的新目录。

通常,inode 是在 b 树上实现的,作为一个小的优化,inode 可以根据需要增长,但不会崩溃。