我正在研究linux文件系统。我有一个实验来探索linux如何保存硬链接。
我为同一目录中的文件创建了1000个硬链接。 (DOT)的大小增加到28672;我删除500个硬链接,大小。(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个硬链接,我看到了:
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,并且还使用一个数据块来保存该文件夹中文件和目录的条目。由于每个硬链接需要一个条目,因此1000个硬链接需要比数据块更多的空间,因此需要另一个数据块。所以目录的大小。(DOT)增加。反之亦然,如果我删除500个硬链接,大小应该减少。
但实验表明,尺寸没有减少。我哪里错了?
提前谢谢!
祝福, 纽约
答案 0 :(得分:1)
你所看到的是正确的。许多Linux文件系统从不缩小目录inode的大小;它们只删除了已删除文件的条目,允许在以后将更多文件添加到目录时重用它们。将目录恢复为原始大小的唯一方法可能是删除它并创建一个具有相同名称的新目录。
答案 1 :(得分:0)
通常,在b树上实现inode,并且作为次要优化,可以根据需要增长,但不会崩溃。