您的位置:首页 > 运维架构 > Linux

linux目录大小显示不实时问题

2017-09-25 03:42 323 查看
之前有朋友在群里问到这个问题,为什么ls -l 显示的目录的大小跟预期的不一样。
问题如下



问题: 在data目录下创建5000个文件,这个目录大小变了,然后我删除了这5000个文件,这个目录的大小没有发生变化。为什么?

要解答这个问题我们首先要清楚linux中文件的储存原理,linux中一切皆是文件,从根往下呈现树状结构




再往下延伸,当前目录的属性信息其实是存在其上级目录的block中,比如大小。由下图可知





1. 这是文件的属性信息 这个信息是存储在此目录的上级目录的block里的,叫目录项。 你删除了这个目录下面的所有文件,但是这个文件的目录项信息是没有被改变的。所以这个没变,只是这个信息没变而已,空间已经被释放了。
2. linux 中 ls -adh /某目录这个命令显示的是这个目录的block的大小,这里只存了这个目录下的所有目录项,目录项大小不大,跟本身指向的文件的大小没关系,就算你放10G的视频文件到一个目录下,这个目录的大小可能还是初始值4K, 只要你放的不是超多个小视频,而是几个超大超豪华的高清视频。
3. 这里合理的解释是当目录block的大小变大时,linux会在其上级目录的此目录的目录项信息里更新这个目录block的大小,但是当这个大小变小linux却不会自动更新这个信息。 不过也只是这个信息不更新而已,其他的诸如空间和inode已经全部被系统回收。 也就是说,系统不会出现问题,只是这个信息没有变小。
我觉得这是一个linux系统中的bug。不过也可能是系统编写者故意这样的。。
原因可能是linux目录大小一般不会太大 这个信息可以只保留历史最大的值。只要空间已经被系统回收就可以了。

关于验证,你可以新建十万个文件和几个视频大文件,然后看系统inode剩余,和空间剩余。 然后删掉这些文件,你会发现,系统回收了所有的空间和inode,但是唯独这个目录的大小不变。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux inode 目录大小