web-dev-qa-db-ja.com

kvm / qemu VMを別のサーバーに複製

2つのサーバー間でストレージを共有していない(つまり、標準の移行ができない)場合、VMを1つのサーバーから別のサーバーに複製する最も簡単で迅速な方法は何ですか?)

私は本番環境の準備ができていますVMが1台のサーバーにインストールされており、それを別のシステムに複製したいのです。2台のホスト間でストレージを共有していませんが、ディスクイメージをコピーしました2つのホスト間で構成を追加しました(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

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>
7
Andrew Case

わかりましたので、私がそれをしていた方法は実際にはうまくいきました。問題は、そのVMを実行するための十分なリソースがないことです。だから私自身の質問に答えるためだけに...共有ディスクなしで異なるサーバー間で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ファイルを1つのサーバーから別のサーバーにコピーします。私のサーバーは互いに直接通信できないため、この小さなSSHリダイレクトを使用してトリックを実行します。

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

  3. 次に、そのVM=の構成をコピーします:

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

  4. 新しい変更で構成を更新します。私の場合(これが問題の原因でした)、 "memory"および "currentMemory"属性を下げる必要がありました。

  5. 新しいVMをlibvirtに追加します。

    virshは/etc/libvirt/qemu/cloned-vm.xmlを定義します

  6. それを実行します:

    virshは/etc/libvirt/qemu/cloned-vm.xmlを作成します

4
Andrew Case

そして、ここで私が行うのは$ VMがVM nameであり、DESTが宛先ハイパーバイザーのホスト名です。これは、ddおよびスナップショットLVMディスクを使用して実行中のVMでこれを行います(LVMがグループはHypGroup00と呼ばれます。

私はこれを一緒に投げただけなので、必ずしもきれいとは限りませんが、仕事をします。これを使用して、いくつかのVMをCentOS 5.9ハイパーバイザーからCentOS 6に最小限のダウンタイムで移行します。

これはCentOS 5.9用であり、CentOS 5および6を宛先としてテストされています。

VM=webserver
DEST=hyp5

ほとんどのVMディスクは/ dev/volgroup/volnameパスではなく/ dev/mapper /パスを介して参照されるため、どのディスクをコピーするかを考えます。したがって、二。

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
6