如何创建 KVM/libvirt/virt-manager VM 的复制品?

Syn*_*r0r 14 linux kvm libvirt

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

我有一个运行良好的 KVM VM (Windows XP)。

VM 由一个 4GB 左右的文件(一个.img)支持。

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

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

但随后 libvirt 常见问题解答以全部大写表示:“你不应该关心 XML 存储在哪里”

libvirt 常见问题

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

我想创建一个新的 VM,它是该 VM 的副本。

小智 44

最方便的就是:

# virt-clone --connect=qemu://example.com/system -o this-vm -n that-vm --auto-clone
Run Code Online (Sandbox Code Playgroud)

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

更重要的是,FAQ 说的是 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.
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"
Run Code Online (Sandbox Code Playgroud)


小智 5

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

  1. 确保现有 VM(要复制)已关闭。
  2. 对现有VM做一个“sudo virsh dumpxml <domid>”,并保存输出的xml文件。
  3. 修改<域>标签下的<名称>标签。
  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>



Bil*_*hor 4

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