根分区空间或inode耗尽会导致进程创建失败,需用df -h和df -i确认,紧急清理容器日志、悬空镜像及旧journal日志,并通过du定位大目录;长期应限制Docker日志、迁移运行时数据、部署磁盘告警。
容器根分区空间耗尽时,系统无法分配新inode或写入元数据,直接导致进程创建失败(如 fork: cannot allocate memory、no space left on device),即使内存和cpu充足也会卡住。核心不是“没内存”,而是文件系统层面的资源枯竭——包括磁盘块和inode双耗尽。
确认是否真为根分区空间问题
先执行 df -h 和 df -i:
-
df -h查看各挂载点使用率,重点关注/、/var、/var/lib/docker或/var/lib/containerd所在分区; -
df -i检查 inode 使用率,100% inode 耗尽同样会阻止新进程创建(常见于大量小日志文件场景); - 若
/dev/mapper/centos-root或/dev/sda2显示Use% = 100%,且Avail = 0G,即确认根分区满载。
快速释放空间的紧急操作
不重启、不扩容,优先清理可立即回收的资源:
- 清空容器日志:
→ 查找大日志文件:find /var/lib/docker/containers/ -name "*.log" -size +100M -ls
→ 安全截断(不删文件,避免破坏容器运行):truncate -s 0 /var/lib/docker/containers/*/*-json.log; - 清理已停止容器、悬空镜像和构建缓存:
docker system prune -af --volumes(加--volumes可删无主数据卷,谨慎评估); - 删除
/var/log/journal中过期日志(systemd 系统):journalctl --vacuum-size=200M; - 检查
/tmp和/var/tmp是否堆积临时文件,手动rm -rf可确认的残留目录。
定位并清理高占用目录
用 du 快速定位“吃空间大户”:
- 从根下查前10大目录:
du -sh /* 2>/dev/null | sort -hr | head -n 10; - 重点钻入
/var:du -sh /var/* 2>/dev/null | sort -hr,常发现/var/log、/var/lib/docker、/var/lib/kubelet占比异常; - 若
/var/lib/docker过大,进一步细分:du -sh /var/lib/docker/{overlay2,containers,volumes,buildkit},overlay2 中未被引用的层可由docker system prune清理,但需确保无误删运行中容器依赖的层。
长期规避方案:限制+迁移+监控
仅靠清理是治标,需建立防复发机制:
- 对 Docker 日志加限制:在
/etc/docker/daemon.json中配置:{"log-driver": "json-file","log-opts": {"max-size": "10m", "max-file": "3"}},然后systemctl restart docker; - 将容器运行时数据迁出根分区:把
/var/lib/docker或/var/lib/containerd整体移到大容量独立分区(如/home/docker-data),再用软链接回原路径,并确保 SELinux/AppArmor 权限同步; - 部署磁盘水位告警:用 Prometheus + Node Exporter 监控
node_filesystem_avail_bytes{mountpoint="/"},阈值设为 15%,触发企业微信/钉钉通知; - 定期执行清理脚本(建议加入 cron):
docker system prune -f && journalctl --vacuum-time=7d。
根分区空间耗尽引发的进程创建失败,本质是文件系统资源见底。应急靠精准清理,长效靠配置约束与路径分离。只要不忽略 inode 和日志膨胀这两个隐形杀手,问题就可控。


















