No space left on device 可能是块满、inode 满、保留块、配额、只读重挂载或容器层占满。先 df -hT 和 df -i 分清是哪一种,再决定清理对象;不要直接 rm -rf。本页是分诊入口,单场景的处置见 no-space-left、disk-io-high 和 disk-readonly。
边界:不覆盖磁盘性能调优和文件系统选型;IO 延迟高但空间充足时看磁盘 IO 高,ext4/XFS/Btrfs 的差异见文件系统对比。
df -hT
df -i
du -x -h --max-depth=1 / 2>/dev/null | sort -h | tail
du -x -h --max-depth=1 /var 2>/dev/null | sort -h | tail
lsof +L1
find / -xdev -type f -size +1G -printf '%s %p\n' 2>/dev/null | sort -n | tail
journalctl --disk-usage
mount | grep ' ro[,)]'
容器与 Kubernetes 补查:
docker system df 2>/dev/null
crictl images 2>/dev/null | head
kubectl describe node <node> | grep -A5 Conditions
kubectl get pods -A -o wide | grep <node>
| 现象 | 优先检查 | 入口 |
|---|---|---|
df 100%,du 加不起来 |
已删除仍被进程占用、保留块、挂载命名空间 | lsof +L1 |
| 空间有剩余但写失败 | inode 耗尽 | df -i |
| 只有容器/节点满 | 镜像层、日志、emptyDir | docker system df、crictl、节点磁盘压力 |
| 文件系统变成只读 | IO 错误、挂载失败 | dmesg -T、disk-readonly |
| 日志目录暴涨 | journald、应用日志、core dump | journalctl --disk-usage |
| 数据库目录暴涨 | WAL、binlog、临时文件 | 对应中间件页面 |
| 有配额限制 | 用户/组配额 | repquota -a |
du -x 找顶层目录,再逐层下钻,不要全盘 find。df -i 的 IUse% 接近 100%,空间却还有剩余。lsof +L1 能看到;确认进程后可重启或谨慎截断。df 与 findmnt 的实际挂载。repquota。dmesg,不要反复 mount -o remount,rw 掩盖问题。-x 不跨文件系统。df 显示满但 du 对不上:优先怀疑已删除仍打开的文件、挂载命名空间和 ext4 保留块;lsof +L1 比继续 du 更快。df -i,inode 耗尽时删大文件没用,要删大量小文件或调整 inode 策略。rm 一个被进程打开的大日志不会立即释放空间;确认进程后可重启,或用 : > file 截断(先确认不是正在写入的关键文件)。copytruncate 与 create 行为不同:copytruncate 有短暂窗口和拷贝开销,create 需要进程重新打开文件。/var/lib/docker 与 /var/lib/containerd 要分别检查,别只清一个。DiskPressure 会触发镜像回收和 Pod 驱逐;先看节点条件与 kubelet 阈值,再决定清镜像还是扩容。dmesg,确认硬件/网络存储状态,再考虑重挂载。合上页面,先回答,再展开对照。
df 显示 100%,但 du 各目录加起来对不上,常见原因有哪些?No space left on device,应该先看什么?lsof +L1 和 findmnt 核对。df -i 的 inode 使用率;inode 耗尽时即使还有块空间也无法创建新文件。
小程序版
微信扫码,随时查命令