ext4 的 df 可用空间少于总量减已用:检查保留块
ext4 的 df 总量减已用大于 Available 时,按相同单位比较,读取保留块与块大小,区分普通用户可用空间,调整前保留策略与恢复条件。
df 显示文件系统总量减去已用量,还应剩下一些空间,但 Available 明显更小,两者之间有稳定差额。对于 ext2、ext3、ext4,应检查文件系统是否设置了保留块。它们可能仍空闲,却不计入普通用户可分配的空间。
这与目录统计漏掉文件不同:这里比较的是同一次 df 输出中的总量、已用和可用三列。不能仅凭差额约为 5% 就确定原因,还要核对实际文件系统、保留块数量和显示单位。
先按相同单位确认是哪块文件系统
下面是 Linux 上的只读检查示例,目录需换成出现空间问题的实际位置:
findmnt --target /srv/data --output SOURCE,FSTYPE,TARGET
df -B1 /srv/data
findmnt 给出该路径实际对应的来源、类型和挂载点。GNU df 的 -B1 将显示单位设为字节,减少人类可读取整造成的误判。不要从全盘列表里挑另一块盘的数据,也不要把 GB 与 GiB 的换算差异当成空间丢失。
若路径属于 overlay、网络文件系统或其他类型,不能对它随意运行 tune2fs。容器中看到的挂载视图也可能与宿主机不同,应先找到实际提供 ext 文件系统的块设备。设备映射、LVM 和分区名称需从当前挂载关系确认,不猜测一定是 /dev/sda1。
用保留块数量核对差额
确认来源确实是对应的 ext 文件系统块设备后,由有权限的管理员读取超级块参数。下面的设备名是示例,必须替换成上一步确认的设备:
sudo tune2fs -l /dev/mapper/example-data
-l 只列出当前参数。关注 Reserved block count、Block size,以及保留块可供使用的 UID、GID 等设置。用“保留块数量 × 文件系统块大小”得到保留容量,再与 df 的差额对照。
这项计算应与单位一致的输出结合。文件系统自身开销、统计时刻变化和实际实现仍可能影响数字,不能要求任意文件系统都精确等于这一个公式。差额无法对应时,继续核对挂载来源与统计口径,不先修改参数。
e2fsprogs 通常以 5% 作为默认保留比例,但格式化和后续管理可以改变它。当前实际数量才是判断依据;大容量数据盘是否仍需要同样比例,也应按用途规划。
保留容量有用途,不是被某个文件占住
保留块用于给符合条件的特权进程留出容量,并减少文件系统逼近满额时的运行问题。普通用户已经无法继续分配空间时,一些系统服务仍可能需要写日志或完成必要工作。
Available 体现的是普通用户可用空间。用 sudo 运行同一个 df,通常也不会把这一列改成 root 可用容量,因为它仍读取相同的文件系统统计字段。某个服务进程是否能使用保留块,还要检查实际身份、能力和文件系统设置;容器内的 root 不等于可无条件使用宿主机所有保留空间。
如果三列的差额已能由保留块解释,删除更多文件去“找回差额”没有针对性。真正删除可清理内容能增加空闲容量,但保留机制仍存在。重启服务去释放已删除文件,也不能改变这项保留设置。
需要调整时,先保存当前保留策略
根文件系统与普通数据盘的用途不同。不要看到差额就将所有盘的保留比例设为零,也不要将应用改成 root 来临时使用这些空间。容量已经紧张时,应先评估可清理内容、扩容和写入增长。
确实需要调整时,由管理员记录当前保留块数量、比例、可用身份、块设备和文件系统用途,保存备份及恢复安排,再确定合理目标。tune2fs 的 -m 修改保留比例,-r 修改保留块数量,都会写入文件系统参数;它们不是显示选项,也不会扩容或删除现有业务文件。
减少保留量会允许普通进程使用更多原本留作余量的空间,之后可能很快被写满。需要回退时,应按原记录恢复对应设置,并确认当时实际空闲量足够。恢复较大的保留值会减少普通进程可用空间,不能保证仅恢复参数就恢复了先前的运行余量。
变更后在同一挂载点用相同单位重读 df 和超级块参数,确认差额与审定保留安排相符,并核对应用的正常写入和容量告警。若仍出现 No space left on device,另外检查 inode、配额及实际失败的文件系统;保留块解释了一个统计差额,不能替代其他存储故障的证据。


