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>
わかりましたので、私がそれをしていた方法は実際にはうまくいきました。問題は、そのVMを実行するための十分なリソースがないことです。だから私自身の質問に答えるためだけに...共有ディスクなしで異なるサーバー間でVM複製をどのように行ったかの詳細はここにあります。
共有ディスクがないため、一般的な「クローン」を行ってから「移行」を行うことはできません。代わりに、典型的なクローンを作成します
これがクローンを作成するコマンドです(/ 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
次に、そのimgファイルを1つのサーバーから別のサーバーにコピーします。私のサーバーは互いに直接通信できないため、この小さなSSHリダイレクトを使用してトリックを実行します。
ssh -n server1 '(cd/local/vm /; cat cloned-vm.img)' | ssh server2 '(cd/local/vm /; cat> cloned-vm.img)'
次に、そのVM=の構成をコピーします:
ssh -n server1 '(cd/etc/libvirt/qemu /; cat cloned-vm.xml)' | ssh server2 '(cd/etc/libvirt/qemu /; cat> cloned-vm.xml)'
新しい変更で構成を更新します。私の場合(これが問題の原因でした)、 "memory"および "currentMemory"属性を下げる必要がありました。
新しいVMをlibvirtに追加します。
virshは/etc/libvirt/qemu/cloned-vm.xmlを定義します
それを実行します:
virshは/etc/libvirt/qemu/cloned-vm.xmlを作成します
そして、ここで私が行うのは$ 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