无法在 20.10 中验证 KVM/QEMU 快照的 XML

无法在 20.10 中验证 KVM/QEMU 快照的 XML

当尝试使用拍摄 KVM 快照时virsh snapshot-create-as --domain vm --name vm-snap --disk-only --diskspec "sdc,snapshot=internal,file=/var/lib/libvirt/images/vm.qcow2,,new",我收到错误:

error: XML document failed to validate against schema: 
 Unable to validate doc against /usr/share/libvirt/schemas/domainsnapshot.rng  
Extra element disks in interleave  
Element domainsnapshot failed to validate content

尽管 XML 可以正常验证,visrh edit vm.xml但这里有些东西没有验证。

  • 操作系统:Ubuntu 20.10
  • qemu:1:5.0-5ubuntu9.1
  • libvirt:6.6.0-1ubuntu3.1

答案1

仅供参考:可以通过 --print-xml 查看 XML

$ virsh snapshot-create-as --domain h-test --name h-test-snap --diskspec "vda,snapshot=internal,file=/var/lib/uvtool/libvirt/images/h-test.qcow.snapshot" --print-xml
<domainsnapshot>
  <name>h-test-snap</name>
  <disks>
    <disk name='vda' snapshot='internal'>
      <source file='/var/lib/uvtool/libvirt/images/h-test.qcow.snapshot'/>
    </disk>
  </disks>
</domainsnapshot>

与其他版本比较

  • Hirsute + Focal + Bionic => 生成相同的 XML
  • Hirsute + Focal => 相同的验证错误
  • Bionic => 报告“不支持的配置”

问题在于“内部”意味着使用磁盘上的同一个文件,这与执行包括虚拟机状态在内的快照是互斥的。

通过查看一些旧的用法,我发现以下轻微的修改对我有用:

$ virsh snapshot-create-as --domain h-test --name h-test-snap --disk-only --diskspec vda,file=/var/lib/uvtool/libvirt/images/h-test.qcow.snapshot

您的案例没有指定,这意味着您也想保存客户机内存状态。但这在模式--disk-only下无法完成。internal

注意:我通常还会添加--atomic --quiesce

如果我们比较我建议的工作命令的 XML,它不再具有快照 = 内部。

<domainsnapshot>
  <name>h-test-snap</name>
  <disks>
    <disk name='vda'>
      <source file='/var/lib/uvtool/libvirt/images/h-test.qcow.snapshot'/>
    </disk>
  </disks>
</domainsnapshot>

因此,要解决您的问题,请切换到外部+仅磁盘模式(如上所述),或者如果您确实想要保存内存状态和磁盘,但同时需要控制文件(我认为仍然与内部模式互斥,但不确定)您可以使用它--memspec来让它知道将这些数据放在哪里。

那将是这样的:

$ virsh snapshot-create-as --domain h-test2 --name h-test-snap --diskspec vda,snapshot=external,file=/var/lib/uvtool/libvirt/images/h-test2.qcow.snapshot --memspec snapshot=external,file=/var/lib/uvtool/libvirt/images/h-test2.mem --print-xml
<domainsnapshot>
  <name>h-test-snap</name>
  <memory snapshot='external' file='/var/lib/uvtool/libvirt/images/h-test2.mem'/>
  <disks>
    <disk name='vda' snapshot='external'>
      <source file='/var/lib/uvtool/libvirt/images/h-test2.qcow.snapshot'/>
    </disk>
  </disks>
</domainsnapshot>

注意:后者仍然非常不常见,因此尚未完全支持 apparmor,因此无法及时为其添加规则。我提交了错误 1905674。在这种情况下,您需要为所有客人 ( /etc/apparmor.d/local/abstractions/libvirt-qemu) 或单个客人 ( /etc/apparmor.d/libvirt/libvirt-<uuid>)添加覆盖

注意:顺便说一下,为了进行更多修改/实验 - 您可以检查 XML 而不触发实际快照,例如:

$ virt-xml-validate snap.xml domainsnapshot
Relax-NG validity error : Extra element disks in interleave
snap.xml:3: element disks: Relax-NG validity error : Element domainsnapshot failed to validate content
snap.xml fails to validate

注意:请注意,如果您的客户机有多个磁盘,并且您想要手动添加磁盘规范,那么您需要为所有磁盘明确添加它。否则,无法创建 apparmor 规则,并且会失败并显示:“权限被拒绝”

注意:如果您想从备份中排除某些磁盘,手册页解释道:“要从外部快照中排除磁盘,请使用--diskspec,snapshot = no。”(不确定该上下文中的直通磁盘)

相关内容