Linux实例df -h与du -sh统计根目录空间差异大,df返回数据是否有误?
排查点说明
df -h返回的数据不是错误,两者统计逻辑存在本质差异:df统计文件系统层面所有已分配的块占用,du仅累加目录树中可见文件的实际大小,13G的差值可按以下优先级排查:
1. 已删除但仍被进程持有的文件(最高概率)
进程打开文件后,即使文件被从目录树中删除,只要进程未释放文件句柄,文件占用的磁盘块就不会被回收:
du无法统计到已不在目录树中的文件,因此不会计算这部分占用df会统计所有已分配的块,包含这部分未释放的空间
排查命令:
sudo lsof | grep deleted
输出结果中会列出所有被删除但仍被进程占用的文件,确认文件可释放后,重启对应进程或结束进程即可回收空间,如果是日志类文件,也可以直接执行truncate -s 0 <被删除的日志文件路径>无需重启进程。
2. 被挂载点遮盖的根分区文件
如果根分区下的某个目录(比如/data、/log)之前存储过文件,后续你将其他磁盘/分区挂载到了该目录路径上,原目录下的文件会被挂载点遮盖:
du遍历根目录时只能看到挂载后的目录内容,无法统计到被遮盖的原根分区文件df会统计根分区所有已使用的块,包含被遮盖的文件
排查方法:
# 把根分区绑定挂载到/mnt目录,此时不会继承其他挂载点,可看到根分区原始内容 sudo mount --bind / /mnt # 统计/mnt下各目录大小即可找到被遮盖的大文件 sudo du -sh /mnt/*
确认不需要的文件直接删除即可,之后执行sudo umount /mnt卸载绑定挂载。
3. 文件系统预留空间与元数据占用
- 主流的ext4/xfs文件系统默认会为root用户预留5%左右的磁盘空间,避免普通用户占满磁盘导致系统无法运行,32G的分区对应预留空间约1.6G,这部分空间
du不会统计,会被计入df的已用空间 - 大量小文件场景下,文件系统的inode、块描述等元数据也会占用部分空间,这部分同样不会被
du统计
这两部分占比通常很小,不会导致你遇到的13G级别的差值,仅作为补充排查项。
内容的提问来源于stack exchange,提问作者Bernana
相关产品推荐
相关产品推荐

