我对 virt-manager / libvirt / KVM 有点迷失。
我有一个运行良好的 KVM 虚拟机 (Windows XP)。
该虚拟机由大约 4GB 的文件支持(.img)。
现在我想做一些非常简单的事情:我想复制我的虚拟机。
我想“好的,没问题,让我们复制 4GB 文件并复制 XML”文件。
但是 libvirt FAQ 全部大写:“你不应该关心 XML 存储在哪里”
好吧,我不应该在意。但是我该如何复制我的虚拟机呢?
我想创建一个新的虚拟机,它是该虚拟机的副本。
答案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”之外,您还可以通过以下方式复制虚拟机:
- 确保现有虚拟机(要复制的)已关闭。
- 对现有 VM 执行“sudo virsh dumpxml < domid >”,并保存输出 xml 文件。
- 修改<domain>标签下的<name>标签。
- 使用“uuidgen”生成新的唯一ID,并使用它来修改现有的<uuid>标签。
- 复制 VM 使用的现有 qcow 虚拟映像(通常存储在 /var/lib/libvirt/images 中,但确保只需读取 XML 文件以获取确切位置)。命令为“sudo cp /var/lib/libvirt/images/xxx.qcow2 yyyy.qcow2”,并在XML文件中填写新文件yyyy.qcow2。
- 启动新虚拟机: sudo virsh Define new.xml
- 启动新的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