有时候遇到这样的问题,df
显示文件系统满了,于是ducks一把,看是否有些不正常的文件或目录,奇怪的是,du的结果显示文件系统中还有不少空间。
那么,du和df哪个结果是正确的呢?
both.
造成这个现象的原因是有进程仍然打开着已经被删除的文件。因为该文件已经不存在于文件目录树上,所以du遍历整个文件系统中不会统计其所占用的空间,可是,这个文件又还不能被从磁盘上删除,所以确实还占用了一部分磁盘空间。
可以用lsof来确定究竟是哪个进程搞的鬼,比如:
# lsof | grep (deleted)
tail 6505 root 3r REG 7,0 921600 12 /media/foo/foo (deleted)
上面这个例子显示tail(pid为6505)进程打开了一个已经被删除的文件(/media/foo/foo),这个文件大小为921600。此时,如果终止tail这个进程,那么这900多K字节就会正常释放,df的输出也就和du一致了。
曾经接到过此类问题的报告,似乎杀了sendmail就好了。当时不知原由,现在想来,可能是系统长时间运行后sendmail的日志经过了rotate,而sendmail仍然打开着旧的日志文件。
这个问题 Theodore Ts’o 03年便回答过,而且当时就根据他的建议添加到了ext3 FAQ中。 今天才仔细读过,豁然开朗。读书不精,不求甚解,惭愧惭愧。
参考资料