我想按照以下方式备份虚拟机的磁盘使用主动块提交进行实时磁盘备份Libvirt Wiki 上的程序。
我使用以下方法创建外部快照
virsh snapshot-create-as --domain vm_name snap_name \ --diskspec vda,file=snapshot_folder/snap.qcow2 \ --disk-only --atomic --quiesce
将基础磁盘复制到远程位置。
使用以下方式提交磁盘
virsh blockcommit vm_name vda --active --verbose --pivot
使用以下方法删除快照
virsh snapshot-delete vm_name --metadata snap_name
此过程似乎有效,但仅适用于具有单个磁盘的虚拟机。如果我尝试为具有两个磁盘的机器创建快照,则该过程会失败。例如:如果虚拟机有两个磁盘,vba
并且vdb
,并且我尝试运行与上述步骤 1 中所示的完全相同的命令,则命令返回
error: internal error: unable to execute QEMU command 'transaction': Could not create file: Permission denied
我尝试使用两个 --diskspec
参数,一个用于vda
,一个用于vdb
,但结果是一样的。
我怎样才能让它工作?
答案1
我遇到了完全相同的问题,我试图分享有关症状的更多信息。但我的贡献被版主删除了。无论如何,我已经找到了问题所在。Ubuntu 18.04 软件包中包含的 qemu-kvm 版本是 2.11,真的旧版本,显然无法以这种方式处理多个磁盘。我进行了擦除并重新加载到 20.04,其中包括 qemu-kvm 版本 4.2。症状不再存在。
答案2
到目前为止我发现的唯一解决方案是--diskspec
为每个磁盘创建一个,但不处理的磁盘必须包含snapshot=no
。
例子:
virsh snapshot-create-as --domain ${VM}
--name "backup-${VM}"
--atomic
--disk-only
--no-metadata
--diskspec vda,file=${SNAP}/backup-snapshot-${VM}
--diskspec vdb,snapshot=no
笔记:
${VM}
是虚拟机名称。
${SNAP}
是需要创建快照的目录。