正确的方法来移动kvm vm

我想知道在两台KVM主机之间移动虚拟机的正确方式是什么, 而不使用任何共享存储

将磁盘文件和XML转储从源KVM机器复制到目标机器就足够了吗? 如果是这样的话,需要运行哪些命令来将vm导入到目的地?

操作系统是在Dom0和DomU上的Ubuntu。

提前致谢

    1. 将虚拟机的磁盘从src主机上的/ var / lib / libvirt / images复制到目标主机上的相同目录
    2. 在源主机上运行virsh dumpxml VMNAME > domxml.xml并将此xml复制到dest。 主办
    3. 在目标主机上运行virsh define domxml.xml

    启动虚拟机。

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

    由于我现在还不能评论,所以我必须以这种方式向dyasny的回答发表这个附录。

    如果虚拟机具有要保留的快照,则应该为VM的快照列表中的每个快照使用virsh snapshot-dumpxml $dom $name > file.xml将源快照xml文件转储到源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 virsh snapshot-delete --metadata $dom $name中删除它们


    资料来源:

    1. libvirt用户邮件列表

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

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

    一旦复制到目的地,必须重新加载或重新启动libvirtd来识别新的XML文件。

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

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

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

    先导

    • 您需要为您的用户“ssh”访问两台机器(源和目标)。
    • 您还需要在这两台机器上具有“sudo”权限才能访问“root”。

    • 或者,你可以做所有事情的根,但只有你的SSH密钥给你至less目标机器的根访问权限。 **在这种情况下,请从命令行中删除用户名。

    示例设置

    • 虚拟机位于称为chewie的dom0主机上
    • 目的地在dom0主机上被称为darth,在这里有一个内部IP地址10.10.10.38(在我们的例子中)
    • 在我们的实际情况中,我们在两台机器上都使用了centos 7作为dom0操作系统
    • 在这种情况下,我们正在移动的虚拟机称为LARRY
    • 用户做这个动作是USER(这将是你的名字)
    • DOM0表示实际的物理服务器

    程序

    源主机上的初始步骤

    • login到当前拥有本机的dom0主机(“源”主机),例如:
        ssh [email protected] 
    • 保持你的用户,所以不要成为sudo用户*列出机器
        sudo virsh --all 
    • 转储机器定义使用,例如:
        sudo virsh dumpxml larry> larry.xml 
    • 将转储的定义复制到新机器(“目标”主机),例如:

        scp -p larry.xml 10.10.10.38:larry.xml 

      你可以改变内部IP到你的目的地dom0服务器名称**注意:最好使用目标IP地址,例如:

        scp -p larry.xml [email protected]:larry.xml 

      如果你不能复制,由于钥匙猫larry.xml并复制它然后你可以ssh到其他机器,并创build文件并粘贴它。

    • 使用find虚拟机磁盘的大小和名称

        sudo lvs  - 单元B 


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

     LV VG Attr LSize池原点数据%元%移动日志Cpy%同步转换
       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 root root 8 Jan 31 13:57 / dev / vg1 / vm_larry – > ../dm-11

    目标主机上的初始步骤

    • login到目标主机,例如
        ssh [email protected] 
    • 保持你自己的用户。 即不要成为根。
    • 创build一个卷定义文件,例如:

        vi larry.domainname.com.au-vol.xml 

      要么

        nano larry.domainname.com.au-vol.xml 

      用以下几行:注意 – 你将需要从原始虚拟机中获取字节的大小,并放在下面的脚本中。 源机器上的大小命令是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 larry的69793218560 Bytes磁盘,根据实际VM的需要进行更改。

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

    使用定义创build新磁盘

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

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

    使磁盘设备文件可访问:

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

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

      vi larry.xml 

    在文件中查找磁盘定义(search“source dev =”),并用刚刚创build的设备(可以使用ls / dev / centos /查看虚拟机)replace设备,例如:/ dev / drbd4 – > / dev / CentOS的/ larry.domainname.com.au

    这个桥梁的变化对我们来说是独一无二的

    **在接口节中find任何对“br1”的引用,并将其更改为“br0”,例如,您正在更改源桥,所以行就像这样

    源主机上的最终步骤

    • login到源主机,例如

        ssh [email protected] 

    • 最好的做法是在执行最终同步之前closures源主机上的VM,但不需要完成。 (virshclosuresNameOfMachine)

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

    • 如果您的用户名是用户名(例如),则将两个机器中的blocksync.py脚本复制到/ home / user和chown user:user并chmod 755该脚本。

    • 如果尚未在目标主机上,请将其复制到此处,例如:
      scp -p blocksync.py [email protected]:blocksync.py 
    • 使用它将源磁盘复制到目标磁盘,例如

    执行复制的命令

      sudo -E python blocksync.py / dev / vg1 / vm_larry [email protected] /dev/mapper/centos-larry.domainname.com.au -b 4194304 

    注意:第一个设备名是针对源主机的,由'lvs'命令确定; 这个来自[[chewie]]源主机。

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

    注意:同步将需要很长时间 – 每GB约100秒,即:60 GB的磁盘需要90分钟。

    但是,您可以在VM正在使用时进行同步; 随后的同步速度可以高达25%

    该脚本将打印出它正在使用的参数(可能有一个关于已弃用模块的消息,这没关系)。 接下来,它显示它正在使用的ssh命令并运行它(当它这样做时,您将看到授权人员唯一的消息)。 在同步期间,它将显示复制的块的总数和平均速度。 最后,它打印出一个完成消息的秒数。

    事情要知道

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

    目标主机的最终步骤

    • login到目标主机,例如
        ssh [email protected] 
    • 创build虚拟机,例如:
        virsh定义larry.xml 
    • 启动新定义的机器,例如:
        sudo virsh开始larry 
    • 将其标记为在主机启动时启动,例如:
        sudo virsh autostart larry 

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