使用du与df命令查看磁盘容量不一致

免责声明: 本文档可能包含第三方产品信息,该信息仅供参考。阿里云对第三方产品的性能、可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺。

问题描述

在Linux系统的ECS实例中,执行dudf命令查看磁盘容量,出现不一致的现象,以下为出现不一致的5种现象:

  • 执行df -h命令查看文件系统的使用率,可以看到/dev/xvdb1磁盘占用了约27G,挂载目录为/opt

    进入/opt目录执行du -sh命令,显示空间总占用量约2.4G,即出现dfdu命令结果不一致的现象。

  • 通过df -h命令,查看磁盘使用率显示为负值。

  • 执行dudf命令显示的结果不一致,dfdu命令显示的数据大很多。

  • 使用df命令显示磁盘使用率过高,但是执行du命令统计目录时却磁盘使用率不高,且查不到已删除的句柄文件。

  • 当前系统存在数据盘挂载点,使用df命令查看系统盘容量已满,但是在根目录下使用du命令统计各文件总容量,但是合计达不到总容量。

问题原因

以下为五种问题的原因:

  • 用户删除了大量的文件后,du命令就不会在文件系统目录中统计这些文件。如果此时还在运行中的进程持有这个已经被删除的文件句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改,df命令仍会统计这个被删除的文件。 通过lsof命令查询处于deleted状态的文件,被删除的文件在系统中被标记为deleted。如果系统有大量deleted状态的文件,会导致dudf命令统计结果不一致。 可opt目录下执行如下命令查看。

    lsof |grep deleted
  • Linux系统磁盘分区有保留区的概念,会给root或指定用户预留5%或更大的空间,当使用到这块保留区的空间时,fdisk命令的计算将会是负数。ext文件系统(包括ext2、ext3、ext4)都会默认预留5%的磁盘空间,使用root用户维护系统或记录系统关键日志使用。

  • 当用du -sh *命令来统计目录总容量时,如果该路径下包含隐藏文件,是不会包含在统计结果里的

  • 由于删除了大量小文件,导致inode释放出现问题。

  • 由于数据盘挂载前该路径下就存在文件,挂载后用du无法查询到原路径文件。

解决方案

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

本文主要针对以上五种问题,提供以下解决方案:

  • 根据lsof列出的进程号,终止相应进程或者重启相应的服务。也可以重启实例,重启实例系统会退出现有的进程,开机后重新加载过程中,会释放调用的deleted文件的句柄。
    提示:如果ECS实例正在运行业务进程,终止进程时请慎重操作。
  • 通过rm命令删除磁盘中的大文件,释放预留空间的占用后,再通过df命令查询磁盘占用即可恢复正常。
  • 执行du -ah命令即可在统计结果中包含隐藏文件。
  • 进入单用户模式,详情请参见进入CentOS实例单用户模式的配置方法。执行fsck -y [$Partition_Name]命令,修复文件系统。
    说明
    • [$Partition_Name]为非挂载点的分区名称。

    • [$Partition_Name]不可为sda设备名。

    • 执行fsck相关命令必须先进入RAMOS模式,再对非挂载的分区进行操作。

    • 关于fsck相关命令的更多信息可执行man fsck,查阅相关用法。

  • 卸载数据盘后再次使用du命令查询即可查到数据。

适用于

  • 云服务器ECS