免责声明: 本文档可能包含第三方产品信息,该信息仅供参考。阿里云对第三方产品的性能、可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺。
问题描述
在Linux系统的ECS实例中,执行du
与df
命令查看磁盘容量,出现不一致的现象,以下为出现不一致的5种现象:
-
执行
进入df -h
命令查看文件系统的使用率,可以看到/dev/xvdb1
磁盘占用了约27G,挂载目录为/opt
。/opt
目录执行du -sh
命令,显示空间总占用量约2.4G,即出现df
与du
命令结果不一致的现象。 -
通过
df -h
命令,查看磁盘使用率显示为负值。
-
执行
du
和df
命令显示的结果不一致,df
比du
命令显示的数据大很多。 -
使用
df
命令显示磁盘使用率过高,但是执行du
命令统计目录时却磁盘使用率不高,且查不到已删除的句柄文件。 -
当前系统存在数据盘挂载点,使用
df
命令查看系统盘容量已满,但是在根目录下使用du
命令统计各文件总容量,但是合计达不到总容量。
问题原因
以下为五种问题的原因:
-
用户删除了大量的文件后,
du
命令就不会在文件系统目录中统计这些文件。如果此时还在运行中的进程持有这个已经被删除的文件句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改,df
命令仍会统计这个被删除的文件。 通过lsof
命令查询处于deleted状态的文件,被删除的文件在系统中被标记为deleted。如果系统有大量deleted状态的文件,会导致du
和df
命令统计结果不一致。 可在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