No space left on device但df -h显示空间充足,很可能是磁盘配额触发硬限制;需检查挂载点是否启用usrquota/grpquota、用户在对应文件系统上的配额使用情况(quota -u $USER)、软链接实际指向路径的配额状态,并同步排查inode耗尽(df -i)和目录写入权限。

当用户写入文件报错 No space left on device,但 df -h 显示磁盘仍有大量空间,很可能是配额(quota)触发了硬限制拦截。排查需跳出“看物理空间”的惯性,聚焦配额本身是否生效、是否超限、是否被路径间接绕过。
确认当前用户是否受配额约束
配额不是全局开关,而是绑定在特定挂载点上的。先验证目标目录所属分区是否启用了配额支持:
- 运行
mount | grep $(df . | tail -1 | awk '{print $1}'),检查输出中是否含usrquota(用户配额)或grpquota(组配额);没有则配额根本未启用 - 查看
/etc/fstab中该分区对应行的第4列(options),确认已添加usrquota,例如:/dev/sdb1 /home ext4 defaults,usrquota 0 2 - 若刚改完 fstab,必须执行
sudo mount -o remount /home才生效
检查该用户在对应文件系统上的实际配额状态
不要只查自己——配额可能按组设置,或由软链接指向其他挂载点:
- 用
quota -u $USER查个人配额;若显示none,说明未初始化或未启用 - 用
repquota -augs /home(替换为实际挂载点)看全量报告,重点关注 已用/硬限制 列和 宽限期 是否为none - 特别注意:如果写入路径是软链接(如
ln -s /scratch/tmp /home/user/out),真实写入发生在/scratch分区——要查的是/scratch上的配额,不是/home
验证配额数据库是否完整且可读
配额依赖 aquota.user 文件,缺失或损坏会导致 quota 命令失效:
- 进入挂载点根目录(如
/home),检查是否存在aquota.user,权限应为-rw-------,属主为root - 若不存在,运行
sudo quotacheck -cugm /home强制重建(-c创建,-m忽略挂载标记) - 重建后必须启用:
sudo quotaon /home;禁用时用quotaoff
排除 inode 耗尽与权限干扰
配额超限常与另两类问题并发,需同步排查:
- 运行
df -i看 inode 使用率,100% 也会报 No space left on device,尤其在日志、缓存类小文件密集场景 - 检查写入路径的目录权限:
ls -ld /target/dir,确保用户有w权限;若属组写入,还需确认用户在该组中(groups命令验证) - 临时用
sudo -u $USER touch /target/dir/testfile测试最小写入,排除 shell 限制或环境变量干扰











