KVM虚拟机磁盘扩容,在线扩展虚拟硬盘
KVM虚拟机运行一段时间后,磁盘空间不足是常见问题。
本文介绍如何在不关机的情况下,先扩展宿主机上的虚拟硬盘镜像,再进入虚拟机内部扩展分区和文件系统,最终实现磁盘扩容。
整个过程适用于大多数Linux虚拟机,操作前请确保已备份重要数据。
扩容前需要确认的环境信息
开始操作前,先登录KVM宿主机,确认虚拟机的磁盘格式和当前容量。
执行以下命令查看虚拟机磁盘路径:
virsh domblklist 虚拟机名称
输出会显示磁盘类型和源文件路径,例如/var/lib/libvirt/images/vm01.qcow2。
接着检查磁盘格式:
qemu-img info /var/lib/libvirt/images/vm01.qcow2
重点关注file format字段,常见的有qcow2和raw。
qcow2格式支持在线扩容,raw格式也支持,但操作略有不同。
同时确认虚拟机内部的文件系统类型,登录虚拟机执行df -Th,查看根分区或数据分区是ext4还是xfs。
在宿主机上扩展虚拟硬盘容量
确认虚拟机名称和磁盘路径后,使用virsh blockresize命令在线扩展虚拟硬盘。
例如将磁盘从20G扩展到30G:
virsh blockresize 虚拟机名称 vda --size 30G
注意vda是虚拟机内部的磁盘设备名,可通过virsh domblklist查看。
如果设备名是sda,则替换为sda。
执行成功后,可以再次用virsh domblklist确认容量变化,或使用qemu-img info查看虚拟磁盘文件大小。
对于qcow2格式文件,也可以直接使用qemu-img resize命令,但需要先关闭虚拟机或确保没有快照。
在线操作推荐使用virsh blockresize。
在虚拟机内部扩展分区和文件系统
宿主机扩容后,虚拟机内部还看不到新增空间,需要进一步操作。
登录虚拟机,使用lsblk查看磁盘和分区情况,例如:
lsblk
如果磁盘vda显示30G,但分区vda1还是20G,说明需要扩展分区。
对于使用LVM的情况,先扩展物理卷:
pvresize /dev/vda1
然后扩展逻辑卷:
lvextend -l +100%FREE /dev/mapper/centos-root
最后扩展文件系统。
ext4使用:
resize2fs /dev/mapper/centos-root
xfs使用:
xfs_growfs /
如果没有使用LVM,而是直接分区,可以使用growpart工具扩展分区:
growpart /dev/vda 1
然后使用resize2fs或xfs_growfs扩展文件系统。
操作完成后,用df -Th验证容量是否增加。
常见报错与避坑说明
扩容过程中可能遇到以下问题:
virsh blockresize报错“不支持的设备类型”:检查磁盘设备名是否正确,使用virsh domblklist确认。growpart提示“NOCHANGE”:说明分区已经扩展到最大,无需再操作,直接扩展文件系统即可。- xfs文件系统无法缩小:xfs不支持缩减,只能扩大,操作前务必确认。
- 扩容后
df看不到变化:可能是文件系统未扩展,或者挂载点不对,检查mount命令输出。 - 在线扩容时虚拟机卡顿:建议在业务低峰期操作,避免影响服务。
重要提醒:任何磁盘操作都有风险,务必先备份数据。
对于生产环境,建议先在测试虚拟机验证流程。
验证扩容结果与后续建议
完成所有步骤后,在虚拟机内执行df -h,确认目标分区容量已增加。
例如根分区从20G变为30G,表示扩容成功。
同时检查/etc/fstab中的挂载配置是否正常,避免重启后挂载失败。
如果虚拟机使用了快照,扩容前需要先删除快照或合并,否则可能导致容量不一致。
对于Windows虚拟机,扩容后需要在磁盘管理中扩展卷,步骤类似,但使用图形界面操作。
定期监控磁盘使用率,建议设置告警,避免再次出现空间不足。
如果虚拟机磁盘频繁写满,考虑清理日志或迁移数据到独立磁盘。