近期有些网友想要了解CentOS7 KVM虚拟机快照占用磁盘过大清理方案:把“吞盘巨兽”关回笼的相关情况,小编通过整理给您分析,根据自身经验分享CentOS7 KVM虚拟机快照占用磁盘过大清理方案:把“吞盘巨兽”关回笼有关知识。
CentOS7 KVM虚拟机快照占用磁盘过大清理方案:把“吞盘巨兽”关回笼
快照本来是救急用的“后悔药”,结果一不留神变成“磁盘黑洞”,一块500G的盘能被吃掉400G,业务还没挂,宿主机先报警。别急着加硬盘,先把手里的KVM快照盘清楚,空间立马吐回来。
一、先确认是谁在“偷”空间
登录宿主机,两条命令直奔主题:
virsh domblklist 虚拟机名
列出所有磁盘路径,复制对应的qcow2文件路径。
qemu-img info /var/lib/libvirt/images/xxx.qcow2
重点看virtual size与disk size差距,差值就是快照链占掉的实际物理空间。如果disk size飙到virtual size的八九成,基本已经“胖”到警戒线。
二、合并快照前必做的“保险”
1. 关机:在线合并理论上可行,但IO一高容易把链拉断,直接关机最稳。
2. 备份:整盘拷一份到别的目录,cp也好,rsync也罢,十分钟换安心。
3. 确认无残留快照:
virsh snapshot-list 虚拟机名 --tree
只要有分叉,先virsh snapshot-delete子节点,再删父节点,顺序反了会丢数据。
三、正式“减肥”:合并qcow2链
1. 找到当前正在用的top镜像:
virsh dumpxml 虚拟机名 | grep 'source file'
2. 合并到 backing file:
qemu-img rebase -b 原盘.qcow2 -f qcow2 top.qcow2
3. 真正压缩:
qemu-img commit top.qcow2
4. 最后把链压成一层:
qemu-img convert -O qcow2 top.qcow2 新盘.qcow2
5. 改配置指向新盘:
virsh edit 虚拟机名
把路径换成新盘,启动验证。
这一步做完,400G常常能压回120G,具体 ratio 看里面碎片率。
四、不想关机的“曲线救国”法
业务24h不能停?用blockpull:
virsh blockpull 虚拟机名 vda --wait --verbose
把数据在线拉到当前层,拉完立即删除旧快照,IO会飙高,选凌晨低峰期操作。拉完再qemu-img convert一遍,空间同样能回收。
五、日常“防反弹”三件套
1. 快照留不超过两层,用完即删,拒绝“俄罗斯套娃”。
2. 给虚拟机装virtio-scsi + discard,客户机里执行fstrim -av,qcow2立即释放未用块。
3. 宿主机定时跑:
qemu-img check -r all xxx.qcow2
既能早发现问题,又能把碎片压扁。
六、踩坑速查表
• 合并完启动报“找不到backing file”——rebase时路径写错,用qemu-img rebase -u重新指。
• 删除快照提示“internal error: unable to execute QEMU command ‘transaction’”——说明还有子快照在引用,先删子后删父。
• convert后容量反而变大——源盘曾经写过大量零,加-c参数做压缩:qemu-img convert -c -O qcow2。
把上面流程跑通,宿主机磁盘告警直接消失,再也不用被“快照吃盘”半夜叫醒。记住:快照是急救绷带,不是长期仓库,用完就撕,空间永远够用。









