Назад | Перейти на главную страницу

Клонировать виртуальную машину kvm / qemu на другой сервер

Какой самый простой / самый быстрый способ клонировать виртуальную машину с одного сервера на другой, если у вас нет общего хранилища между двумя серверами (поэтому вы не можете выполнить стандартную миграцию)?

У меня есть готовая к работе виртуальная машина, установленная на одном сервере, и я хочу клонировать ее в другую систему. У меня нет общего хранилища между двумя хостами, но я скопировал образ диска между двумя хостами и добавил для него конфигурацию (ее определил 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

Ладно, то, как я это делал, действительно отлично работало. Проблема в том, что мне не хватило ресурсов для запуска этой виртуальной машины. Итак, просто чтобы ответить на свой вопрос ... вот подробности того, как я делал дублирование ВМ на разных серверах без общего диска.

Поскольку у вас нет общего диска, вы не можете выполнить обычное «клонирование», а затем «миграцию». Вместо этого вы делаете типичный клон

  1. Вот команда для клонирования (/ местный / vm / путь к вашим образам виртуальных машин, обычно / var / что-то /):

    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. Обновите конфигурацию любыми новыми изменениями. В моем случае (и это было причиной моей проблемы) мне нужно было снизить атрибуты «memory» и «currentMemory».

  5. Добавьте новую виртуальную машину в libvirt:

    определение virsh /etc/libvirt/qemu/cloned-vm.xml

  6. Запустить его:

    virsh создать /etc/libvirt/qemu/cloned-vm.xml