df -h 的“已用”和“可用”之和不等于“容量”,因 Linux 默认为 root 保留 5% 空间(如 ext4),该空间计入总容量但不显示在“已用”或“可用”中,可通过 tune2fs -l 查看和调整。

df -h 显示的“已用”和“可用”为什么加起来不等于“容量”
因为 Linux 文件系统会为 root 用户保留一部分空间(默认 5%),这部分既不显示在“已用”里,也不算进“可用”中,但属于总容量的一部分。比如 ext4 格式下,df -h 的“容量”是磁盘总大小,“已用”是普通用户实际占用,“可用”是普通用户还能写的剩余空间,而保留空间只对 root 可见。
验证方式:tune2fs -l /dev/sda1 | grep "Reserved block count" 查保留块数,再乘以 block size 就是保留字节数。
- 保留空间可调,但不建议清零:
tune2fs -m 1 /dev/sda1改为保留 1% -
df -h不显示保留空间,但df -i同样受保留 inode 影响 - 小容量分区(如
/boot)保留比例过高时,“可用”可能远小于预期
df -h 看不到新挂载的 NFS 或 bind mount
默认 df -h 只显示当前命名空间中“已生效”的挂载点,如果挂载发生在不同 mount namespace(比如容器内、chroot 环境或未同步的子 mount),或者用了 --bind 但没加 --rbind,df 就可能漏掉。
更可靠的替代是直接读内核挂载信息:findmnt 或 cat /proc/mounts。前者带树状结构和类型标识,后者原始但最全。
-
findmnt -D显示所有挂载(含 kernel 自动挂载项如sysfs) -
findmnt -t nfs4过滤特定文件系统类型 -
df -h --total在末尾加汇总行,方便快速看全局使用率
df -h 输出中 “Mounted on” 路径显示为 “?”
这通常表示该挂载点的路径无法被当前进程解析,常见于:挂载点目录已被删除、父目录权限不足(如 noexec 或 nosuid 挂载导致 stat() 失败)、或挂载在 chroot 内部但当前环境看不到完整路径。
此时 df 仍能读到设备和用量数据,但无法获取挂载路径字符串。别急着重挂,先确认是否真有问题:
- 运行
ls -ld /path/that/shows_?—— 如果报No such file or directory,说明目录被删了,但设备还挂着(危险!) - 检查
/proc/mounts对应行,看第三列(type)和第四列(options),确认是不是overlay、tmpfs或异常选项 - 某些 LXC 容器中,“?” 是正常现象,因为挂载路径在宿主机命名空间里不可见
df -h 和 du -sh 结果严重不一致怎么办
这是运维中最常被误判为“磁盘坏了”的场景。根本原因不是命令错了,而是两者统计维度不同:df 看文件系统级块分配,du 看目录树中文件实际大小(不含元数据、稀疏文件空洞、已删未释放的文件)。
典型触发条件:大日志被 rm 但进程还在写、大量 truncate 后的稀疏文件、或 ext4 的延迟分配(delayed allocation)尚未刷盘。
- 查“看不见”的大文件:
lsof +L1列出已删除但仍被打开的文件 - 确认是否稀疏:
ls -ls /path/to/file对比 “disk blocks” 和 “size” 列 - 强制刷盘并重统计:
sync && echo 3 > /proc/sys/vm/drop_caches(仅临时缓解,非根治)
真正难处理的是被 long-running 进程 hold 住的已删文件——得杀进程或等它自己关闭 fd,没有快捷修复方式。


















