【问题标题】:Size of directory .(DOT) does not decrease?目录.(DOT)的大小不会减少?
【发布时间】:2015-10-07 13:28:35
【问题描述】:

我正在研究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 个硬链接,大小应该会减小。

但实验表明尺寸并没有减小。我哪里错了?

提前谢谢你!

最好的祝愿, 约克

【问题讨论】:

    标签: linux filesystems inode hardlink


    【解决方案1】:

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

    【讨论】:

    • 是的,删除文件夹并创建一个新的同名文件夹将使目录恢复到原来的大小。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-23
      • 2015-11-01
      • 2021-04-25
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 2018-06-12
      • 2013-01-07
      相关资源
      最近更新 更多