虚拟机磁盘空间不足时,在线无损扩容是最直接的解决办法,核心思路是先通过虚拟化平台扩展虚拟磁盘容量,再在操作系统内扩容分区和文件系统,整个过程中虚拟机不需要关机。
很多人一遇到磁盘报警就习惯性关机加盘,但生产环境根本不允许停机,在线扩容不中断业务,操作路径也固定,只是不同虚拟化平台的细节有差异,下面按常见平台拆开讲,最后补充几个容易翻车的点。
虚拟机磁盘在线无损扩容的前提条件
不是所有虚拟机都能随手扩容,动手前,先确认三件事。
- 虚拟化平台支持在线扩容,VMware ESXi、KVM/QEMU、Hyper-V都支持给运行中的虚拟机增加磁盘容量,但具体限制不同,VMware要求虚拟机硬件版本支持热添加,Hyper-V则直接通过SCSI控制器扩展。
- 磁盘没有快照,这个最容易被忽视,有快照的虚拟机,磁盘是只读基础卷加差分链,直接扩容会报错或者扩容不生效,多数虚拟化平台要求先删除或合并快照,才能对虚拟磁盘执行在线扩容。
- 分区表和文件系统支持热扩展,MBR分区表最大只能识别2TB,超过2TB必须用GPT;文件系统方面,Linux下的XFS支持在线增大,ext4也能在线扩容,但前提是分区本身先扩展,Windows的NTFS支持在线扩展卷。
还需要看一眼磁盘控制器类型,VMware中如果是IDE控制器,在线扩容可能灰显,必须使用SCSI或SATA控制器,行业共识认为,在线扩容对生产环境干扰最小,但备份仍是必做动作,哪怕只是做一次临时快照(完成后删除)也比裸奔强。
VMware虚拟机磁盘扩容不关机怎么操作
这里以vCenter管理环境为例,描述VMware虚拟机磁盘扩容不关机的完整路径,如果用的是ESXi单机版,界面稍有不同,但流程一致。
在vSphere Web Client中扩展虚拟磁盘
- 选中目标虚拟机,右键选择“编辑设置”。
- 在“虚拟机硬件”标签下,找到需要扩容的硬盘,把磁盘大小改成更大的数值,比如从100GB改成200GB。
- 点击确定后,vCenter会把扩容动作热插到虚拟机的SCSI总线上,虚拟机不用重启就能识别到新容量。

磁盘大小”输入框灰显,说明虚拟机配置或控制器不支持热加盘,只能关机扩容,检查“虚拟机选项”→“高级”→“配置参数”中是否存在scsi0:0.allowGuestOSResize,没有这个参数时,部分旧版本Linux客户端可能无法自动识别扩容后的容量。
Windows系统内扩展分区
进入Windows虚拟机后,右键“此电脑”→“管理”→“磁盘管理”,你会看到磁盘上多出一段未分配空间,而且就在原分区右侧。
- 右键原分区(一般是C盘),选择“扩展卷”。
- 按向导把未分配空间并入原分区。
- Windows的NTFS文件系统支持热扩展,不需要重启。
扩展卷”按钮是灰色的,多数情况下是未分配空间不在目标分区相邻位置,或者系统盘是MBR分区但受限,可以先确认相邻关系,再用diskpart命令行操作:
diskpart
list volume
select volume 1
extend
Linux系统内扩展文件系统
Linux虚拟机在线扩容需要多一步:先让内核重新读取磁盘分区表,VMware扩容完成后,虚拟机内的fdisk -l不一定能立刻看到新大小,执行:
echo 1 > /sys/class/scsi_device/0:0:0:0/device/rescan
或者使用partprobe刷新分区表,然后查看当前布局:
lsblk
假设根分区是/dev/sda2,先用growpart扩展分区:
growpart /dev/sda 2
再扩展文件系统,XFS使用:
xfs_growfs /
ext4使用:
resize2fs /dev/sda2
XFS和ext4都支持在线扩展,不需要重启,业内专家指出,最容易出错的地方是内核没有重读分区表,导致growpart在分区末尾找不到可用空间,报错后不要盲目重试,先确认扫描命令执行成功。
KVM虚拟机磁盘扩容的命令行步骤
KVM环境下的在线扩容不关机,同样分两层:宿主机层扩展磁盘镜像,虚拟机内扩展分区和文件系统。
先扩展qcow2或raw镜像
在宿主机上查看当前磁盘镜像信息:

