正确的方法来移动KVM VM


34

我想知道在不使用任何共享存储的情况下在两个KVM主机之间移动VM的正确方法是什么

将磁盘文件和XML转储从源KVM计算机复制到目标位置就足够了吗?如果是这样,需要运行哪些命令才能将VM导入到目标?

OS在Dom0和DomU上均为Ubuntu。

提前致谢

Answers:


41
  1. 将VM的磁盘从/var/lib/libvirt/imagessrc主机上复制到目标主机上的相同目录
  2. 在源主机上运行,virsh dumpxml VMNAME > domxml.xml然后将此xml复制到目标主机
  3. 在目标主机上运行 virsh define domxml.xml

启动虚拟机。

  • 如果磁盘位置不同,则需要编辑xml的设备/磁盘节点以指向目标主机上的映像。
  • 如果虚拟机已连接到自定义定义的网络,则需要从目标主机上的xml中编辑它们,或者也需要重新定义它们(virsh net-dumpxml > netxml.xmlvirsh net-define netxml.xml && virsh net-start NETNAME & virsh net-autostart NETNAME

以及如果使用逻辑卷而不是文件作为存储该怎么办...我想我会
遇到

2
您可以从XML删除该设备的UUID,刚刚离开的路径/dev/mapper/vgname-lvname
dyasny

10

由于无法发表评论,因此我必须以这种方式将这份附录发布到dyasny的答案中。

如果VM具有要保留的快照,则应将源中的快照xml文件转储virsh snapshot-dumpxml $dom $name > file.xml到VM的快照列表中,其中包含每个快照virsh snapshot-list --name $dom

然后在目标上使用virsh snapshot-create --redefine $dom file.xml来完成快照的迁移。

如果您还关心当前快照是哪个快照,则另外在源:
virsh snapshot-current --name $dom
和目标上执行:
virsh snapshot-current $dom $name

然后,您可以virsh snapshot-delete --metadata $dom $name为每个快照使用来删除源上的xml文件,也可以只从中删除它们。/var/lib/libvirt/qemu/snapshots/$guestname


资料来源:

  1. libvirt用户邮件列表

  2. http://kashyapc.com/2012/09/14/externaland-live-snapshots-with-libvirt/


无论如何,评论太久了,不用担心。感谢您的贡献
HBruijn 2014年

由于您有权发表评论,因此被推荐:-)
匿名,

3

是的,仅复制XML文件和虚拟磁盘映像就足够了,但这显然排除了“实时”迁移。在此过程中必须关闭VM。

复制到目标位置后,libvirtd必须重新加载或重新启动以识别新的XML文件。


根据help.ubuntu.com/community/KVM/Virsh并完成一个答案,我相信命令的顺序将是:在源Dom0上:-virsh shutdown foo-virsh dumpxml foo> /tmp/foo.xml然后在目标Dom0:-复制磁盘文件,并将其与源Dom0放在同一目录中-复制XML转储-virsh创建/tmp/foo.xml-virsh启动foo
Onitlikesonic,2012年

如果使用,则足够合理virsh。我只是直接复制文件并重新加载libvirtd
迈克尔·汉普顿

2

有关使用blocksync.py复制VM的详细说明

这些说明适用于使用LVM提供的磁盘的VM,并假定Python位于每个主机上

https://gist.github.com/rcoup/1338263下载blocksync.py脚本,并将其放在/ home / user文件夹中的源主机和目标主机上。

前体

  • 您将需要对用户的计算机(源和目标)都具有“ ssh”访问权限。
  • 您还需要在两台计算机上都具有“ sudo”访问“ root”权限。

  • 或者,您可以以root用户身份执行所有操作,但前提是您的ssh密钥可以让您至少对目标计算机具有root用户访问权限。**在这种情况下,请从命令行中删除用户名。

范例设定

  • 虚拟机位于称为chewie的dom0主机上
  • 在称为darth的dom0主机上所需的目的地,在这里具有内部IP 10.10.10.38(对于我们的示例)
  • 在实际情况下,我们在两台计算机上都使用centos 7作为dom0操作系统
  • 在这种情况下,我们要移动的虚拟机称为LARRY
  • 执行操作的用户是USER(将是您的名字)
  • DOM0表示实际的物理服务器

程序

源主机上的初始步骤

  • 登录到当前拥有计算机的dom0主机(“源”主机),例如:
    ssh user@chewie.domainname.com.au
  • 保持用户身份,所以不要成为sudo用户*列出具有以下内容的计算机
    sudo virsh --all
  • 使用以下方法转储机器定义:
    sudo virsh dumpxml拉里> larry.xml
  • 将转储的定义复制到新计算机(“目标”主机),例如:

    scp -p larry.xml 10.10.10.38:larry.xml
    您可以将内部ip更改为目标dom0服务器名称**注意:最好使用目标的ip地址,例如:
    scp -p larry.xml user@10.10.10.38:larry.xml

    如果由于键而无法复制,则将cat larry.xml进行复制,然后可以将其SSH到其他计算机中并创建文件并将其粘贴。

  • 使用以下命令找到虚拟机磁盘的大小和名称

    sudo lvs --units B

    **上面的命令应完全以字节为单位显示大小。**机器的磁盘名称在列表的第一列中,其卷组在第二列中,大小在最后一列中。**将设备名称确定为/ dev // **使用'll'命令进行检查例如,在以下输出中:vm_larry vg1 -wi-ao ---- 69793218560B

LV VG Attr LSize池原始数据%Meta%移动日志Cpy%Sync转换
  lv_root vg1 -wi-ao ---- 53687091200B
  lv_swap vg1 -wi-ao ---- 17179869184B
  vm_vsrv1 vg1 -wi-ao ---- 193273528320B
  vm_vsrv10 vg1 -wi-ao ---- 64424509440B
  vm_vsrv11 vg1 -wi-ao ---- 161061273600B
  vm_vsrv12 vg1 -wi-ao ---- 204010946560B
  vm_vsrv2 vg1 -wi-ao ---- 140110725120B
  vm_vsrv3 vg1 -wi-ao ---- 128849018880B
  vm_larry vg1 -wi-ao ---- 69793218560B
  vm_vsrv5 vg1 -wi-ao ---- 257698037760B
  vm_vsrv6 vg1 -wi-ao ---- 64424509440B
  vm_vsrv7 vg1 -wi-ao ---- 161061273600B
  vm_vsrv8 vg1 -wi-ao ---- 64424509440B
  vm_vsrv9 vg1 -wi-ao ---- 214748364800B

  • 磁盘名称为“ vm_larry”,卷组为“ vg1”。
  • 设备名称为/ dev / vg1 / vm_larry
  • 输出例如:
    ls -l / dev / vg1 / vm_larry
    是:lrwxrwxrwx。1根根8 Jan 31 13:57 / dev / vg1 / vm_larry-> ../dm-11

目标主机上的初始步骤

  • 登录到目标主机,例如
    ssh user@darth.domainname.com.au
  • 保持自己的用户身份。即不要成为根。
  • 创建一个卷定义文件,例如:

    vi larry.domainname.com.au-vol.xml
    要么
    纳米larry.domainname.com.au-vol.xml
    并带有以下几行:注意-您将需要从原始VM中获取字节大小,并放入以下脚本中。源计算机上用于大小的命令是sudo lvs --units B

    <volume type='block'>
       <name>larry.domainname.com.au</name>
       <capacity unit='bytes'>69793218560</capacity>
       <allocation unit='bytes'>69793218560</allocation>
      <target>
       <path>/dev/centos/larry.domainname.com.au</path>
       <permissions>
         <mode>0600</mode>
         <owner>0</owner>
         <group>6</group>
       <label>system_u:object_r:fixed_disk_device_t:s0</label>
      </permissions>
     </target>
    </volume>
    

注意:此定义适用于用于VM拉力的69793218560 Bytes磁盘,请根据实际VM的需要进行更改。

注意:名称和路径的最后一部分应匹配,并将用作新磁盘名称。

使用以下命令从定义中创建新磁盘

   sudo virsh vol-create --pool centos larry.domainname.com.au-vol.xml

