根分区空间不足处理及 Docker 数据目录迁移
1. 问题现象
- 根分区
/dev/vda1使用率达到 **99%**(40G 总容量已几乎用尽)。 /home分区(/dev/vdb1)有 200G 空间,使用率仅 29%,存在大量空闲。- 部分 Docker overlay 挂载点直接显示根分区已满,容器或服务可能因此异常。
- 执行
lsblk与df -h的原始输出如下(关键部分):1
2
3
4vda 253:0 0 60G 0 disk
└─vda1 253:1 0 40G 0 part /
vdb 253:16 0 200G 0 disk
└─vdb1 253:17 0 200G 0 part /home1
2/dev/vda1 40G 40G 628M 99% /
/dev/vdb1 197G 54G 133G 29% /home
2. 原因分析
- 根分区原本只有 40G,但实际虚拟磁盘
vda总大小为 60G,存在 20G 未分配空间。 - Docker 数据目录
/var/lib/docker默认位于根分区下,随着镜像、容器和日志增多,迅速占满根分区。 - 即使部分目录已挂载到
/home,Docker 本身的数据仍在根分区。
3. 处理方案
3.1 紧急空间释放(可选)
在根分区几乎写满时,可先执行以下命令快速腾出少许空间,以便后续操作:
1 | # 清理 Docker 未使用资源 |
3.2 根本解决方案
方案 A:在线扩容根分区(利用未分配的 20G)
- 操作简单,无需迁移数据。
- 步骤:
- 安装
cloud-utils-growpart - 执行
growpart /dev/vda 1 - 根据文件系统类型执行
resize2fs或xfs_growfs
- 安装
- 结果:根分区变为约 60G,空间翻倍。
方案 B:迁移 Docker 数据目录到 /home(推荐)
- 将
/var/lib/docker移至/home/docker,彻底解决 Docker 占用根分区问题。 - 步骤:
- 停止 Docker 服务:
systemctl stop docker - 同步数据:
rsync -aP /var/lib/docker/ /home/docker/ - 备份原目录并创建软链接:
1
2mv /var/lib/docker /var/lib/docker.bak
ln -s /home/docker /var/lib/docker - 启动 Docker:
systemctl start docker - 验证无误后删除备份:
rm -rf /var/lib/docker.bak
- 停止 Docker 服务:
实际操作选择:本环境已采用 方案 B,成功将 Docker 数据迁移至
/home/docker。
4. 验证迁移成功
执行 docker info | grep "Docker Root Dir",输出为:
1 | Docker Root Dir: /home/docker |
说明 Docker 已使用新路径。
其他验证步骤:
1 | docker ps -a # 确认所有容器状态正常(Up 或预期状态) |
5. 后续建议与预防
删除迁移备份(若尚未删除):
1
rm -rf /var/lib/docker.bak
更规范地配置 Docker 数据根目录(避免依赖软链接):
编辑/etc/docker/daemon.json,添加或修改:1
2
3{
"data-root": "/home/docker"
}重启 Docker 后生效,后续无需维护软链接。
定期清理 Docker 资源:
1
docker system prune -a --volumes
可配合 cron 定时任务执行。
监控磁盘使用:
- 设置告警阈值,避免根分区再次写满。
- 检查
/var/log等目录,配置合理的日志轮转策略。
关于根分区扩容:
- 当前系统盘仍存在 20G 未分配空间,未来如有需要可按方案 A 扩容根分区,以获得更多空间余量。
6. 总结
通过将 Docker 数据目录迁移至 /home 分区,成功解决了根分区空间耗尽的问题。操作后 Docker 服务恢复正常,所有容器与数据完整,根分区压力彻底缓解。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Chase!