qemu-img info /data/vm/ubuntu.qcow2
如果虚拟机是运行中的,推荐用virsh blockresize进行热扩容:
virsh blockresize --domain ubuntu --path /data/vm/ubuntu.qcow2 --size 200G
blockresize会直接更新设备大小,虚拟机的virtio-blk或virtio-scsi设备能感知到变化,如果镜像后端是LVM或iSCSI,则需要先扩展底层块设备,再执行blockresize,raw格式的镜像也可以先用qemu-img resize /data/vm/ubuntu.raw 200G扩展,但在虚拟机内同样需要触发一次重扫描。
虚拟机内识别新容量并扩展分区
在虚拟机内,执行以下命令让系统重新读取磁盘大小:
echo 1 > /sys/class/block/vda/device/rescan
或者使用partprobe,然后用lsblk确认新容量已经出现,后续操作与VMware部分一致,只是设备名通常是vda或vdb:
growpart /dev/vda 2
xfs_growfs /
resize2fs /dev/vda2
KVM磁盘扩容不关机的关键在于virtio驱动版本,较老的内核可能不支持在线rescan,建议提前确认客户机内核版本,必要时热加载virtio_blk模块。
在线扩容后分区调整的细节和坑
扩容后系统还是显示原大小
这是最常见的故障,原因一般是SCSI或virtio总线没有重新扫描,Windows系统可以到设备管理器中,右键“磁盘驱动器”→“扫描检测硬件改动”;Linux执行partprobe或上述rescan命令,如果扫描后仍然没有变化,多半是虚拟化平台不支持热添加,或者磁盘有快照,只能停机处理。
GPT和MBR分区表带来的限制
MBR分区表只支持到2TB,而GPT分区表没有这个限制,如果虚拟磁盘已经接近2TB,或者计划扩容到超过2TB,必须使用GPT分区表,扩容前用diskpart的convert gpt或parted转换,但转换有风险,最好在创建虚拟机时就选对分区表格式。
扩容影响存储成本和性能
在线扩容本身只修改虚拟磁盘的元数据和分区大小,不触碰已有文件内容,但任何磁盘操作都有一定失败概率,尤其是存储层I/O不稳定的情况下,有条件的团队应先做快照或备份,扩容完成后立即删除临时快照。

扩容不等于立即分配物理空间,精简置备的虚拟磁盘扩容后,只是允许虚拟机写入更多数据,实际占用物理存储的依然是已写入的数据,从成本角度看,虚拟机扩容的价格最终由存储池消耗决定,建议监控存储池剩余容量,避免超卖导致性能骤降。
扩容后如何验证文件系统状态
Linux下用df -h查看挂载容量,用xfs_info或tune2fs确认文件系统参数;Windows打开“磁盘管理”查看分区大小,还可以在扩容后的分区里创建一个临时文件再删除,确认写入正常。
虚拟机磁盘在线扩容常见问题解答
虚拟机磁盘扩容不关机真的能做到吗?
可以,VMware的磁盘热扩容、KVM的blockresize、Hyper-V的动态扩展,都允许虚拟机运行状态下增加虚拟磁盘容量,之后在系统内在线扩展分区和文件系统,整个流程不中断业务,但要求虚拟化版本和客户机操作系统同时满足条件。
扩容后Windows的“扩展卷”按钮是灰色的,怎么处理?
先确认未分配空间是否紧邻目标分区右侧,如果中间隔着一个恢复分区或EFI系统分区,系统自带的扩展卷功能就无法使用,解决办法是先用第三方分区工具把未分配空间调整到目标分区右侧,或者删除中间多余的小分区(操作前备份分区内容),再回到磁盘管理中执行扩展卷,对于C盘,还可以尝试通过diskpart的extend命令强制合并,但前提是分区布局允许。
在线扩容和离线扩容怎么选?
在线扩容适合生产环境,不关机、无停机窗口;离线扩容需要关机,但兼容性更强,适合旧版本虚拟化平台或分区表不支持的场景,多数情况下,只要平台支持,在线扩容是更优选择,前提是提前做好规划和备份。
先扩磁盘,再扩分区,最后扩展文件系统”这个顺序,再确认快照、分区表、文件系统三个前置条件,虚拟机磁盘空间不足的问题就能无损解决。