linux操作系统中df和du的区别


du命令

du的英文原义为“disk usage”,含义为显示磁盘空间的使用情况,统计目录(或文件)所占磁盘空间的大小。该命令的功能是逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块(1024字节)的情况。若没有给出指定目录,则对当前目录进行统计。

需要注意的是:

1、du命令的输出列表是从目录层级的最底部开始,然后按文件、子目录、目录逐级向上

2、du命令默认不会统计隐藏文件,需要使用-a参数支持;du命令不统计Inode引用计数为0的文件

常用参数:

 -c:显示所有已列出文件总的大小。

 -s:显示每个输出参数的总计

dh命令

df(disk free)命令可以获取硬盘被占用了多少空间,目前还剩下多少空间等信息,它也可以显示所有文件系统对Inode节点和磁盘块的使用情况。

文件句柄

一个文件创建,就新生成了一个inode节点,且inode节点的引用计数为1。当文件被一个进程打开,则在内存中缓冲建立此inode节点缓存,且其引用计数加1。一个文件可以被多次打开,创建多个文件描述符,但对应的inode节点只有一个,对应的磁盘存储只有一个,只是引用计数每打开一次加1。

当文件被rm,在操作系统内部其实是调用了unlink操作,其目录项被删除,如果其对应的inode节点的引用计数为0,则删除对应的inode节点和清除inode节点位图中对应的位,其对应磁盘可被再申请;但如果此文件被其他进程打开,则其对应的inode节点的引用计数不为0,则不会删除对应的inode节点和清除inode节点位图中对应的位,其对应磁盘不能被再申请,也就是在lsof下可以看到deleted句柄;当前文件被所有使用进程close后,系统删除对应的inode节点和清除inode节点位图中对应的位,其对应磁盘可被再申请。

当df命令显示的结果出现负值时,是因为Linux操作系统提供了保留分区,会给root或指定用户预留5%或更大的空间,当使用到这块保留区的空间时,fdisk命令的计算将会是负数。

导致出现du和df结果不一致的情况

1、正常情况下,df和du输出结果都会有差距。

  •      du -sh命令通过将指定文件系统中所有的目录、符号链接和文件使用的块数累加得到该文件系统使用的总块数;
  •      df命令通过查看文件系统磁盘块分配图得出总块数与剩余块数。
  •      文件系统分配其中的一些磁盘块用来记录它自身的一些数据,如i节点,磁盘分布图,间接块,超级块等。这些数据对大多数用户级的程序来说是不可见的,通常称为Meta Data。
  •      du命令是用户级的程序,它不考虑Meta Data,
  •      df命令则查看文件系统的磁盘分配图并考虑Meta Data。
  •      因此正常情况下,df计算的USED空间会比du计算的结果要稍大。

2、异常情况导致du和df结果差距

  • 由于磁盘挂载前该路径下就存在文件,挂载后用du无法查询到原路径文件。卸载分区后可以看到原有文件
  • 用户删除了某些文件后,du命令就不会统计这些文件了,由于有运行的程序仍持有文件,该文件的super-block信息并不会删除,该文件会被标记为deleted状态,当 进程重启 或者 服务器重启后磁盘自检 后会自动释放掉这部分deleted的句柄。lsof |grep deleted
  • 如果检查都没有问题,可以备份磁盘数据后尝试将磁盘分区卸载,然后fsck -y partition_name(分区名) 来进行磁盘修复。