KVM虚拟机快照无法删除故障排查实用指南
运维人员在Linux宿主机搭建的KVM虚拟化环境中,常通过快照实现虚拟机状态备份,方便快速回滚测试或系统变更,但运行一段时间后,时常会碰到KVM虚拟机快照无法删除的问题,既无法释放存储资源,也会影响后续新快照的创建。本文整理了可落地的排查与解决步骤,供一线运维人员参考。绝大多数原生libvirt KVM环境下的快照无法删除故障,可通过排查进程占用、检查存储权限、清理损坏元数据三步解决。
适用读者:维护基于KVM的服务器虚拟化、桌面虚拟化的技术人员;环境前提:基于原生libvirt管理的KVM环境,Linux内核版本3.10以上;本文不讨论未使用libvirt的自定义KVM环境的定制化故障。
KVM虚拟机快照无法删除的常见诱因
KVM快照本质是基于overlay差分文件系统的增量磁盘,删除快照需要将差分数据合并到基础盘,解除文件引用关系,更新libvirt元数据。整个流程任意环节出错,都会导致删除失败。
下表整理了执行virsh snapshot-delete命令返回的常见错误,对应诱因和初步排查方向:
| 常见错误输出 | 对应故障诱因 | 初步排查方向 |
|---|---|---|
| Can’t delete snapshot: domain is running | 运行中虚拟机的快照被进程占用 | 检查虚拟机块设备引用 |
| Could not remove base image: Permission denied | 存储目录权限/上下文不匹配 | 检查libvirt-qemu用户读写权限 |
| Disk image is already in use by another domain | 快照盘被其他虚拟机挂载引用 | 查找占用快照的域ID |
| metadata integrity check failed | libvirt快照元数据损坏 | 重建虚拟机xml配置 |
KVM虚拟机快照删除故障分步排查操作
碰到删除失败,先定位错误码,再按对应方向排查,不需要盲试操作。
是否虚拟机运行中一定会导致快照删除失败?
答:不是所有运行中虚拟机都无法删快照,但绝大多数删除失败都是因为IO锁或进程占用。可通过lsof | grep [虚拟机存储路径]确认是否有qemu进程占用快照文件,若有占用,可停机虚拟机后再尝试删除,不需要强制卸载块设备。
碰到权限错误,先检查存储目录的用户权限,确认libvirt-qemu用户有读写权限。如果是自定义存储池,还要检查SELinux上下文,默认路径/var/lib/libvirt/images很少出现该问题,自定义挂载目录需要重新标记上下文。
如果是异常断电或之前的删除操作中断导致的故障,大概率是libvirt元数据损坏。这种情况不要直接手动删除快照磁盘文件,先通过virsh dumpxml [虚拟机名] > /tmp/backup.xml备份当前配置,再打开备份文件手动删除所有<snapshot>相关的节点,再执行virsh define /tmp/backup.xml重新导入配置,之后就能正常删除快照。
能否直接手动删除快照磁盘文件?
答:不建议直接删除,手动删除磁盘文件后,libvirt的元数据会残留无效引用,下次启动虚拟机可能会报找不到磁盘的错误,必须同步清理元数据才能避免后续故障。
KVM快照删除故障排查要点速览
- 优先检查进程对快照文件的占用,用
lsof或fuser命令可快速定位占用的qemu进程,关闭占用后再尝试删除。 - 删除时报权限错误时,先检查存储目录的用户权限,同时确认SELinux上下文是否匹配libvirt的运行要求,自定义存储池容易出现该问题。
- 在线删除快照会占用存储IO资源,高负载业务可能出现IO卡顿,核心业务建议在停机维护窗口操作。
- 元数据损坏导致删除失败时,先导出虚拟机当前配置,手动清理配置中残留的无效快照节点,重新定义配置后即可正常删除。
- 删除完成后一定要检查存储池的容量统计,确认残留的快照文件已经被清理,避免无效文件长期占用存储资源。