解决Docker存储空间不足问题
虚拟机磁盘扩展实战:解决Docker存储空间不足问题
问题背景
在虚拟机中运行的Linux系统上,Docker服务因根分区空间不足而无法正常运行。初始状态如下:
[root@localhost ~]# df -h /
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 17G 17G 983M 95% /[root@localhost ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 8 7 3.914GB 260.4MB
Containers 8 4 6.741GB 18.13kB
根分区使用率已达95%,仅剩983MB空间,导致Docker无法正常工作。
完整解决方案
步骤1:安装parted工具(如未安装)
# 检查parted是否已安装
which parted || echo "parted not installed"# 安装parted工具
sudo yum install -y parted # CentOS/RHEL
# 或
sudo apt-get install -y parted # Ubuntu/Debian# 验证安装
sudo parted --version
步骤2:扩展虚拟机磁盘
- 关闭虚拟机
- 在虚拟机管理软件中:
- VMware: 虚拟机设置 → 硬盘 → 扩展
- VirtualBox: 设置 → 存储 → 调整大小
- 将磁盘从30GB扩展到53.7GB
- 启动虚拟机
步骤3:进入parted交互模式
# 启动parted工具(需要root权限)
sudo parted /dev/sda
步骤4:parted交互操作指南
在parted交互模式中,按顺序执行以下命令:
# 1. 查看当前分区信息
(parted) print# 2. 调整分区大小(注意:100%后不要添加任何注释)
(parted) resizepart 2 100%# 3. 确认分区已扩展
(parted) print# 4. 退出parted
(parted) quit
关键操作截图:
(parted) print # 执行前
Number Start End Size Type File system 标志
1 1049kB 1075MB 1074MB primary xfs 启动
2 1075MB 30.0GB 28.9GB primary lvm(parted) resizepart 2 100% # 正确执行(parted) print # 执行后
Number Start End Size Type File system 标志
1 1049kB 1075MB 1074MB primary xfs 启动
2 1075MB 53.7GB 52.6GB primary lvm
步骤5:更新分区表
# 强制内核重新读取分区表
sudo partprobe -s /dev/sda
sudo udevadm settle# 确认分区已扩展
sudo fdisk -l /dev/sda
预期输出:
设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 104857599 51379200 8e Linux LVM
步骤6:扩展物理卷(PV)
# 强制物理卷使用整个分区空间
sudo pvresize /dev/sda2# 验证PV大小
sudo pvdisplay /dev/sda2
检查关键值:
PV Size
应接近53.7GBFree PE
应有大量空间
步骤7:扩展逻辑卷(LV)和文件系统
# 查看卷组可用空间
sudo vgdisplay centos | grep "Free"# 将所有空闲空间分配给根逻辑卷
sudo lvextend -l +100%FREE /dev/mapper/centos-root# 扩展XFS文件系统
sudo xfs_growfs /dev/mapper/centos-root# 验证最终结果
df -h /
成功验证
操作完成后,系统显示:
[root@localhost ~]# df -h /
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 54G 17G 37G 32% /[root@localhost ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 8 7 3.914GB 260.4MB
Containers 8 4 6.741GB 18.13kB
根分区从17GB扩展到54GB,Docker存储空间不足问题得到解决。
Parted交互模式详解
什么是parted交互模式?
parted是一个磁盘分区工具,提供两种使用方式:
- 命令行模式:
sudo parted /dev/sda resizepart 2 100%
- 交互模式:通过
sudo parted /dev/sda
进入,然后输入命令
为什么使用交互模式?
- 更直观:每一步操作都有明确提示
- 更安全:操作前可预览更改
- 更灵活:支持多种磁盘操作命令
常用交互命令:
命令 | 功能 | 示例 |
---|---|---|
print | 显示分区表 | (parted) print |
resizepart | 调整分区大小 | (parted) resizepart 2 100% |
rm | 删除分区 | (parted) rm 3 |
mkpart | 创建新分区 | (parted) mkpart primary 30GB 100% |
quit | 退出交互模式 | (parted) quit |
关键要点
-
操作顺序至关重要:
- 先扩展虚拟机磁盘
- 再扩展Linux分区
- 最后扩展LVM和文件系统
-
parted命令注意事项:
# 正确命令(简洁无注释) (parted) resizepart 2 100%# 错误命令(会导致失败) (parted) resizepart 2 # 选择要调整的分区(这里是分区2)
-
LVM扩展逻辑:
物理磁盘 → 分区 → 物理卷(PV) → 卷组(VG) → 逻辑卷(LV) → 文件系统
-
XFS文件系统特性:
- 支持在线扩展(无需卸载)
- 使用
xfs_growfs
命令扩展
常见问题解决方案
问题1:parted未安装
# CentOS/RHEL
sudo yum install -y parted# Ubuntu/Debian
sudo apt-get update && sudo apt-get install -y parted
问题2:parted命令无效
# 确保使用正确语法
(parted) help resizepart # 查看命令帮助# 使用绝对路径
/sbin/parted /dev/sda
问题3:空间未完全释放
# 清理Docker无用数据
docker system prune -af# 清理系统日志
sudo journalctl --vacuum-size=200M
sudo rm -rf /var/log/journal/*
问题4:parted无法调整分区
使用fdisk替代方案:
# 备份分区表
sudo sfdisk -d /dev/sda > sda.bak# 进入fdisk交互模式
sudo fdisk /dev/sda# 在fdisk中执行:
d # 删除分区
2 # 选择分区2
n # 新建分区
p # 主分区
2 # 分区号2
2099200 # 起始扇区(必须相同!)
Enter # 使用默认结束位置(整个磁盘)
t # 更改类型
2 # 选择分区2
8e # Linux LVM 类型
w # 写入更改
总结
通过本指南,您成功实现了:
- parted工具的安装与使用
- 虚拟机磁盘从30GB扩展到53.7GB
- Linux分区扩展到整个可用空间
- LVM物理卷和逻辑卷的扩展
- XFS文件系统的在线扩展
- Docker存储空间不足问题的解决
经验提示:在生产环境中操作前,务必对虚拟机进行快照备份,以防操作失误导致数据丢失。parted交互模式虽然需要额外学习,但提供了更直观和安全的分区管理方式。