du与df显示不相等的磁盘容量的问题

前言

工作中,遇到一个古怪的情况,某一台服务器告警磁盘快满了,第一反应是三连发 fdisk df du 命令来查看磁盘文件占用情况,让人奇怪的是, du 与 df 所看到的根目录的磁盘空间已使用容量不一样,虽说 Linux 有保留空间,但是差距是十多G,正常下,保留空间不可能这么大。

原由

同事让我执行 lsof | grep delete 看看,发现系统中有三个日志文件处于被删除状态却还在被一些服务进程打开并写入,并且文件大小接近十多G,原来这个症结所在,应急处理方法是重启服务进程,使文件inode得到释放,系统回收磁盘块,然后查找bug,修改逻辑。

记下 du 与 df 的区别,复习linux文件系统的知识

两者用法不详细列出,仅仅列出区别

  • du的英文原义为“disk usage”,含义为显示磁盘空间的使用情况。该命令逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块(1024字节)的情况。若没有给出Names,则对当前目录进行统计。du -sh命令通过将指定文件系统中所有的目录、符号链接和文件使用的块数累加得到该文件系统使用的总块数;du命令是用户级的程序,它不考虑Meta Data。

  • df命令参数功能:检查文件系统的磁盘空间占用情况,利用所有文件系统对i节点来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。df命令通过查看文件系统磁盘块分配图得出总块数与剩余块数。文件系统分配其中的一些磁盘块用来记录它自身的一些数据,如i节点,磁盘分布图,间接块,超级块等。这些数据对大多数用户级的程序来说是不可见的,通常称为Meta Data。df命令则查看文件系统的磁盘分配图并考虑Meta Data。

因此正常情况下,df计算的USED空间会比du计算的结果要稍大。

参考资料

Linux磁盘管理命令df和du区别