快照元数据存于libvirt xml配置中,磁盘数据分内部(嵌入原镜像)和外部(独立文件);virsh与qemu-img视角不同导致显示不一致,需结合domblklist和info命令交叉验证。

快照到底存哪儿了?qemu-img 和 virsh 看法不一致怎么办
快照元数据和实际镜像数据是分开存的:元数据在 libvirt 的 XML 配置里(/var/lib/libvirt/qemu/snapshot/ 下),而磁盘数据可能嵌在原镜像中(内部快照),也可能另存为独立文件(外部快照)。用 virsh snapshot-list 看到的是 libvirt 记录的快照树,但 qemu-img info 只能识别 QEMU 自己认的内部快照链 —— 两者对不上很常见。
实操建议:
- 查快照归属:先用
virsh domblklist <vm-name></vm-name>确认磁盘设备路径,再对那个路径运行qemu-img info - 内部快照无法被
qemu-img snapshot -l列出?说明它没被 QEMU 正确写入镜像头,大概率是创建时 libvirt 没加--disk-only或用了不支持的格式(比如 raw) - 外部快照会生成新文件(如
vmname-snap1.qcow2),此时原镜像变成只读 backing file,qemu-img info能看到backing file字段,但virsh snapshot-list才知道它属于哪个快照节点
virsh snapshot-revert 失败:常见错误信息和绕过条件
最常卡在 Error: operation failed: cannot revert to snapshot: domain is running —— 这不是 bug,是 libvirt 默认策略:运行中虚拟机只能 revert 到内存快照(--memspec),普通磁盘快照必须关机才能还原。
实操建议:
- 想热恢复?创建快照时就得带
--memspec(例如virsh snapshot-create-as --memspec file=/tmp/vm.mem),否则运行时 revert 必报错 - 遇到
cannot revert: snapshot has children:说明你要还原的目标快照下面还有分支,得先删掉子快照(virsh snapshot-delete <vm><child-name></child-name></vm>)或强制删除整棵子树(加--children) - revert 后启动失败?检查是否误删了 backing file(尤其外部快照场景),
qemu-img check -r all <disk-path></disk-path>能快速验证镜像链完整性
快照太多导致性能暴跌:qcow2 链深度和 I/O 延迟的关系
qcow2 快照链每多一层,读一个扇区就要逐层回溯 backing file,5 层以上延迟就明显可感;写操作还要 copy-on-write,碎片化加剧。libvirt 不限制链长,但实际超过 3 层就该警惕。
实操建议:
- 用
qemu-img info --backing-chain <disk></disk>查当前链长,注意输出里backing file的嵌套层级 - 合并快照别用
virsh snapshot-delete --metadata:它只删元数据,不合并磁盘数据;真要扁平化,得用qemu-img commit(关机状态下)或virsh blockcommit(热合并,要求 qcow2 + 支持的 QEMU 版本) - commit 后记得
virsh snapshot-delete清理残留元数据,否则snapshot-list还显示已失效的节点
从宿主机直接操作快照文件,virsh 会“失联”吗
会。libvirt 把快照当黑盒管理,所有修改必须走 virsh snapshot-* 命令。手动改名、移动、rm 快照文件,会导致 virsh snapshot-list 显示异常(比如状态为 inconsistent),甚至 virsh start 报 failed to get domain's current snapshot。
实操建议:
- 备份快照前,先
virsh snapshot-dumpxml导出定义,再 cp 文件;恢复时用virsh snapshot-create --xmlfile重新注册 - 想清理 orphaned 快照?别直接删文件。先
virsh snapshot-delete --metadata,再确认qemu-img info输出里没有残留引用,最后才删物理文件 - 跨宿主机迁移含快照的 VM?用
virsh dumpxml+scp镜像文件 +virsh define,别漏掉/var/lib/libvirt/qemu/snapshot/<vm>/</vm>下的 XML 元数据目录
快照链的断裂往往发生在元数据和磁盘文件不同步的瞬间,而这种不同步几乎不会报错,只会等某次 revert 或启动时才暴露 —— 所以每次手动碰文件前,先看一眼 virsh snapshot-current 和 qemu-img info 是否指向同一逻辑状态。