Какой самый простой / самый быстрый способ клонировать виртуальную машину с одного сервера на другой, если у вас нет общего хранилища между двумя серверами (поэтому вы не можете выполнить стандартную миграцию)?
У меня есть готовая к работе виртуальная машина, установленная на одном сервере, и я хочу клонировать ее в другую систему. У меня нет общего хранилища между двумя хостами, но я скопировал образ диска между двумя хостами и добавил для него конфигурацию (ее определил 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 на RHEL6. Вот дублированный конфиг
<!-- 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 - это имя виртуальной машины, а DEST - это имя хоста целевого гипервизора. Это происходит при запуске виртуальных машин с использованием dd-дисков и дисков LVM для моментальных снимков (предполагается, что группа LVM называется HypGroup00).
Я просто собрал это вместе, так что он не обязательно самый красивый, но выполняет свою работу, я использую его для миграции некоторых виртуальных машин с гипервизора CentOS 5.9 на CentOS 6 с минимальным временем простоя.
Это для CentOS 5.9, протестировано при переходе на CentOS 5 и 6 в качестве пункта назначения.
VM=webserver
DEST=hyp5
Выясните, какие диски копировать, поскольку на большинство наших виртуальных машин ссылаются через путь / 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
Скопируйте определение виртуальной машины и зарегистрируйте его
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
Ладно, то, как я это делал, действительно отлично работало. Проблема в том, что мне не хватило ресурсов для запуска этой виртуальной машины. Итак, просто чтобы ответить на свой вопрос ... вот подробности того, как я делал дублирование ВМ на разных серверах без общего диска.
Поскольку у вас нет общего диска, вы не можете выполнить обычное «клонирование», а затем «миграцию». Вместо этого вы делаете типичный клон
Вот команда для клонирования (/ местный / vm / путь к вашим образам виртуальных машин, обычно / var / что-то /):
virt-clone --original = vm-to-clone --name = cloned-vm -f /local/vm/cloned-vm.img --mac = xx: xx: xx: xx: xx: xx
Теперь скопируйте этот img-файл с одного сервера на другой ... мои серверы не могут напрямую общаться друг с другом, поэтому я использую это небольшое перенаправление SSH, чтобы добиться цели:
ssh -n server1 '(cd / local / vm /; cat cloned-vm.img)' | ssh server2 '(cd / local / vm /; cat> cloned-vm.img)'
Затем скопируйте конфигурацию этой виртуальной машины:
ssh -n server1 '(cd / etc / libvirt / qemu /; cat cloned-vm.xml)' | ssh server2 '(cd / etc / libvirt / qemu /; cat> cloned-vm.xml)'
Обновите конфигурацию любыми новыми изменениями. В моем случае (и это было причиной моей проблемы) мне нужно было снизить атрибуты «memory» и «currentMemory».
Добавьте новую виртуальную машину в libvirt:
определение virsh /etc/libvirt/qemu/cloned-vm.xml
Запустить его:
virsh создать /etc/libvirt/qemu/cloned-vm.xml