系统学习 学习路径总入口:先选领域,再建立模型,最后用故障演练验证

磁盘满或 inode 耗尽:先确认挂载点与 inode,再按文件类型清理

补充说明

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 的差异见文件系统对比。

3 分钟定位

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

根因树

  1. 块满:日志、备份、core dump、临时文件、数据库 WAL/binlog、容器镜像层。先用 du -x 找顶层目录,再逐层下钻,不要全盘 find。
  2. inode 满:大量小文件(会话、缓存、邮件队列、临时文件)。df -i 的 IUse% 接近 100%,空间却还有剩余。
  3. 已删除仍占用:进程持有被删除文件的句柄,lsof +L1 能看到;确认进程后可重启或谨慎截断。
  4. 容器层占用:删除容器内文件只改 upperdir,镜像/容器/卷不删除,宿主机空间不会立即释放。
  5. 分区或挂载问题:数据写到了小分区、挂载点被覆盖、NFS 服务端满;对比 df 与 findmnt 的实际挂载。
  6. 保留块与配额:ext4 默认给 root 保留 5%,普通用户可能提前写满;配额限制则看 repquota。
  7. 只读文件系统:IO 错误或内核保护会把文件系统重挂为只读,先看 dmesg,不要反复 mount -o remount,rw 掩盖问题。

相关命令

相关教程

易错点与排错

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. df 显示 100%,但 du 各目录加起来对不上,常见原因有哪些?
  2. 空间还有剩余却报 No space left on device,应该先看什么?
  3. 在容器里删除了大文件,宿主机空间为什么没有释放?
答案
  1. 已删除但被进程打开的文件、挂载命名空间差异、ext4 保留块,以及被覆盖的挂载点;先用 lsof +L1 和 findmnt 核对。
  2. 看 df -i 的 inode 使用率;inode 耗尽时即使还有块空间也无法创建新文件。
  3. 容器使用 overlayfs,删除只改 upperdir,镜像层或仍运行的容器还持有数据;需要删除容器/镜像或执行 prune,宿主机空间才会释放。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令