现象
报 No space left on device,但 df 看起来还有空间;应用无法写日志、临时文件或数据库段;安装软件与拉取镜像立即失败;df -h 显示 / 或 /var 使用率 100%。
诊断
块和 inode 都要看:
df -h
df -i
du -xhd1 / 2>/dev/null | sort -h | tail -15
sudo lsof +L1 | head -30
journalctl --disk-usage
docker system df
df -h 接近 100% 是块耗尽;df -i 的 IUse 接近 100% 而块仍空闲,则是小文件过多,常见于会话文件或邮件队列。du -x 只统计同一文件系统,避免挂载卷干扰,能快速定位 /var/log、/var/lib/docker 或数据目录。lsof +L1 列出已删除但仍被进程占用的文件,这些块在进程关闭文件或重启前不会释放。systemd journal 与容器镜像往往是最容易被忽略的占用者。
修复
对仍在写入的日志使用截断而不是删除,并配置 logrotate 的按大小轮转与保留策略:
sudo truncate -s 0 /var/log/app/error.log
sudo journalctl --vacuum-size=500M
docker image prune -a --filter "until=168h"
被删除但仍打开的文件可通过 /proc/<pid>/fd 截断或重启对应服务释放。清理 /var/lib/docker 与数据库目录时必须确认不会破坏运行中的数据;系统盘应保留 10% 到 15% 余量,ext4 的保留块也可能导致非 root 用户提前写入失败。
验证
再次执行 df -h 与 df -i,两者都应有明显余量;创建一个与业务文件同量级的测试文件确认写入成功,查看应用日志已恢复输出。持续观察一天,若占用很快回升,说明只清理了现象,还需从日志保留、数据增长或容量规划上解决根因。