df -Th与du -sh命令查询的结果不一致问题

img

我用df -Th命令查找到文件系统为“/dev/mapper/centos-root”的磁盘已用33G,它的挂载点是“/”,但是我使用du -sh /命令查看根目录下磁盘使用情况,得到的却是5.7G,这是怎么回事?

引用 皆我百晓生 小程序回复内容作答:

这可能是因为df和du命令计算磁盘使用情况的方式不同。

df命令以文件系统为单位,统计磁盘使用情况。它通过读取文件系统的元数据来获取使用的磁盘空间情况。因此,如果有删除或移动文件但未重启系统或卸载文件系统,df命令可能不会反映这些变化。

du命令则是以目录为单位,统计指定目录及其子目录的磁盘使用情况。它通过递归地遍历目录树,获取每个文件的大小,并将所有文件大小相加。du命令会实时计算目录下文件的大小,因此可以反映实际的磁盘使用情况。

因此,如果你删除或移动了文件,但没有重启系统或卸载文件系统,那么df命令可能不会准确反映磁盘使用情况。你可以尝试重启系统或卸载文件系统,然后再使用df命令查看磁盘使用情况。

两者查很多大概率是因为:删除了很多文件但是文件还是被程序占用导致空间没有被释放。删除了大量文件之后,du不会在文件系统目录中统计删除的文件,但是df命令还是会统计,从而导致了差距很大。可以通过lsof | grep deleted查看是否有大量标记为deleted的文件。找到对应的进程,kill掉即可。如果是服务进程,需要检查下kill之后是否会重启,没有重启的话需要手动启动

有帮助的话请点采纳该答案

【以下回答由 GPT 生成】

这个差异是由于df -Thdu -sh命令计算磁盘使用情况的方式不同而引起的。

  • df -Th命令显示文件系统的磁盘使用情况,包括已用空间、可用空间、总空间和文件系统类型等。它通过读取文件系统的元数据来计算磁盘使用情况,单位为块大小。

  • du -sh命令用于估计目录或文件的磁盘使用情况,并以易读的方式显示。它通过递归地遍历目录下的所有文件和子目录,并计算它们在磁盘上占用的空间,单位为字节。

因此,导致这个差异的原因是df -Th命令和du -sh命令计算磁盘使用情况的单位不同,以及du -sh命令只计算了目录下的文件和子目录的大小,而没有考虑到其他系统文件和元数据占用的空间。

如果您想更准确地了解文件系统的磁盘使用情况,可以使用以下步骤将du -sh命令的结果转换为与df -Th命令一致的单位:

  1. 使用du -s /命令获取根目录的总大小,单位为块大小。可以将结果保存到一个变量中,比如du_size
du_size=$(du -s / | awk '{print $1}')
  1. 获取块大小,可以使用blockdev --getbsz /dev/mapper/centos-root命令。
block_size=$(blockdev --getbsz /dev/mapper/centos-root)
  1. 计算磁盘使用情况的字节数,即du_size乘以block_size
disk_usage=$(($du_size * $block_size))
  1. 将字节数转换为易读的单位,可以使用以下函数:
function convert_size() {
  bytes=$1
  unit="B"
  if (( bytes > 1024 ));then
    bytes=$(($bytes/1024))
    unit="KB"
  fi
  if (( bytes > 1024 ));then
    bytes=$(($bytes/1024))
    unit="MB"
  fi
  if (( bytes > 1024 ));then
    bytes=$(($bytes/1024))
    unit="GB"
  fi
  if (( bytes > 1024 ));then
    bytes=$(($bytes/1024))
    unit="TB"
  fi
  echo "$bytes$unit"
}

converted_usage=$(convert_size $disk_usage)
echo "Disk usage: $converted_usage"

这样就可以得到与df -Th命令相同的磁盘使用情况结果。

注意:由于脚本中的计算步骤和单位转换步骤可能因特定的操作系统环境而有所不同,请根据实际情况进行调整。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^