还在为虚拟机磁盘爆红发愁?这篇文章手把手教你安全扩容,告别“No space left on device”的烦恼

写在前面

作为一名经常折腾虚拟机的开发者,相信你一定遇到过这样的场景:虚拟机磁盘空间告急,系统开始频频报错,编译项目时提示“No space left on device”……这时候,扩容就成了刚需。

但VMware扩容并非“点两下鼠标”那么简单。很多新手在VMware界面扩展了磁盘大小,进到系统却发现可用空间一点儿没变——这是因为VMware只是给硬盘“增大了物理空间”,系统本身还不会自动使用这些新空间。我们需要手动调整分区和文件系统,才能真正用上扩容后的容量。

今天我就以 Ubuntu系统(LVM管理) 为例,完整记录从VMware操作到系统内生效的每一步,帮你彻底搞定扩容问题。


一、操作前必做:三步准备,防患未然

扩容涉及分区操作,虽然风险不高,但谨慎总没错。

1. 完全关机(不是挂起)

在VMware中,给虚拟机扩容必须处于关机状态(Power Off)。挂起(Suspend)状态无法执行扩展操作。

2. 删除所有快照

VMware有个规则:只要存在快照,磁盘扩展按钮就是灰色的(不可点击)。所以请在关机后,先删除该虚拟机所有快照,再继续操作。

3. 备份重要数据

虽然扩容一般不会丢数据,但分区操作总有不确定性。请把重要代码、配置文件、数据库导出备份一次,有备无患。


二、VMware操作:扩大虚拟硬盘容量

准备工作做完,我们开始第一步。

步骤1:打开虚拟机设置

选中你的Ubuntu虚拟机,点击菜单栏“编辑虚拟机设置”(或右键 → 设置)。

步骤2:找到硬盘扩展

在硬件列表中选择“硬盘(SCSI/SATA)”,在右侧下方找到“扩展”按钮并点击。

⚠️ 如果“扩展”按钮灰色不可点,请回头检查:虚拟机是否已关机、是否已删除所有快照

步骤3:输入新容量

在弹出的窗口中,输入你想要的新磁盘总大小(比如原来20GB,现在改成50GB)。注意这里是总容量而非增量。

点击“扩展”,VMware几秒钟就会完成操作。

步骤4:开机验证

启动虚拟机,打开终端执行:

lsblk

你会看到磁盘总容量已经变成了你刚刚设置的值(比如50GB)。但根分区(/)的大小还没变——接下来才是重头戏。


三、系统内操作:让扩容真正生效

Ubuntu如今普遍采用 LVM(逻辑卷管理),好处是扩容灵活,但操作步骤也相应多几个环节。

📌 请务必确认你的系统分区结构,执行 lsblk 查看。常见两种场景:

  • LVM场景:根分区在 /dev/mapper/ubuntu--vg-ubuntu--lv 下(如下文演示)
  • 非LVM场景:根分区直接挂载为 /dev/sdaX,用 resize2fs 直接扩容即可

本文以最常见的LVM场景为例。

步骤1:安装必要工具

sudo apt update
sudo apt install cloud-guest-utils -y

cloud-guest-utils 提供了 growpart 命令,用于安全扩展分区大小。

步骤2:确认分区信息

lsblk

输出示例:

NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                         8:0    0   50G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0    2G  0 part /boot
└─sda3                      8:3    0   18G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   18G  0 lvm  /

观察可知:

  • 磁盘是 /dev/sda
  • 系统分区是 sda3注意:不要扩 sda1sda2,它们通常是引导分区
  • LVM逻辑卷名是 ubuntu--vg-ubuntu--lv

请根据你的实际输出,记住三个关键信息:磁盘名(sda)、系统分区号(3)、逻辑卷名。

步骤3:扩展系统分区(sda3)

sudo growpart /dev/sda 3

⚠️ 注意 sda3 之间有空格,不是 /dev/sda3

执行后,growpart 会将 sda3 分区扩展到磁盘末尾的所有可用空间。

步骤4:扩展物理卷(PV)

sudo pvresize /dev/sda3

此命令让LVM识别到 sda3 分区变大了。

步骤5:扩展逻辑卷(LV),占满所有剩余空间

sudo lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
  • -l +100%FREE 表示将所有空闲空间都分配给该逻辑卷
  • 逻辑卷路径请替换为你上一步查到的实际名称

步骤6:扩展文件系统

sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv

如果你用的是 XFS 文件系统(CentOS常见),请改用 sudo xfs_growfs /

💡 偷懒小技巧:第5和第6步可以合并为一条命令:

sudo lvextend -l +100%FREE -r /dev/mapper/ubuntu--vg-ubuntu--lv

参数 -r 会自动执行文件系统扩展。

步骤7:验证结果

df -h

查看根目录 / 的容量,是否已经变成预期大小。


四、常见问题与避坑指南

❓ 执行 growpart 报错“unexpected output”

这通常是因为分区表不是GPT格式,或者分区编号识别异常。可以先用 sudo fdisk -l 确认分区布局,再核对命令中的磁盘名和分区号。

❓ 扩展后 df -h 没变化

  • 检查是否执行了 resize2fs(或 xfs_growfs
  • 确认 lsblk 中逻辑卷大小是否已变大,若逻辑卷未变大,重试 lvextend

❓ 我的是非LVM系统,怎么操作?

非LVM更简单:growpart 扩展分区后,直接 resize2fs /dev/sdaX(X为根分区号)即可,无需 pvresizelvextend

❓ 能否在不关机的情况下扩容?

不能。VMware扩展磁盘容量必须关机操作,这是硬性限制。但一旦在VMware层面扩展完成,后续系统内所有操作都可以在线执行。


五、总结

把上述流程梳理成一张简易路线图:

VMware关机 → 删除快照 → 扩展虚拟磁盘 → 开机
    ↓
安装 growpart → 查看分区结构(lsblk)
    ↓
growpart /dev/sda 3 → pvresize → lvextend → resize2fs
    ↓
df -h 验证成功 ✅

整个过程只需大约5分钟,却能为你的开发环境续命不少时日。养成定期清理磁盘和及时扩容的习惯,能让你的虚拟机跑得更顺畅。


最后留个小问题:你有因为磁盘满而丢失过重要数据吗?或者你曾经在扩容过程中遇到过什么奇怪的报错?欢迎在评论区分享你的经历,我们一起避坑!

如果这篇文章帮到了你,不妨点个收藏,让更多小伙伴看到~ 😊


(本文操作基于 Ubuntu 22.04 LTS + VMware Workstation 17 Pro,其他版本原理相同,命令基本通用。)
“`