如何创建 KVM/libvirt/virt-manager 虚拟机的副本?

如何创建 KVM/libvirt/virt-manager 虚拟机的副本?

我对 virt-manager / libvirt / KVM 有点迷失。

我有一个运行良好的 KVM 虚拟机 (Windows XP)。

该虚拟机由大约 4GB 的文件支持(.img)。

现在我想做一些非常简单的事情:我想复制我的虚拟机。

我想“好的,没问题,让我们复制 4GB 文件并复制 XML”文件。

但是 libvirt FAQ 全部大写:“你不应该关心 XML 存储在哪里”

libvirt 常见问题解答

好吧,我不应该在意。但是我该如何复制我的虚拟机呢?

我想创建一个新的虚拟机,它是该虚拟机的副本。

答案1

最方便的就是:

# virt-clone --connect=qemu://example.com/system -o this-vm -n that-vm --auto-clone

它将制作 的副本this-vm,命名为that-vm,并负责复制存储设备。除了细节之外,这里没有什么新内容。

更重要的是,常见问题解答说的是 XML 域描述不能直接编辑,您需要转到通过libvirt。要完成该命令执行的步骤virt-clone,您可以:

source_vm=vm_name
new_vm=new_vm_name

# You cannot "clone" a running vm, stop it.  suspend and destroy
# are also valid options for less graceful cloning
virsh shutdown "$source_vm"

# copy the storage image.
cp /var/lib/libvirt/images/{"$source_vm","$new_vm"}.img

# dump the xml for the original
virsh dumpxml "$source_vm" > "/tmp/$new_vm.xml"

# hardware addresses need to be removed, libvirt will assign
# new addresses automatically
sed -i /uuid/d "/tmp/$new_vm.xml"
sed -i '/mac address/d' "/tmp/$new_vm.xml"

# and actually rename the vm: 
#(this also updates the storage path)
sed -i "s/$source_vm/$new_vm/" "/tmp/$new_vm.xml"

# finally, create the new vm
virsh define "/tmp/$new_vm.xml"
virsh start "$source_vm"
virsh start "$new_vm"

答案2

除了“virt-clone”之外,您还可以通过以下方式复制虚拟机:

  1. 确保现有虚拟机(要复制的)已关闭。
  2. 对现有 VM 执行“sudo virsh dumpxml < domid >”,并保存输出 xml 文件。
  3. 修改<domain>标签下的<name>标签。
  4. 使用“uuidgen”生成新的唯一ID,并使用它来修改现有的<uuid>标签。
  5. 复制 VM 使用的现有 qcow 虚拟映像(通常存储在 /var/lib/libvirt/images 中,但确保只需读取 XML 文件以获取确切位置)。命令为“sudo cp /var/lib/libvirt/images/xxx.qcow2 yyyy.qcow2”,并在XML文件中填写新文件yyyy.qcow2。
  6. 启动新虚拟机: sudo virsh Define new.xml
  7. 启动新的domid: sudo virsh start <new_domid>


答案3

virsh将允许您编辑、导出和导入服务器的 XML 定义。我将用来virt-clone生成克隆图像文件,并导出 XML。为了安全起见,我会从原始服务器中删除克隆配置。

答案4

以下命令对我有用(在运行命令之前必须关闭 VSA/Vm)

# virt-clone --connect=qemu:///system -o present_vsa/vm_name -n vsa/vm_to_be_cloned_name --auto-clone

相关内容