KVM Live或近乎实时从LVM迁移到文件系统后端

我的访客机器有2个分区(80GB + 1TB)。 他们都在LVM上。 我想以最less的停机时间将所有磁盘传输到另一台计算机。 我用nc转了另一台机器。 这需要4天,在转移过程中,我的虚拟机closures了。

我试图在传输脏页之后创build快照。 但是用LVM AFAIK不可能。 我的目标机器没有LVM设置和空闲的未分区空间。 所以在目标机器上的磁盘必须是原始的文件映像。

<disk type='block' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source dev='/dev/vg-datastore/lv-vm-1138'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </disk> <disk type='block' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source dev='/dev/vg-datastore-sata/lv-vm-1138-2'/> <target dev='vdb' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> </disk> 

源主机:

  • CPU:Intel(R)Xeon(R)CPU D-1520 @ 2.20GHz
  • 操作系统:16.04.1 LTS
  • 内核:4.2.0-34-通用
  • qemu-kvm:1:2.3 + dfsg-5ubuntu9.2
  • QEMU:2.3.0
  • libvirt:1.2.16

目标主机:

  • CPU:Intel(R)Xeon(R)CPU D-1520 @ 2.20GHz
  • 操作系统:16.04 LTS
  • 内核:4.4.0-28-通用
  • qemu-kvm:1:2.5 + dfsg-5ubuntu10.2
  • QEMU:2.5.0
  • libvirt:1.3.1

KVM / libvirt通过存储迁移(无共享设置)支持虚拟机实时迁移,尽pipe存在一些限制。 您的主要问题是存储池具有不同的configuration,所以我不确定libvirt是否会毫无问题地迁移VM映像。

执行实时迁移+存储副本的命令是:

  virsh migrate --live --copy-storage-all --persistent qemu + ssh:// root @ / system 

这个命令假设你有一个到远程主机的有效的基于libvirt的连接。

如果在迁移虚拟磁盘时遇到问题,可尝试创build存根目标虚拟磁盘文件,并执行(在目标主机上)类似于fallocate /dev/vg-datastore/lv-vm-1138 -l 80G/dev/vg-datastore-sata/lv-vm-1138-2 -l 1T

无论如何,由于主机之间的差异,这可能是一个颠簸的道路。

迁移虚拟机映像的更简单的方法是使用增量磁盘复制方法,使用blocksync 。 简而言之:

  • 当VM运行时,将虚拟磁盘的第一个副本执行到目标主机。 这第一个副本是不连贯和不可靠的,但将作为下一个副本的“种子”。
  • 在适当的时候closures虚拟机并执行虚拟磁盘的第二个副本 。 这第二个副本将只传输更改的块,它将比第一个更快;
  • 完成后,定义虚拟域并在目标主机上启动虚拟机。

请注意,链接的blocksync程序是基于这个原始脚本的私人分支版本(顺便说一句,这是该脚本的改进版本)。 我明显地承担了代码没有责任 ,我强烈build议您在生产虚拟机/磁盘文件上使用它之前彻底testing它 。 与往常一样,在做任何事情之前,你必须有一个确认好的备份。

编辑:如下面的评论build议,另一个伟大的软件来同步块设备/虚拟镜像文件是bdsync 。 这个方法基本上是一样的:在虚拟机运行的时候,首先获取磁盘文件的“种子”副本,然后停止虚拟机并做最后的拷贝。 以前我甚至向bdsync开发者提过一个类似的问题, 在这里看到更多的信息 。