VMware CentOS 磁盘扩容实战
在日常运维中,虚拟机磁盘空间不足是常见问题。本文记录如何为运行中的 CentOS 7 虚拟机安全地扩容根目录,涵盖从虚拟化平台到操作系统内部的全流程,并解决实际操作中可能遇到的 growpart 报错问题。
环境与背景
- 虚拟化平台:VMware Workstation 16/17 (ESXi 步骤类似)
- 客户机系统:CentOS 7.x
- 初始磁盘:20G
- 目标磁盘:80G
- 关键特征:系统采用 LVM 分区结构
扩容前使用 lsblk 和 df -h 查看磁盘情况:
$ sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 80G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 29G 0 part
├─centos-root 253:0 0 26G 0 lvm /
└─centos-swap 253:1 0 3G 0 lvm [SWAP]
第一阶段:VMware 层面扩容
⚠️ 警告:操作前请务必对虚拟机创建快照或备份,以防数据丢失!
- 关闭虚拟机:确保目标 CentOS 虚拟机已完全关机(Power Off),而不是挂起(Suspend)。
- 编辑设置:在 VMware 中,右键点击虚拟机 -> '设置' (Settings)。
- 扩展磁盘:选择'硬盘' (Hard Disk) -> 点击'扩展' (Expand) 按钮。
- 设置容量:输入大于当前值的容量(例如从 20G 扩展到 80G)。点击确定,等待完成。
至此,虚拟硬盘已变大,但操作系统还无法使用新空间。
第二阶段:CentOS 系统内部扩容
启动 CentOS 虚拟机并登录。以下是操作的核心步骤。
标准 LVM 扩容流程
这是最正确、最安全的流程,适用于标准的 LVM 分区结构。
1. 确认磁盘状态 首先确认 VMware 扩容是否成功,并看清磁盘结构。
sudo lsblk
sudo parted /dev/sda print
从输出可以清晰看到:
/dev/sda磁盘已变为 80G。- 但分区
/dev/sda2仍为 31.1G,这意味着有大量空闲空间位于sda2分区之后。 /dev/sda2的类型是lvm,我们的根文件系统实际在逻辑卷centos-root上。
结论:我们需要将磁盘末端的空闲空间 -> 加入到 sda2 分区 -> 被 LVM 物理卷识别 -> 将新空间加入到 centos 卷组 -> 最后扩展 centos-root 逻辑卷及其文件系统。
2. 扩展分区
使用 parted 工具将 sda2 分区扩展到磁盘末尾。
sudo parted /dev/sda
(parted) resizepart 2 -1 # 将第 2 个分区扩展到所有剩余空间
(parted) quit
注意:
-1表示扩展到最大可用空间。如果resizepart命令不可用(极旧版本),需使用rm和mkpart重建分区,但风险极高,不推荐。
3. 刷新内核分区表 让系统在不重启的情况下识别新的分区大小。
sudo partprobe /dev/sda
4. 扩展物理卷 (PV)
/dev/sda2 本身是一个物理卷,我们需要调整其大小。
sudo pvresize /dev/sda2
执行后,使用 sudo pvdisplay 查看,会发现 Free PE 空间增加了。
5. 扩展逻辑卷 (LV)
将卷组中的空闲空间全部分配给 centos-root 逻辑卷。
# 查看所有空闲空间
sudo vgdisplay
# 将所有空闲空间扩展到 centos-root 逻辑卷
sudo lvextend -l +100%FREE /dev/mapper/centos-root
6. 扩展文件系统 最后一步,扩展逻辑卷上的文件系统,才能真正使用空间。
# CentOS 7 默认使用 XFS 文件系统
sudo xfs_growfs /
# 如果是 Ext4 文件系统,请使用以下命令:
# sudo resize2fs /dev/mapper/centos-root
7. 验证结果 运行命令检查最终成果:
df -h
lsblk
输出应显示根目录 / 的挂载点大小已变为 76G 左右,扩容成功!
备用方案:解决 growpart 报错
如果在非 LVM 系统上使用传统方法,可能会遇到 growpart 报错。
错误信息:
sudo growpart /dev/sda 2
unexpected output in sfdisk --version [sfdisk, 来自 util-linux 2.23.2]
原因:CentOS 7 自带的 util-linux 版本过低,与 growpart 脚本不兼容。
解决方案:直接使用 parted 替代(如上文所示),这是最佳解决方案。或者尝试更新 cloud-utils-growpart 包:
sudo yum update cloud-utils-growpart
总结与注意事项
- 核心要点:操作前一定要用
lsblk和df -T命令搞清楚磁盘和文件系统结构。识别 LVM 是关键,它决定了后续完全不同的操作流程。 - 推荐流程:对于现代 CentOS/RHEL 系统,标准 LVM 扩容流程 (
parted -> pvresize -> lvextend -> xfs_growfs) 是唯一正确路径。 - 备份!:任何磁盘分区操作都有极高风险,操作前务必为虚拟机创建快照。
- 工具选择:放弃陈旧的
growpart和fdisk脚本,parted是更强大、更现代的命令行分区工具。