它会说从larry.domainname.com.au-vol.xml创建的Vol larry.domainname.com.au

使磁盘设备文件可访问:

sudo chgrp wheel /dev/mapper/centos-larry.domainname.com.au
须藤chmod g + rw /dev/mapper/centos-larry.domainname.com.au

编辑复制的xml定义,例如:

vi larry.xml

在文件中找到磁盘定义(搜索“ source dev =“),然后将设备替换为刚创建的设备(您可以通过/ dev / centos /查看vm),例如:/ dev / drbd4-> / dev / centos / larry.domainname.com.au

这种桥梁的变化是我们情况的独特之处。

**在接口节中找到对“ br1”的任何引用,并将其更改为“ br0”,例如,您正在更改源网桥,因此行是这样的

源主机上的最终步骤

  • 登录到源主机,例如

    ssh user@chewie.domainname.com.au

  • 最佳实践是在完成最终同步之前关闭源主机上的VM,但不需要这样做。(关闭虚拟机NameOfMachine)

  • 如果尚未在源主机上,请从https://gist.github.com/rcoup/1338263下载blocksync.py脚本

  • 例如,如果您的用户名是user,则将blocksync.py脚本复制到两台计算机上,分别复制到/ home / user和chown user:user和chmod 755脚本中。

  • 如果尚未在目标主机上,请将其复制到该主机上,例如:
scp -p blocksync.py用户@ 10.10.10.38:blocksync.py
  • 使用它可以将源磁盘复制到目标磁盘,例如

执行复制的命令

sudo -E python blocksync.py / dev / vg1 / vm_larry user@10.10.10.38 /dev/mapper/centos-larry.domainname.com.au -b 4194304

注意:第一个设备名称是源主机的名称,由“ lvs”命令确定;这是[[chewie]]源主机的。

注意:这将破坏目标磁盘的内容,请确保/dev/mapper/centos-larry.domainname.com.au正确!

注意:同步将花费很长时间-每千兆字节大约100秒,即:60 GB磁盘90分钟。

但是,您可以在使用VM时进行同步。后续同步速度最高可提高25%

该脚本将打印出它正在使用的参数(可能会出现有关已弃用模块的消息,可以)。接下来,它显示它正在使用的ssh命令并运行它(执行此操作时,您将看到仅授权人员消息)。在同步期间,它将显示正在运行的块总数及其平均速度。最后,它会打印出完成消息以及所花费的秒数。

须知

您可以使用CTRL C取消同步,然后稍后再次运行命令重新启动同步

目标主机上的最终步骤

  • 登录到目标主机,例如
     ssh user@darth.domainname.com.au
  • 创建虚拟机,例如:
    virsh定义larry.xml
  • 启动新定义的机器,例如:
    须藤维尔什开始拉里
  • 标记它以启动主机启动,例如:
    sudo virsh autostart拉里

注意:可能有必要更改VM的详细信息以适应新环境。


我没有尝试过,但是您对我提供的详细说明表示赞同。当需要这样做时,我很可能会尝试一下。
G Trawo

1

我在几台较旧的KVM服务器上遇到了此问题,但发生时确实很烦人,并且可能导致任何已安装的VM出现问题。以我为例,由于磁盘空间缓慢耗尽,它经常将我的其中一个VM推入复位状态。以下说明对KVM / Distro版本有些敏感。就我而言,我有CentOS 7.5

CentOS Linux release 7.5.1804 (Core) and Qemu-KVM version 1.5.3

默认情况下,KVM映像位于/ var / lib / libvirt / images /

您需要找到VM的名称,为此使用virsh列表

virsh list
 Id    Name                           State
----------------------------------------------------
 12    VM-Name                        paused

停止VM virsh停止VM名称

对我来说,我首先复制文件,而不是移动文件。将qcow文件复制到新位置

cp /var/lib/libvirt/images/VM-Name.qcow2 /home/VMImages/

编辑VM xml文件,以引用新的“源文件”位置virsh编辑VM名称

您将需要更改“源文件”此文件

重新启动libvirtd服务

service libvirtd restart

然后重新启动VM,您应该一切顺利。

virsh start VM-Name
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.