AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 399835
Accepted
Andrew Case
Andrew Case
Asked: 2012-06-19 08:28:59 +0800 CST2012-06-19 08:28:59 +0800 CST 2012-06-19 08:28:59 +0800 CST

将 kvm/qemu VM 克隆到不同的服务器

  • 772

如果您在两台服务器之间没有共享存储(因此您无法进行标准迁移),那么将虚拟机从一台服务器克隆到另一台服务器的最简单/最快捷的方法是什么?

我在一台服务器上安装了一个生产就绪的 VM,我想将它克隆到另一个系统上。我在两台主机之间没有共享存储,但我已经在两台主机之间复制了磁盘映像并为其添加了一个配置(virsh 定义了它)。当我尝试启动它时,它不需要:

# virsh create /etc/libvirt/qemu/cloned-vm.xml 
error: Failed to create domain from /etc/libvirt/qemu/cloned-vm.xml
error: Unable to read from monitor: Connection reset by peer

我在 RHEL6 上使用 KVM。这是重复的配置

<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE 
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
  virsh edit 
or other application using the libvirt API.
-->

<domain type='kvm'>
  <name>cloned-vm</name>
  <uuid>NEW_UUID_HERE</uuid>
  <memory>15360000</memory>
  <currentMemory>15360000</currentMemory>
  <vcpu>7</vcpu>
  <os>
    <type arch='x86_64' machine='rhel6.2.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw' cache='none'/>
      <source file='/local/vm/cloned-vm.img'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </disk>
    <interface type='bridge'>
      <mac address='NE:W_:MA:C_:AD:DR'/>
      <source bridge='br2'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='tablet' bus='usb'/>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes'/>
    <video>
      <model type='cirrus' vram='9216' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </memballoon>
  </devices>
</domain>
virtualization redhat kvm-virtualization rhel6
  • 2 2 个回答
  • 26301 Views

2 个回答

  • Voted
  1. Edward Groenendaal
    2013-07-30T22:16:13+08:002013-07-30T22:16:13+08:00

    这是我所做的,其中 $VM 是 VM 名称,DEST 是目标管理程序主机名。它使用 dd 和快照 LVM 磁盘在正在运行的 VM 上执行此操作(假设 LVM 组称为 HypGroup00)。

    我只是把它放在一起,所以它不一定是最漂亮的,但它完成了工作,我用它把一些虚拟机从 CentOS 5.9 管理程序迁移到 CentOS 6,停机时间最短。

    这是针对 CentOS 5.9 的,测试了将 CentOS 5 和 6 作为目的地。

    VM=webserver
    DEST=hyp5
    

    找出要复制的磁盘,因为我们的大多数 VM 磁盘都是通过 /dev/mapper/ 路径而不是 /dev/volgroup/volname 路径引用的。所以我们需要在两者之间进行转换。

    DISKS=`cat /etc/libvirt/qemu/$VM.xml |  grep HypGroup00 | sed "s|.*/\(HypGroup00-.*\)'/>|\1|"`
    
    LVS=""
    
    for disk in $DISKS; do
      echo VM Disk $disk
      LV=`lvdisplay /dev/mapper/$disk | grep "LV Name" | awk '{print $3}'`
      LVS="$LVS $LV"
    done
    

    复制 VM 定义并注册它

    virsh dumpxml $VM > /tmp/$VM.xml
    scp /tmp/$VM.xml $DEST:/tmp/
    ssh $DEST virsh undefine $VM > /dev/null 2>&1
    ssh $DEST virsh define /tmp/$VM.xml
    

    现在在远程服务器上创建 LV

    for lv in $LVS; do
      ssh $DEST lvremove --force $lv
      SIZE=`lvdisplay $lv | grep "LV Size" | awk '{print $3}'`
      SHORTNAME=`basename $lv`
      ssh $DEST lvcreate -L"$SIZE"G -n$SHORTNAME HypGroup00
    done
    

    现在创建快照 LV 并开始复制数据

    virsh suspend $VM
    for lv in $LVS; do
      lvcreate -L10G -s -n $lv-snapshot $lv
    done
    virsh resume $VM
    

    复制磁盘

    for lv in $LVS; do
      echo Copying LV $lv, this will take a while...
      time dd bs=1M if=$lv-snapshot | gzip --fast | ssh $DEST "gzip -d | dd of=$lv"
    done
    

    上面的一个更复杂的版本,如果需要从 dd 显示进度,由于 /tmp/pid 的原因不适合多个副本,但如果您愿意,可以更改为包含 $$。

    (dd bs=1M if=$lv-snapshot & echo $! >&3 ) 3>/tmp/pid  2> >(grep 'copied' 1>&2) | ssh $DEST "dd bs=1M of=$lv" &
    # Need this sleep to give the above time to run
    sleep 1
    PID=$(</tmp/pid)
    
    while kill -0 $PID; do
      kill -USR1 $PID
      sleep 5
    done
    

    清理

    for lv in $LVS; do
      lvremove --force $lv-snapshot
    done
    
    • 7
  2. Best Answer
    Andrew Case
    2012-06-19T09:43:36+08:002012-06-19T09:43:36+08:00

    好吧,我这样做的方式实际上工作得很好。问题只是我没有足够的资源来运行该虚拟机。所以只是回答我自己的问题...这里是我如何在没有共享磁盘的情况下跨不同服务器进行 VM 复制的详细信息。

    因为您没有共享磁盘,所以您不能进行典型的“克隆”然后“迁移”。相反,你做一个典型的克隆

    1. 这是执行克隆的命令(/local/vm/是您的 VM 映像的路径,通常是/var/something/):

      virt-clone --original=vm-to-clone --name=cloned-vm -f /local/vm/cloned-vm.img --mac=xx:xx:xx:xx:xx:xx

    2. 现在将该 img 文件从一台服务器复制到另一台服务器......我的服务器不能直接相互通信,所以我使用这个小的 SSH 重定向来完成这个技巧:

      ssh -n server1 '(cd /local/vm/; cat cloned-vm.img)' | ssh server2 '(cd /local/vm/; cat > cloned-vm.img)'

    3. 然后复制该虚拟机的配置:

      ssh -n server1 '(cd /etc/libvirt/qemu/; cat cloned-vm.xml)' | ssh server2 '(cd /etc/libvirt/qemu/; cat > cloned-vm.xml)'

    4. 使用任何新更改更新配置。在我的例子中(这就是导致我出现问题的原因),我需要降低“内存”和“currentMemory”属性。

    5. 将新 VM 添加到 libvirt:

      virsh 定义 /etc/libvirt/qemu/cloned-vm.xml

    6. 运行:

      virsh 创建 /etc/libvirt/qemu/cloned-vm.xml

    • 5

相关问题

  • 哪些 939 插槽芯片支持 AMD-V?

  • Windows Server 2008 Hyper-V 虚拟化服务器的最佳 RAID 配置?

  • VirtualBox 上 Ubuntu 的访客优化技巧 [关闭]

  • 外部硬盘上的 virtualbox 虚拟硬盘驱动器(Vista 主机上的 ubuntu 客户机)

  • 物理机重启时自动重启虚拟机(VMWare)

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve