如何将KVM guest虚拟机从主机迁移到另一个主机?

我有一个KVM客人,我需要从一个主机迁移到另一个。 迁移不需要太热。 其存储当前由LVM块设备支持,并带有桥接networking适配器。 两个服务器都有相同的内核,libvirt,qemu等版本。最简单的方法是什么?

我的猜测是:

dd the block devices from server A to server B export the xml VM definition on A, copy it to B edit the xml to refer to the new physical device names create the machine referencing that xml file 

你是对的。 我已经做了好几次了。 我使用netcat来通过networking映像驱动器。 这是我使用的方法:

  1. 在目标上创build逻辑卷。 它应该与源卷的大小相同。
  2. 运行nc -l 1234 | dd of=/dev/<vgname>/<lvname> nc -l 1234 | dd of=/dev/<vgname>/<lvname>主机上的nc -l 1234 | dd of=/dev/<vgname>/<lvname> 。 这告诉netcat侦听networking端口并将所有内容都传送到逻辑卷。
  3. 彻底closures源机器将所有内容写入磁盘。
  4. 运行dd if=/dev/<vgname>/<lvname> | nc <targetip> 1234 源主机上的dd if=/dev/<vgname>/<lvname> | nc <targetip> 1234 。 这告诉netcat将networking上的所有内容传送到目标主机。
  5. 去拿一杯咖啡。 这需要几分钟时间,具体取决于您的卷大小和networking速度。
  6. 将xml定义从/etc/libvirt/qemu/从源复制到目标。
  7. 编辑xml文件的存储部分以及其他必要的位(如networking桥名称),如果不同。
  8. 在目标上重新加载libvirt以读取xml。 一个/etc/init.d/libvirt-bin reload应该做的窍门(或systemctl restart libvirtd分发使用systemd)
  9. 在目标主机上启动机器。

KVM(自qemu 1.3开始)现在包含了存储迁移function,因此不再需要在旧的答案中显示任何hackery。 像往常一样迁移虚拟机,例如virsh migrate "Guest Name" qemu+ssh://dest-hypervisor/system或者点击您所选GUI中的漂亮button。

我遵循了一个有点类似的方法,因为我需要pipe理一个不安全的连接,并使用virsh:

  1. 使用ssh-copy id root@newserver在两台主机之间共享pubkey ssh-copy id root@newserver from“oldserver”
  2. 在taget上创build逻辑卷
  3. closures源
  4. 使用dd if=/dev/<vgname>/<lvname> | ssh root@targethost 'dd of=/dev/<vgname>/<lvname>'将卷传输到目标主机dd if=/dev/<vgname>/<lvname> | ssh root@targethost 'dd of=/dev/<vgname>/<lvname>' dd if=/dev/<vgname>/<lvname> | ssh root@targethost 'dd of=/dev/<vgname>/<lvname>'
  5. 转储xml定义virsh dumpxml <machinename> dump.xml
  6. 传输xml文件scp dump.xml root@targethost:/root/
  7. 用您select的编辑器编辑文件
  8. 定义目标机器virsh define dump.xml机器然后从xml创build。 不要使用virsh create machine ,那么在重新启动后必须重新定义机器。
  9. virsh start machinename

如果在新机器上没有与NAT的networking连接,请确保启用了ip-forwarding。

在Ubuntu nano /etc/sysctl.conf取消注释net.ipv4.ip_forward=1