no-space-left

磁盘空间耗尽的定位与修复

现象

写入文件、写日志或启动服务时报 No space left on device。df -h 显示某个挂载点使用率 100%,也可能只是某个分区或容器层满了。

快速定位

df -h
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
docker system df

常见根因

  1. 日志、core dump、临时文件或备份没有轮转。
  2. 已删除但进程仍持有的文件占着空间(lsof +L1)。
  3. 容器镜像/层/卷占用,docker system df 能看到。
  4. 数据库 WAL、binlog 或导出文件暴涨。
  5. 挂载点被小分区占满,实际数据在另一个大分区。

修复

相关命令

读完自测

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

  1. df -h 显示使用率 100%,但 du 统计的总量明显小于分区容量,可能是什么原因?
  2. 清理日志前应优先采用什么方式?
  3. 如何确认空间是被某个挂载点还是容器层占用?
答案
  1. 可能是文件已删除但进程仍持有句柄。用 lsof +L1 可以看到这类文件。
  2. 先确认保留策略。优先用 logrotate 或 journalctl --vacuum-size,不要直接做 rm -rf / 式清理。
  3. 用 df -h/df -i 确认是哪个挂载点。容器环境再用 docker system df 查看镜像、层和卷的占用。