df -h 是 Linux 中以人类可读格式(如 GB、MB)直观查看各挂载点剩余空间(Avail 列)的首选命令,输出含 Filesystem、Size、Used、Avail、Use% 和 Mounted on 六列,其中 Use% ≥90% 需重点关注,Avail 已扣除 root 保留空间且受已删未释放文件和 tmpfs 等影响。

df -h 是最直接、最常用的命令,能一眼看出各挂载点的剩余空间(Available 列),单位自动换算成 MB/GB,人眼友好。
df -h 为什么是首选
- 它默认显示所有已挂载文件系统,包括根分区
/、/home、/var等关键路径 - 输出中
Available字段就是真正可写入的剩余空间,不是理论总容量减去已用 - 不加
-h时默认以 1KB 为单位,数字巨大难读;加了之后像34G、1.2T这样一目了然 - 它不扫描文件内容,秒出结果,适合快速巡检
常见误操作:
- 直接跑
df不带参数 → 看到满屏 KB 数字,容易看错数量级 - 只查
df /path却没确认该路径是否独立挂载 → 比如df /home返回的是根分区数据,因为/home没单独分区 - 忽略
tmpfs行(如/dev/shm、/run)→ 这些是内存伪文件系统,Available值会随内存压力动态变化,不能当磁盘空间用
df -i 查 inode 剩余,比空间更隐蔽的瓶颈
磁盘空间还有几十 GB,但新建文件报 No space left on device?大概率是 inode 耗尽了。
-
df -i显示每个文件系统的 inode 使用情况 -
Used和Available列对应的是 inode 数量,不是字节数 - 小文件多的场景(如日志目录、容器镜像层、邮件队列)极易触发此问题
- 一旦
Use%达到 100%,即使df -h显示空间充足,也无法创建新文件
注意:ext4 默认 inode 数量在格式化时就固定了,运行中无法扩容。临时缓解只能清理大量小文件(比如 find /var/log -name "*.log" -mtime +30 -delete)。
du -sh 和 df -h 结果对不上?这是正常现象
-
df -h统计的是文件系统级块占用,含已删除但未释放句柄的文件(即进程还在写,但文件被rm了) -
du -sh /path统计的是目录下可见文件实际占用的磁盘块总和 - 差值常见于:
- 删除了大日志但服务没重启,
du看不到它,df还算着 - 文件被
mv到其他挂载点,du没刷新缓存 - 存在硬链接或稀疏文件,
du和df计算逻辑不同
- 删除了大日志但服务没重启,
验证方法:运行 lsof +L1 查看是否有已删除但仍被进程占用的文件;或者重启相关服务释放句柄。
df -h 看的是“盘还剩多少”,df -i 看的是“还能建多少文件”,两者缺一不可。尤其在容器或日志密集型服务里,inode 耗尽比磁盘写满更难察觉,也更难临时修复。


















