Linux 虚拟机快照管理与恢复

1次阅读

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

Linux 虚拟机快照管理与恢复

快照到底存哪儿了?qemu-imgvirsh 看法不一致怎么办

快照元数据和实际镜像数据是分开存的:元数据在 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 startfailed 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-currentqemu-img info 是否指向同一逻辑状态。

text=ZqhQzanResources