如果您在两台服务器之间没有共享存储(因此您无法进行标准迁移),那么将虚拟机从一台服务器克隆到另一台服务器的最简单/最快捷的方法是什么?
我在一台服务器上安装了一个生产就绪的 VM,我想将它克隆到另一个系统上。我在两台主机之间没有共享存储,但我已经在两台主机之间复制了磁盘映像并为其添加了一个配置(virsh 定义了它)。当我尝试启动它时,它不需要:
# virsh create /etc/libvirt/qemu/cloned-vm.xml
error: Failed to create domain from /etc/libvirt/qemu/cloned-vm.xml
error: Unable to read from monitor: Connection reset by peer
我在 RHEL6 上使用 KVM。这是重复的配置
<!-- WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE OVERWRITTEN AND LOST. Changes to this xml configuration should be made using: virsh edit or other application using the libvirt API. --> <domain type='kvm'> <name>cloned-vm</name> <uuid>NEW_UUID_HERE</uuid> <memory>15360000</memory> <currentMemory>15360000</currentMemory> <vcpu>7</vcpu> <os> <type arch='x86_64' machine='rhel6.2.0'>hvm</type> <boot dev='hd'/> </os> <features> <acpi/> <apic/> <pae/> </features> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>restart</on_crash> <devices> <emulator>/usr/libexec/qemu-kvm</emulator> <disk type='file' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source file='/local/vm/cloned-vm.img'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </disk> <interface type='bridge'> <mac address='NE:W_:MA:C_:AD:DR'/> <source bridge='br2'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface> <serial type='pty'> <target port='0'/> </serial> <console type='pty'> <target type='serial' port='0'/> </console> <input type='tablet' bus='usb'/> <input type='mouse' bus='ps2'/> <graphics type='vnc' port='-1' autoport='yes'/> <video> <model type='cirrus' vram='9216' heads='1'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> </video> <memballoon model='virtio'> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </memballoon> </devices> </domain>
这是我所做的,其中 $VM 是 VM 名称,DEST 是目标管理程序主机名。它使用 dd 和快照 LVM 磁盘在正在运行的 VM 上执行此操作(假设 LVM 组称为 HypGroup00)。
我只是把它放在一起,所以它不一定是最漂亮的,但它完成了工作,我用它把一些虚拟机从 CentOS 5.9 管理程序迁移到 CentOS 6,停机时间最短。
这是针对 CentOS 5.9 的,测试了将 CentOS 5 和 6 作为目的地。
找出要复制的磁盘,因为我们的大多数 VM 磁盘都是通过 /dev/mapper/ 路径而不是 /dev/volgroup/volname 路径引用的。所以我们需要在两者之间进行转换。
复制 VM 定义并注册它
现在在远程服务器上创建 LV
现在创建快照 LV 并开始复制数据
复制磁盘
上面的一个更复杂的版本,如果需要从 dd 显示进度,由于 /tmp/pid 的原因不适合多个副本,但如果您愿意,可以更改为包含 $$。
清理
好吧,我这样做的方式实际上工作得很好。问题只是我没有足够的资源来运行该虚拟机。所以只是回答我自己的问题...这里是我如何在没有共享磁盘的情况下跨不同服务器进行 VM 复制的详细信息。
因为您没有共享磁盘,所以您不能进行典型的“克隆”然后“迁移”。相反,你做一个典型的克隆
这是执行克隆的命令(/local/vm/是您的 VM 映像的路径,通常是/var/something/):
virt-clone --original=vm-to-clone --name=cloned-vm -f /local/vm/cloned-vm.img --mac=xx:xx:xx:xx:xx:xx
现在将该 img 文件从一台服务器复制到另一台服务器......我的服务器不能直接相互通信,所以我使用这个小的 SSH 重定向来完成这个技巧:
ssh -n server1 '(cd /local/vm/; cat cloned-vm.img)' | ssh server2 '(cd /local/vm/; cat > cloned-vm.img)'
然后复制该虚拟机的配置:
ssh -n server1 '(cd /etc/libvirt/qemu/; cat cloned-vm.xml)' | ssh server2 '(cd /etc/libvirt/qemu/; cat > cloned-vm.xml)'
使用任何新更改更新配置。在我的例子中(这就是导致我出现问题的原因),我需要降低“内存”和“currentMemory”属性。
将新 VM 添加到 libvirt:
virsh 定义 /etc/libvirt/qemu/cloned-vm.xml
运行:
virsh 创建 /etc/libvirt/qemu/cloned-vm.xml