虚拟机空间不足时,最快的解决路径是:先清理虚拟机内部垃圾文件,再扩容虚拟磁盘,最后扩展分区和文件系统三步缺一不可。 如果你正在vmware workstation、esxi或virtualbox里看到磁盘飘红,别急着重装系统,按照下文逐层操作,多半能救回来。
为什么虚拟机空间总是不够用先搞清楚空间去哪了
很多朋友的第一反应是“当初分区给小了”,但实际排查后会发现,相当一部分空间的消失是“无感”的,虚拟机里的磁盘不像物理机那样直观,你看到系统提示空间不足时,往往已经积压了三个层面的问题:虚拟机内部文件占用、虚拟磁盘文件本身的膨胀、以及快照文件的隐形吞噬。
先按由易到难的顺序排查:
- 回收站和临时文件:windows虚拟机里的休眠文件、页面文件、软件安装缓存,累计起来常有10-20gb。
- 系统更新残留:c:\windows\softwaredistribution\download目录下的更新包,装完就不需要了。
- 快照文件:这是大多数人忽略的大头,快照就像给虚拟机拍照片,拍得越多,vmdk文件(或vdi/vhdx)会越滚越大,看过一个案例,客户esxi上的虚拟机快照累计了3层,虚拟磁盘文件膨胀到原始容量的1.8倍,删除快照后直接回收了40gb空间。
- 日志和崩溃转储:linux的/var/log/journal、windows的minidump,长时间不清理也很可观。
判断一下你的情况属于哪类:如果虚拟机内部看磁盘使用率不到80%,但宿主机上虚拟磁盘文件巨大,那问题多半出在快照或碎片上,如果虚拟机内部已经爆满,那就是分区规划问题,需要走扩容流程。
esxi扩容虚拟机磁盘:图形界面操作流程
对于跑在esxi上的虚拟机,扩容磁盘用vsphere client就能完成,不需要命令行,前提是虚拟机处于关机状态,这点很重要生产环境建议先排维护窗口,避免数据不一致。
操作路径:
- 在vsphere client中右键虚拟机,选择“编辑设置”。
- 找到目标硬盘(通常是scsi 0:0或sata 0:0),展开“硬盘”选项。
- 在“容量”栏中,把“磁盘大小”从原来的数值改为目标值,比如原来100gb想扩到200gb,直接输入200,单位选gb。
- 点击“确定”,等待任务完成。
这里有三个要点需要留意:
-

扩展后分区不会自动变大
,磁盘扩容只是给虚拟机“换了个更大的硬盘”,里面的分区表、文件系统尺寸都还是原来的,后续还需要进系统手动扩展分区,这部分下文单独讲。 - esxi磁盘扩容只能扩大,不能缩小,向下调整大小在esxi原生界面里是不支持的,如果当初分配过大,只能通过迁移或克隆来收缩,成本很高。
- 磁盘类型会影响扩容方式,厚置备延迟置零(thin)和厚置备 eager zeroed 的磁盘扩容操作相同,但瘦置备磁盘扩容后,新的空间仍然是按需分配部分用户疑惑“为什么扩容后宿主机可用空间没减少”,就是这个原因。
如果你在esxi里用的是虚拟机兼容性版本较低的配置,扩容时可能会提示“需要升级虚拟机硬件版本”,这种情况下建议先升级虚拟硬件(会要求虚拟机处于关机状态),再进行扩容操作,不过升级后旧版本vsphere可能无法管理该虚拟机,操作前最好确认集群版本一致。
命令行扩容:vmkfstools 的适用场景
有些场景下图形界面帮不上忙,比如远程ssh到esxi宿主机操作、或需要批量扩容多个虚拟机,这时用vmkfstools命令最直接。
要扩展现有vmdk的大小,先找到虚拟机的数据存储路径,然后执行:
vmkfstools -X 200g /vmfs/volumes/datastore1/yourvm/yourvm.vmdk
这条命令会把磁盘扩展到200gb,有几个细节需要确认:
- 路径要准确,可以通过
find /vmfs -name ".vmdk"查找,注意使用实际vmdk文件名,而不是“-flat.vmdk”或“-delta.vmdk”(快照文件)。 - 扩容前必须确认虚拟机已关机,vmkfstools不会检查虚拟机是否在线,如果强制在运行状态下扩容,可能导致文件系统损坏。
- 精简置备(thin)磁盘也能用这个命令,扩展后新空间不会立刻占满存储,而是继续按需分配,厚置备磁盘扩展后同样如此。
- 不建议用vmkfstools缩容,缩容需要迁移或重建虚拟机,风险极高,正常情况下没人这么干。
如果用vmkfstools扩展后,在虚拟机内部看到磁盘大小没变化,先确认是不是命令执行成功(检查vmdk文件的大小),然后进系统用分区工具刷新,windows的磁盘管理里右键“重新扫描磁盘”即可,linux需要运行partprobe或echo 1 > /sys/class/scsi_disk/0:0:0:0/device/rescan

