df -h 的 avail 列即为普通用户可用剩余空间,已扣除 root 保留空间,并非简单等于 size - used;其值受预留空间、已删未释放文件、tmpfs 特性及配额等影响。

df -h 是直接看到「每个挂载点剩余空间」最准、最快的方式,它显示的 Avail 列就是当前用户可用的剩余字节数(已自动扣除 root 保留空间),不需要手动算。
但如果你真要理解这个数字怎么来的,得拆开看底层逻辑——它不是简单用 Size - Used 得到的。
为什么 Avail ≠ Size - Used
Linux 文件系统(如 ext4/xfs)默认会为 root 用户预留 5% 空间(可调),防止系统因磁盘写满而崩溃。这部分空间普通用户不可用,但 df 的 Avail 已把它剔除。
所以真实计算逻辑是:
Avail = 总可用块数 × 块大小 − 已用块数 × 块大小 − root 保留块数 × 块大小- 其中「总可用块数」本身已排除 superblock、inode table 等元数据占用
-
df -h显示的Avail是对普通用户生效的净剩余,不是裸设备剩余
df -h 的 Avail 值受哪些因素影响
这个值不是静态的,以下情况会让它和你预期不一致:
- 已删除但进程仍打开的文件(
lsof +L1可查):磁盘空间未释放,Avail不涨 -
tmpfs或devtmpfs这类内存文件系统:Avail表示当前内存分配上限,不是磁盘剩余 - 配额(quota)启用时:
Avail按用户/组配额限制动态计算,非全局剩余 - ext4 的 reserved blocks 百分比被改过(
tune2fs -m 0 /dev/sda1):Avail会变大
想确认某个分区实际物理剩余,该看哪列
别只盯 Avail,结合三列交叉验证:
-
Use%:重点看是否 ≥90%,这是运维干预阈值 -
Used和Size:检查是否异常(比如Used > Size,说明有已删未释放文件) -
Mounted on:确认你关心的路径(如/var/log)是否单独挂载,否则它只是根分区的一部分
例如:df -h /var/log 输出单独一行,才代表该目录所在分区的真实剩余;如果没单独挂载,它就和 / 共享 Avail。
需要精确到字节或做自动化判断时,别用 -h
-h 是给人看的,单位不统一(K/M/G),脚本里容易出错。关键场景必须用原始数值:
- 取字节级准确值:
df --output=source,avail,target / | tail -n +2 | awk '{print $2}' - 检查是否低于 1GB:
[ $(df --output=avail / | tail -n +2) -lt 1048576 ](单位是 KiB) - 注意:
df -B1输出字节数,但列顺序不固定;--output=更可靠
真正容易被忽略的是:很多监控脚本直接 parse df -h 的第三列,结果在 1TB 分区上把 98G 当成 98 字节处理——单位混淆比算法错误更常见。











