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

Fır*_*ÇÜK 4 migration live-migration kvm-virtualization

我的来宾机器有 2 个分区(80GB + 1TB)。它们都在 LVM 上。我想以最短的停机时间将所有磁盘传输到另一台机器。我用nc转移了另一台机器。这需要 4 天,在转移期间我的 VM 关闭了。

我尝试在传输脏页后制作快照。但是 AFAIK 和 LVM 是不可能的。我的目标机器没有 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>
Run Code Online (Sandbox Code Playgroud)

源主机:

  • CPU:Intel(R) Xeon(R) CPU D-1520 @ 2.20GHz
  • 操作系统:16.04.1 LTS
  • 内核:4.2.0-34-generic
  • 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-generic
  • qemu-kvm: 1:2.5+dfsg-5ubuntu10.2
  • QEMU:2.5.0
  • 库虚拟:1.3.1

sho*_*hok 7

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

进行实时迁移 + 存储复制的命令是:

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

此命令假定您具有到远程主机的基于 libvirt 的有效连接。

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

无论如何,由于主机之间的差异,这可能是一条坎坷的道路。

迁移 VM 映像的一种更简单的方法是使用增量磁盘复制方法,使用blocksync. 简而言之:

  • 当 VM 运行时,将虚拟磁盘的第一个副本复制到目标主机。第一个副本不连贯且不可靠,但会作为下一个副本的“种子”;
  • 在适当的时候,关闭 VM 并执行虚拟磁盘的第二个副本。第二个副本将仅传输更改的块,并且比第一个要快得多;
  • 完成后,定义虚拟域并在目标主机上启动 VM。

请注意,链接的blocksync程序是基于此原始脚本的个人分叉版本(顺便说一下,它是此脚本的改进版本)。我显然不承担代码的责任,我强烈建议您在生产虚拟机/磁盘文件上使用它之前彻底测试它。与往常一样,在做任何事情之前,您必须有一个确认良好的备份。

编辑:正如下面评论中所建议的,另一个同步块设备/虚拟图像文件的好软件是bdsync. 方法基本相同:在 VM 运行时获取磁盘文件的第一个“种子”副本,然后停止 VM 并执行另一个最终副本。过去我什至问过bdsync开发人员一个类似的问题;请参阅此处了解更多信息