KVM虚拟机在线扩容需满足qcow2格式且启用LVM;若为LVM直通则不可blockresize,须停机或attach-disk;qcow2+LVM时可用virsh blockresize扩逻辑容量,再用growpart、pvresize等同步分区与文件系统。

宿主机上确认磁盘镜像格式与路径
当KVM虚拟机安装后发现根分区只剩几百MB可用空间,而业务又不能停机时,必须立刻判断能否在线扩容——这取决于磁盘格式是否为qcow2且虚拟机内是否启用LVM。先登录宿主机,用virsh命令查清目标虚拟机使用的磁盘设备名和实际路径:virsh domblklist vm01。
若输出中Target列为vda,Source列为/var/lib/libvirt/images/vm01.qcow2,则进入下一步;若Source显示的是/dev/vg0/lv_vm01这类LVM设备路径,说明该虚拟机使用的是逻辑卷直通模式,【此时不可用blockresize,必须走attach-disk或停机扩容】。
接着验证镜像格式:qemu-img info /var/lib/libvirt/images/vm01.qcow2 | grep "file format"。只有看到qcow2才能继续在线操作。
方法一:blockresize在线扩容现有磁盘(无需关机)
此法适用于已部署LVM且运行中需紧急加空间的场景,比如数据库日志盘突然写满。注意:Windows虚拟机需提前在磁盘管理中启用“联机扩展”功能,否则扩完宿主机空间后系统仍无法识别新增容量。
第一步:执行virsh blockresize vm01 /var/lib/libvirt/images/vm01.qcow2 +20G,将逻辑容量增加20GB。这里用+号是关键,直接写20G会把镜像重设为20G而非追加,极易误删数据。
第二步:在虚拟机内部执行lsblk,确认/dev/vda大小已更新,但/dev/vda2(假设是根分区)大小未变——这说明只是底层块设备扩容了,分区表还没同步。
第三步:安装growpart工具(CentOS系:yum install -y cloud-utils-growpart;Ubuntu系:apt install -y cloud-guest-utils),然后运行growpart /dev/vda 2强制重写分区表。这一步失败会导致后续LVM无法识别新空间,务必检查返回值是否为0。
第四步:执行pvresize /dev/vda2 → vgextend centos_vg /dev/vda2 → lvextend -l +100%FREE /dev/mapper/centos_vg-root → xfs_growfs /。最后一条命令针对XFS文件系统;若为EXT4则改用resize2fs /dev/mapper/centos_vg-root。
方法二:创建新磁盘并挂载到存储池(支持热插拔)
当你需要长期隔离不同业务的数据(如把备份目录单独挂到新盘)、或原磁盘已用尽所有扩展余量时,应选择添加独立虚拟磁盘。这种方法对宿主机存储架构要求更高,但虚拟机内部操作更可控。
方法一:用qemu-img创建新盘并attach-disk
在宿主机执行qemu-img create -f qcow2 /var/lib/libvirt/images/vm01_data.qcow2 50G,再运行virsh attach-disk vm01 /var/lib/libvirt/images/vm01_data.qcow2 vdb --cache=none --subdriver=qcow2 --persistent。注意--persistent参数必须带上,否则重启虚拟机后磁盘会丢失。
方法二:基于libvirt存储池动态分配
先定义一个目录型存储池:virsh pool-define-as data-pool dir --target /var/lib/libvirt/images/data;再启动它:virsh pool-start data-pool;最后从池中创建卷:virsh vol-create-as data-pool vm01_log.qcow2 30G --format qcow2。完成后用virsh attach-device挂载XML配置片段,比裸路径更利于批量管理。
虚拟机内识别新盘后,建议直接创建新LVM卷组(如vg_log),而非合并进原有VG——避免单点故障影响全部业务。
安装阶段就规避空间不足:用存储池预配磁盘
新装虚拟机时若预判后期要扩容,应在virt-install命令中显式指定存储池而非绝对路径。例如:--disk pool=default,size=40,bus=virtio,format=qcow2。这样创建的磁盘自动归属libvirt管理,后续可通过virsh vol-resize无缝调整大小,且元数据变更由libvirt统一维护,不会出现qemu-img resize后virsh list不识别的情况。
如果使用virt-manager图形界面,在“存储”选项卡里选择“在存储池中新建卷”,勾选“稀疏文件”并设置最大容量,效果等同于命令行pool方式。
这一步做完,虚拟机安装完成即拥有可弹性伸缩的磁盘基础,后续任何扩容都只需virsh vol-resize vm01_root.qcow2 +10G → virsh blockresize vm01 vda 50G两步完成,不再需要手动growpart或重启服务。











