还在为虚拟机磁盘爆红发愁?这篇文章手把手教你安全扩容,告别“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(注意:不要扩sda1或sda2,它们通常是引导分区) - LVM逻辑卷名是
ubuntu--vg-ubuntu--lv
请根据你的实际输出,记住三个关键信息:磁盘名(sda)、系统分区号(3)、逻辑卷名。
步骤3:扩展系统分区(sda3)
sudo growpart /dev/sda 3
⚠️ 注意
sda和3之间有空格,不是/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为根分区号)即可,无需 pvresize 和 lvextend。
❓ 能否在不关机的情况下扩容?
不能。VMware扩展磁盘容量必须关机操作,这是硬性限制。但一旦在VMware层面扩展完成,后续系统内所有操作都可以在线执行。
五、总结
把上述流程梳理成一张简易路线图:
VMware关机 → 删除快照 → 扩展虚拟磁盘 → 开机
↓
安装 growpart → 查看分区结构(lsblk)
↓
growpart /dev/sda 3 → pvresize → lvextend → resize2fs
↓
df -h 验证成功 ✅
整个过程只需大约5分钟,却能为你的开发环境续命不少时日。养成定期清理磁盘和及时扩容的习惯,能让你的虚拟机跑得更顺畅。
最后留个小问题:你有因为磁盘满而丢失过重要数据吗?或者你曾经在扩容过程中遇到过什么奇怪的报错?欢迎在评论区分享你的经历,我们一起避坑!
如果这篇文章帮到了你,不妨点个赞或收藏,让更多小伙伴看到~ 😊
(本文操作基于 Ubuntu 22.04 LTS + VMware Workstation 17 Pro,其他版本原理相同,命令基本通用。)
“`