我有一个 KVM 客户机,需要将其从一台主机迁移到另一台主机。迁移不需要热完成。其存储目前由 LVM 块设备支持,并带有桥接网络适配器。两台服务器具有相同的内核、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
答案1
你说得对。我已经这样做过好几次了。我用过网猫通过网络对驱动器进行映像处理。这是我使用的方法:
- 在目标上创建逻辑卷。其大小应与源卷相同。
nc -l 1234 | dd of=/dev/<vgname>/<lvname>
在目标主机上运行。这告诉网猫监听网络端口并将所有内容传输到逻辑卷。- 彻底关闭源机器以将所有内容写入磁盘。
dd if=/dev/<vgname>/<lvname> | nc <targetip> 1234
在源主机上运行。这告诉网猫通过网络将所有内容传输到目标主机。- 去喝杯咖啡。这需要几分钟,具体取决于您的卷大小和网络速度。
- 将 xml 定义从
/etc/libvirt/qemu/
源复制到目标。 - 编辑贮存xml 文件的部分以及任何其他必要的位,例如网络桥名称(如果它们不同)。
- 在目标上重新加载 libvirt 以读取 xml。应该
/etc/init.d/libvirt-bin reload
可以解决问题(或systemctl restart libvirtd
对于使用 systemd 的发行版) - 在目标主机上启动机器。
答案2
KVM(自 qemu 1.3 起)现在包含存储迁移功能,因此不再需要执行旧答案中显示的任何黑客行为。只需像平常一样迁移 VM,例如,virsh migrate "Guest Name" qemu+ssh://dest-hypervisor/system
或者单击您选择的 GUI 中的按钮。
答案3
我采用了类似的方法,但在细节上有所不同,因为我需要通过不安全的连接来传输机器,并使用了 virsh:
- 在两个主机之间与
ssh-copy id root@newserver
来自“oldserver”的公钥共享 - 在目标上创建逻辑卷
- 关机源
- 使用管道将卷传输到目标主机
dd if=/dev/<vgname>/<lvname> | ssh root@targethost 'dd of=/dev/<vgname>/<lvname>'
- 转储 xml 定义
virsh dumpxml <machinename> dump.xml
- 传输 xml 文件
scp dump.xml root@targethost:/root/
- 使用您选择的编辑器编辑文件
- 在目标上定义机器,
virsh define dump.xml
然后根据 xml 创建机器。请勿使用virsh create machine
,否则必须在重启后重新定义机器。 virsh start machinename
如果新机器上没有带有 NAT 的互联网连接,请确保已启用 IP 转发。
在 Ubuntu 上nano /etc/sysctl.conf
取消注释net.ipv4.ip_forward=1