今天在处理一个问题,最后发现是文件系统满(file system full)造成的,df看一下,果然/opt文件系统的Use%变成了100%。于是马上到/opt目录下用du命令看一下是哪个地方出现了大文件把文件系统撑爆了:du -sm | sort -nr

/opt目录分配了30G的空间,我看了一下前几名的占用也不过10G左右。进一步,直接执行du -sh /opt 发现/opt目录的文件总和也不过12G,这就奇怪了,莫非18G被系统吃了???

无奈Google了一下du df different results,发现原来是==系统存在删除的文件没有释放==导致。

具体来说是,某进程持有对某文件的引用,但此文件直接被删除了,该进程实际上还是能写入该文件,只不过该文件已经在文件系统内不可见。这才导致du的结果和df不一致!

具体验证方法,就是lsof |grep '(deleted)',果然看到了我之前删除的一个大日志文件。赶紧重启了该进程,一切都正常了。

为什么删除的文件可以继续使用?

Linux下文件系统使用inode进行管理。对进程来说,对文件的引用并不是通过路径名实现,所有的路径名都要转换成一个inode的结点id,路径名只不过是提供给“用户”的概念。 正式基于此,Linux下竟然可以在进程使用的时候,对占用的文件进行重命名甚至删除操作。因为,进程根本不关心路径名!

-------------------------

本文采用 知识共享署名 4.0 国际许可协议(CC-BY 4.0)进行许可。转载请注明来源:https://imshuai.com/du-df-different-results 欢迎指正或在下方评论。