删除“孤立的”libvirt 快照

Jér*_*ôme 14 snapshot kvm-virtualization virsh

我正在尝试按照此过程使用 KVM 进行实时快照。

我一定是在某个时候搞砸了,因为我处于一种我不明白的状态。

我的 VM 被称为prod. 它是在文件中创建的/srv/vm/prod.qcow2

显然,没有正在运行的快照:我正在处理基本文件。我可以猜测是因为文件的修改日期/srv/vm/prod.qcow2每分钟左右更改一次。此外,此命令确认:

# virsh domblklist prod
Target     Source
------------------------------------------------
vda        /srv/vm/prod.qcow2
Run Code Online (Sandbox Code Playgroud)

并且没有什么可以阻止提交:

# virsh blockcommit prod vda --active --pivot
error: invalid argument: top '/srv/vm/prod.qcow2' in chain for 'vda' has no backing file
Run Code Online (Sandbox Code Playgroud)

但是,libvirt 会跟踪旧快照:

# virsh snapshot-list prod
 Name                 Creation Time             State
------------------------------------------------------------
 snap                 2015-06-09 12:11:33 +0200 disk-snapshot
Run Code Online (Sandbox Code Playgroud)

它的描述符文件是/var/lib/libvirt/qemu/snapshot/prod/snap.xml

<domainsnapshot>
  <name>snap</name>
  <state>disk-snapshot</state>
  <creationTime>1433844693</creationTime>
  <memory snapshot='no'/>
  <disks>
    <disk name='vda' snapshot='external' type='file'>
      <driver type='qcow2'/>
      <source file='/srv/vm/snap.qcow2'/>
    </disk>
  </disks>
[...]
Run Code Online (Sandbox Code Playgroud)

源文件/srv/vm/snap.qcow2被删除。

考虑到我试图实现的方法,这个快照很可能是使用以下命令创建的:

virsh snapshot-create-as --domain prod snap --diskspec vda,file=/srv/vm/snap.qcow2 --disk-only --atomic
Run Code Online (Sandbox Code Playgroud)

我无法删除它:

# virsh snapshot-delete prod snap
error: Failed to delete snapshot snap
error: unsupported configuration: deletion of 1 external disk snapshots not supported yet
Run Code Online (Sandbox Code Playgroud)

所以我处于创建快照的状态,显然不再使用,并且无法删除。

有什么我可以做的吗?

我应该关心还是可以忽略它?

编辑

我刚刚删除了快照文件描述符。

# systemctl stop libvirt
# mv /var/lib/libvirt/qemu/snapshot/prod/snap.xml /home/jerome
# systemctl start libvirt
Run Code Online (Sandbox Code Playgroud)

我的 VM 再次启动,我再也看不到对快照的任何引用。

# virsh snapshot-list prod
 Name                 Creation Time             State
------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

virt-manager 中也没有。

我还好还是还有一些家务要做?

编辑 2

显然,传递-–no-metadatavirsh snapshot-create-as将通过不创建 .xml 文件来避免此问题,从而不保留快照的痕迹。

Jér*_*ôme 21

正确的方法是

virsh snapshot-delete prod --metadata snap
Run Code Online (Sandbox Code Playgroud)

(这个命令可以在 wiki上找到。我在问这里之前试过,但由于打字错误而失败,此后已更正。)

我不知道在 libvirtd 关闭时删除 .xml 文件没有涵盖它的作用。也许唯一的区别是不需要停止 libvirtd。即便如此,也许这会在未来发展。无论如何,建议使用 libvirt 的 API 而不是直接玩文件。

如果快照是使用--no-metadata参数创建的,则确实不需要此调用。

我在libvirt-users mailing-list 的这个线程中获得了这个澄清。

任何愿意通过实​​时快照进行备份的人都应该阅读上述 wiki 页面,并且可能对回答我的菜鸟问题的论坛主题感兴趣,并指向Eric Blake 的幻灯片,以及这篇博客文章和以下评论。

  • 很棒的线程老兄...感谢分享,让我不再头疼;) (2认同)