。
虚拟机磁盘扩容linux分区调整方法
前面两步做完,虚拟机磁盘在宿主机层面已经变大了,但系统里的分区还是老样子,这一步相当于告诉操作系统“你的硬盘变大了,把分区扩展一下吧”。
linux系统(以centos/ubuntu为例) 是常见场景:
用lsblk或fdisk -l查看当前磁盘分区情况,假设sda是虚拟磁盘,sda1是根分区,实际步骤如下:
- 执行
df -h确认当前根分区的使用率。 - 执行
growpart /dev/sda 1扩展分区(也可以用fdisk删除重建分区注意不删除分区数据的情况下重建,操作要极其小心,非专家不建议)。 - 扩展文件系统,ext4用
resize2fs /dev/sda1,xfs用xfs_growfs /。 - 执行
df -h确认新大小已生效。
需要注意:如果lvm结构,步骤会多一些先扩展pv(pvresize),再扩容lv(lvextend),最后扩展文件系统,对于lvm,实际上更推荐在创建时就预留空间,后续扩容流程更顺畅。
windows系统的操作相对简单:打开“磁盘管理”(右键“此电脑”→“管理”),在磁盘1或磁盘2上找到目标分区,右键选择“扩展卷”,按向导走完即可,如果扩容后“创建共享文件夹”或“数据存储”选项是灰色的,多半是虚拟磁盘没有新增大块未分配空间,检查宿主机侧的扩容是否真正完成。
空间还是不够?从虚拟机内部做减法
在考虑“再扩一块新磁盘”之前,先试试虚拟机内部清理很多时候能腾出20%-30%的空间,具体做法按优先级排列:
- 清理日志文件,windows清理“c:\windows\temp”和浏览器缓存;linux清理“/var/log/journal”和“/tmp”下超过7天的文件。
- 关闭系统还原(windows)或快照清理(创建过快照的平台),快照删除后,vmdk文件不会自动变小需要克隆到新目录或做存储迁移,磁盘文件才能“瘦身”。
- 压缩虚拟磁盘文件,vmware workstation里用vmware-vdiskmanager -k命令收缩thin磁盘空间,virtualbox用vboxmanage modifymedium --compact。
清理完成后,配合前面扩容的步骤,多数情况下不用再花钱扩展物理存储。
扩展后还是报“磁盘空间不足”的排查方向
如果依照上面的流程走完,进入虚拟机后还是看到空间不足的报警,按以下顺序排查:

- 确认宿主机侧磁盘是否真的扩大,在esxi web client中查看虚拟机硬件列表,确认“磁盘大小”字段已更新。
- 确认虚拟机总线类型与操作系统识别,新旧总线类型(sata vs scsi)切换后,系统可能识别为另一个硬盘。
- 检查分区表格式,如果用了gpt分区表且系统为传统bios启动(非uefi),扩展分区时可能会受到mbr限制超过2tb的分区需要gpt,老系统不支持。
- 查看inode是否耗尽,linux上有时候空间没满但inode满了,也会报“no space left on device”,执行
df -i可确认。
常见问题速查
vmware虚拟机扩容后分区没变大怎么办?
这是最常被问到的情况,确认宿主机已扩容、虚拟机已关机/重启、分区工具已刷新后,多半是系统内部分区没扩展,linux执行growpart和resize2fs/xfs_growfs,windows使用“磁盘管理”的“扩展卷”,如果仍不行,检查分区表类型和lvm结构是否完整。
虚拟机空间不足,加新硬盘还是扩原硬盘?
优先扩原硬盘,新加硬盘意味着要重新挂载、迁移数据、修改应用路径,复杂度显著提升,只有原分区表结构损坏或保留分区空间不够时,才考虑新加虚拟磁盘,另有一种情况:原磁盘是厚置备而且是固定大小,扩容后存储空间不太够,可以新加一个thin置备的磁盘,把非系统数据迁移过去。
如何在关机状态下扩容esxi虚拟机?
vsphere client中右键虚拟机 → “编辑设置” → 选择硬盘 → 修改容量 → 确定,只要虚拟机在“已关机”状态,操作几分钟就能完成,不影响其他运行中的虚拟机,批量扩容场景下,脚本循环执行vmkfstools效果更好,但记得逐一确认目标虚拟机的vmdk路径,别扩错文件。
虚拟机空间不足的解决路径,归根结底是“先清理、再扩容、后分区”的顺序。 清理解决的是“空间去哪了”的问题,扩容解决的是“物理容量不够”的问题,分区调整解决的是“系统认不出新空间”的问题,三步按顺序排查,多数场景能在半小时内解决,最后记住一条铁律:所有扩容操作前,务必备份关键数据,毕竟虚拟化环境里数据安全永远是第一位的。