df -h先定位高占用挂载点,du -sh再逐层下钻查找具体大目录;df读元数据快但不深入路径,du递归统计准但耗时,二者组合才能精准定位空间占用源头。

直接看 du 和 df 的组合输出,才能定位“具体占在哪”——df 告诉你哪个挂载点快满了,du 告诉你这个挂载点里谁在吃空间。
df -h 显示整体使用率但不告诉你文件在哪
df -h 是第一眼必须跑的命令,它只读文件系统元数据,速度快、结果稳定。但它只显示挂载点(比如 /、/home)的总用量,不深入目录结构。
- 常见错误现象:看到
/dev/sda1使用率 95%,但ls -l /看不出大文件——因为大文件可能藏在深层子目录或日志路径里 - 关键参数:
-h(人性化单位)、-x tmpfs(排除内存伪文件系统干扰)、--output=source,used,pcent,target(定制列,避免旧版字段错位) - 注意:某些发行版默认预留 5% 空间给 root,
df显示 100% 不代表真写不进,但普通用户已无法创建文件
du -sh * | sort -hr 快速定位大目录
du 才是找“具体占用”的主力,但它递归扫描实际文件块,耗时取决于目录深度和文件数量,别在根目录直接跑 du -sh /。
- 安全做法:先
df -h锁定高占用挂载点(如/var),再进该目录执行du -sh * | sort -hr | head -20 - 跳过权限拒绝:加
2>/dev/null,例如du -sh /var/* 2>/dev/null | sort -hr - 排除软链接目标:用
-L会跟随链接统计真实大小;不用-L则只算链接文件自身(通常 4–8 字节) - 常见陷阱:
du默认按磁盘块占用(含稀疏文件、硬链接去重),不是文件逻辑大小;想看逻辑大小得加--apparent-size
lsblk + df 对照确认物理设备与挂载点关系
当 df 显示某个挂载点爆满,但 du 在该路径下找不到大目录,大概率是挂载覆盖(mount overlay)或未卸载的旧设备残留。
- 运行
lsblk -f查看设备树:确认/dev/sdb1是否真挂到了/data,还是被其他分区意外覆盖 - 检查隐藏挂载:
findmnt /path比df更精确,能发现 bind mount 或 subvolume(如 btrfs) - 特别注意:
df显示的Use%是基于块数计算,而du统计的是实际分配块——如果大量小文件(du 总和会明显小于df已用值(因每个文件至少占一个块)
df -i 查 inode 耗尽这种“空间没满却写不了”的情况
磁盘块还有剩,但新建文件失败?八成是 inode 用光了。Linux 中每个文件/目录都要消耗一个 inode,和文件大小无关。
- 执行
df -i,重点关注IUse%列:超过 95% 就危险 - 典型诱因:邮件队列、Web 服务器临时文件、容器镜像层、日志轮转生成海量小文件
- 清理方向:
find /var/spool/postfix -type f -mtime +30 -delete(清老邮件)、journalctl --vacuum-time=2weeks(压缩日志) - 注意:
du完全不反映 inode 占用,df -i是唯一可靠指标
真正麻烦的不是命令不会用,而是 df 和 du 结果对不上时——这时候得怀疑是否挂载异常、是否有未清理的 deleted 文件(lsof +L1 可查),或者文件系统损坏(e2fsck)。别急着删文件,先搞清空间到底被谁锁住了。











