当尝试使用拍摄 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。”(不确定该上下文中的直通磁盘)