1. 问题现象

  • 根分区 /dev/vda1 使用率达到 **99%**(40G 总容量已几乎用尽)。
  • /home 分区(/dev/vdb1)有 200G 空间,使用率仅 29%,存在大量空闲。
  • 部分 Docker overlay 挂载点直接显示根分区已满,容器或服务可能因此异常。
  • 执行 lsblkdf -h 的原始输出如下(关键部分):
    1
    2
    3
    4
    vda    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 /home
    1
    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
2
3
4
5
6
7
8
9
10
11
12
# 清理 Docker 未使用资源
docker system prune -a --volumes

# 清理包管理缓存(CentOS/RHEL)
yum clean all

# 清理 journal 日志
journalctl --vacuum-size=200M

# 清空大日志文件
> /var/log/messages
> /var/log/secure

3.2 根本解决方案

方案 A:在线扩容根分区(利用未分配的 20G)

  • 操作简单,无需迁移数据。
  • 步骤:
    1. 安装 cloud-utils-growpart
    2. 执行 growpart /dev/vda 1
    3. 根据文件系统类型执行 resize2fsxfs_growfs
  • 结果:根分区变为约 60G,空间翻倍。

方案 B:迁移 Docker 数据目录到 /home(推荐)

  • /var/lib/docker 移至 /home/docker,彻底解决 Docker 占用根分区问题。
  • 步骤:
    1. 停止 Docker 服务:systemctl stop docker
    2. 同步数据:rsync -aP /var/lib/docker/ /home/docker/
    3. 备份原目录并创建软链接:
      1
      2
      mv /var/lib/docker /var/lib/docker.bak
      ln -s /home/docker /var/lib/docker
    4. 启动 Docker:systemctl start docker
    5. 验证无误后删除备份:rm -rf /var/lib/docker.bak

实际操作选择:本环境已采用 方案 B,成功将 Docker 数据迁移至 /home/docker

4. 验证迁移成功

执行 docker info | grep "Docker Root Dir",输出为:

1
Docker Root Dir: /home/docker

说明 Docker 已使用新路径。

其他验证步骤:

1
2
3
4
docker ps -a          # 确认所有容器状态正常(Up 或预期状态)
docker images # 镜像完整无缺失
docker volume ls # 数据卷存在
df -h / # 根分区使用率明显下降(原 /var/lib/docker 空间被释放)

5. 后续建议与预防

  1. 删除迁移备份(若尚未删除):

    1
    rm -rf /var/lib/docker.bak
  2. 更规范地配置 Docker 数据根目录(避免依赖软链接):
    编辑 /etc/docker/daemon.json,添加或修改:

    1
    2
    3
    {
    "data-root": "/home/docker"
    }

    重启 Docker 后生效,后续无需维护软链接。

  3. 定期清理 Docker 资源

    1
    docker system prune -a --volumes

    可配合 cron 定时任务执行。

  4. 监控磁盘使用

    • 设置告警阈值,避免根分区再次写满。
    • 检查 /var/log 等目录,配置合理的日志轮转策略。
  5. 关于根分区扩容

    • 当前系统盘仍存在 20G 未分配空间,未来如有需要可按方案 A 扩容根分区,以获得更多空间余量。

6. 总结

通过将 Docker 数据目录迁移至 /home 分区,成功解决了根分区空间耗尽的问题。操作后 Docker 服务恢复正常,所有容器与数据完整,根分区压力彻底缓解。