virsh snapshot-revert 必须在虚拟机关机且目标快照无子快照时执行;否则报错“domain is running”或“cannot revert to snapshot with children”,需先用 virsh domstate 和 virsh snapshot-list --tree 确认状态与快照树结构。

必须先关机,再执行 virsh snapshot-revert,否则 90% 的失败都卡在这一步。
virsh snapshot-revert 执行前必须满足的两个硬性条件
还原快照不是“点一下就回滚”,virsh snapshot-revert 会直接拒绝执行,除非同时满足:
-
虚拟机当前状态为
shut off(非 running、nonexistent 或 paused);可用virsh domstate vmname确认 - 目标快照在快照树中不能有子快照(即“下方不能有孩子”);用
virsh snapshot-list --tree vmname查看结构
常见错误信息:error: domain is running 或 cannot revert to snapshot with children。别硬试,先处理状态和依赖。
如何安全地删掉子快照以解锁还原
如果你要还原的快照 snap-20260618 下面还有 snap-20260701,直接 virsh snapshot-revert 必报错。此时有两个选择:
- 只删子快照:
virsh snapshot-delete vmname snap-20260701(保留父快照元数据) - 连根删整条分支(慎用):
virsh snapshot-delete vmname snap-20260618 --children,这会把snap-20260618和它所有后代一起删掉
注意:--children 不影响磁盘文件本身,只清理 libvirt 的快照元数据。若用的是外部快照(--disk-only),删完后还需手动 rm 对应的 .qcow2 文件。
disk-only 外部快照能否热还原?要看内核和 QEMU 版本
理论上支持运行中还原,但实际生效需同时满足:
- 快照创建时用了
--disk-only和--atomic - 宿主机内核 ≥ 5.10,QEMU ≥ 6.2(银河麒麟 V10SP3 ARM 环境实测需 ≥ 6.2.0)
- 虚拟机 XML 中磁盘配置启用了
cache='none'或cache='directsync',且不带copy_on_read='on'
即使满足全部条件,virsh snapshot-revert --running 仍可能 fallback 到静默关机再还原——这不是 bug,是 libvirt 的安全降级策略。别依赖热还原,把它当可选优化项,不是默认路径。
还原后启动失败?检查磁盘链是否断裂
特别是外部快照场景,还原后 virsh start 报 cannot open disk image,大概率是磁盘 backing chain 断了:
- 确认原始镜像(如
/var/lib/libvirt/images/vm.qcow2)没被误删或权限异常 - 用
qemu-img info /path/to/snap.qcow2检查backing file字段是否指向正确路径 - 若路径是相对路径(如
vm.qcow2),而当前工作目录不对,qemu-img就找不到父镜像
最稳妥的做法:所有外部快照的 --diskspec 都用绝对路径,并在 virsh dumpxml 中核对 <source file="..."></source> 是否一致。这点容易被忽略,但一出问题就全盘不可启动。











