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

Правильный способ переместить kvm vm

Мне интересно, как правильно перемещать виртуальную машину между двумя хостами KVM без использования какого-либо общего хранилища

Достаточно ли скопировать файлы на диске и дамп XML с исходного KVM-компьютера на целевой? Если да, то какие команды нужно выполнить, чтобы импортировать виртуальную машину в место назначения?

ОС - это Ubuntu как на Dom0, так и на DomU.

заранее спасибо

  1. скопировать диски ВМ из /var/lib/libvirt/images на хосте src в тот же каталог на хосте назначения
  2. на исходном хосте запустить virsh dumpxml VMNAME > domxml.xml и скопируйте этот xml на целевой хост
  3. на целевом хосте запустить virsh define domxml.xml

запустить виртуальную машину.

  • Если расположение на диске отличается, необходимо отредактировать узел устройства / диска xml, чтобы он указывал на изображение на целевом узле.
  • Если виртуальная машина подключена к пользовательским сетям, вам нужно будет либо отредактировать их из xml на целевом хосте, либо переопределить их.

    1. На исходной машине virsh net-dumpxml NETNAME > netxml.xml
    2. скопируйте netxml.xml на целевую машину
    3. На целевой машине virsh net-define netxml.xml && virsh net-start NETNAME & virsh net-autostart NETNAME)

Поскольку я еще не могу комментировать, я должен опубликовать это дополнение к ответу dyasny таким образом.

Если на виртуальной машине есть моментальные снимки, которые вы хотите сохранить, вам следует сделать дамп xml-файлов моментальных снимков на источнике с помощью virsh snapshot-dumpxml $dom $name > file.xml для каждого снимка в списке снимков виртуальной машины virsh snapshot-list --name $dom.

Затем по назначению используйте virsh snapshot-create --redefine $dom file.xml чтобы завершить перенос снимков.

Если вы также заботитесь о том, какой снимок является текущим, дополнительно сделайте это в источнике:
virsh snapshot-current --name $dom
и по месту назначения:
virsh snapshot-current $dom $name

Тогда вы можете использовать virsh snapshot-delete --metadata $dom $name для каждого снимка, чтобы удалить файлы xml в источнике, или вы можете просто удалить их из /var/lib/libvirt/qemu/snapshots/$guestname


Источники:

  1. Список рассылки libvirt-users

  2. http://kashyapc.com/2012/09/14/externaland-live-snapshots-with-libvirt/

Да, достаточно простого копирования XML-файла и образов виртуальных дисков, но это, очевидно, исключает «живую» миграцию. Во время этой процедуры виртуальную машину необходимо выключить.

После копирования в место назначения libvirtd необходимо перезагрузить или перезапустить, чтобы распознать новый файл XML.

Подробные инструкции по копированию виртуальных машин с помощью blockync.py

Эти инструкции применимы к виртуальной машине, использующей диск, предоставленный LVM, и предполагают, что Python находится на каждом из хостов.

Загрузите скрипт blockync.py из https://gist.github.com/rcoup/1338263 и поместите как исходный, так и целевой хост в папку / home / user.

Предшественник

  • Вам понадобится ssh-доступ к обоим машинам (исходной и целевой) для вашего пользователя.
  • Вам также потребуется "sudo" доступ к "root" на обеих машинах.

  • В качестве альтернативы вы можете делать все как root, но только если ваш ssh-ключ дает вам root-доступ хотя бы к целевой машине. ** В этом случае удалите имя пользователя из командной строки.

Пример настроек

  • Виртуальная машина находится на хосте dom0, известном как chewie
  • Желаемый пункт назначения на хосте dom0, известном как darth, и имел здесь внутренний IP-адрес 10.10.10.38 (для нашего примера)
  • В нашем случае мы используем centos 7 в качестве операционной системы dom0 на обеих машинах.
  • Виртуальная машина, которую мы перемещаем, называется ЛАРРИ.
  • Пользователь, выполняющий действие, - USER (это будет ваше имя).
  • DOM0 означает фактический физический сервер

Процедура

Начальные шаги на исходном хосте

  • Войдите в систему на хосте dom0, на котором в настоящее время находится машина («исходный» хост), например:
    ssh user@chewie.domainname.com.au
  • Оставайтесь своим пользователем, поэтому не становитесь пользователем sudo. * Список машин с
    sudo virsh --all
  • Выгрузите определение машины, используя, например:
    sudo virsh dumpxml larry > larry.xml
  • Скопируйте скопированное определение на новый компьютер («целевой» хост), например:

    scp -p larry.xml 10.10.10.38:larry.xml
    вы можете изменить внутренний IP-адрес на имя целевого сервера dom0 ** Примечание: лучше всего использовать IP-адрес для цели, например:
    scp -p larry.xml user@10.10.10.38:larry.xml

    Если вы не можете скопировать из-за ключей cat larry.xml и скопировать его, то вы можете использовать ssh на другой машине, создать файл и вставить его.

  • Найдите размер и имя диска виртуальной машины, используя

    sudo lvs --units B
    .
    ** Приведенная выше команда должна показывать размер точно в байтах. ** Имя диска машины находится в первом столбце списка, его группа томов - во втором, а размер - в последнем. ** Определите имя устройства как / dev // ** Проверьте его с помощью команды 'll' Например, в этом выводе: vm_larry vg1 -wi-ao ---- 69793218560B

LV        VG   Attr       LSize         Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv_root   vg1  -wi-ao----  53687091200B
  lv_swap   vg1  -wi-ao----  17179869184B
  vm_vsrv1  vg1  -wi-ao---- 193273528320B
  vm_vsrv10 vg1  -wi-ao----  64424509440B
  vm_vsrv11 vg1  -wi-ao---- 161061273600B
  vm_vsrv12 vg1  -wi-ao---- 204010946560B
  vm_vsrv2  vg1  -wi-ao---- 140110725120B
  vm_vsrv3  vg1  -wi-ao---- 128849018880B
  vm_larry  vg1  -wi-ao----  69793218560B
  vm_vsrv5  vg1  -wi-ao---- 257698037760B
  vm_vsrv6  vg1  -wi-ao----  64424509440B
  vm_vsrv7  vg1  -wi-ao---- 161061273600B
  vm_vsrv8  vg1  -wi-ao----  64424509440B
  vm_vsrv9  vg1  -wi-ao---- 214748364800B

  • Имя диска - vm_larry, группа томов - vg1.
  • Имя устройства - / dev / vg1 / vm_larry
  • Вывод, например:
    ls -l /dev/vg1/vm_larry
    это: lrwxrwxrwx. 1 root root 8 31 января 13:57 / dev / vg1 / vm_larry -> ../dm-11

Начальные шаги на целевом хосте

  • Войдите на целевой хост, например
    ssh user@darth.domainname.com.au
  • Оставайся своим пользователем. т.е. не становитесь root.
  • Создайте файл определения тома, например:

    vi larry.domainname.com.au-vol.xml
    или
    nano larry.domainname.com.au-vol.xml
    со следующими строками: ПРИМЕЧАНИЕ. Вам нужно будет взять размер в байтах из исходной виртуальной машины и поместить в сценарий ниже. Команда для размера на исходной машине была sudo lvs --units B

    <volume type='block'>
       <name>larry.domainname.com.au</name>
       <capacity unit='bytes'>69793218560</capacity>
       <allocation unit='bytes'>69793218560</allocation>
      <target>
       <path>/dev/centos/larry.domainname.com.au</path>
       <permissions>
         <mode>0600</mode>
         <owner>0</owner>
         <group>6</group>
       <label>system_u:object_r:fixed_disk_device_t:s0</label>
      </permissions>
     </target>
    </volume>
    

Примечание: это определение предназначено для диска размером 69793218560 байт для виртуальной машины, при необходимости измените ее для реальной виртуальной машины.

Примечание: имя и последняя часть пути должны совпадать и использоваться как новое имя диска.

Создайте новый диск из определения, используя

   sudo virsh vol-create --pool centos larry.domainname.com.au-vol.xml

он скажет, что Vol larry.domainname.com.au создан из larry.domainname.com.au-vol.xml

Сделайте файл дискового устройства доступным:

sudo chgrp wheel /dev/mapper/centos-larry.domainname.com.au
sudo chmod g+rw /dev/mapper/centos-larry.domainname.com.au

Отредактируйте скопированное определение xml, например:

vi larry.xml

Найдите определение диска в файле (выполните поиск по запросу «source dev =») и замените устройство на только что созданное (вы можете ls / dev / centos / увидеть vm), например: / dev / drbd4 -> / dev / centos / larry.domainname.com.au

Это изменение моста было уникальным для нашей ситуации.

** Найдите любые ссылки на «br1» в разделах интерфейса и измените его на «br0», например вы меняете исходный мост, поэтому строка выглядит так

Заключительные шаги на исходном хосте

  • Войдите на исходный хост, например

    ssh user@chewie.domainname.com.au

  • Лучше всего выключить виртуальную машину на исходном хосте перед выполнением окончательной синхронизации, но этого делать не нужно. (Завершение работы virsh NameOfMachine)

  • Если еще не на исходном хосте, загрузите скрипт blockync.py с https://gist.github.com/rcoup/1338263

  • Если ваше имя пользователя - user (например), скопируйте сценарий blockync.py на обе машины в / home / user и chown user: user и chmod 755 сценарий.

  • Если еще не на целевом хосте, скопируйте его туда, например:
scp -p blocksync.py user@10.10.10.38:blocksync.py
  • Используйте его для копирования исходного диска на целевой диск, например

Команда, выполняющая копирование

sudo -E python blocksync.py /dev/vg1/vm_larry user@10.10.10.38 /dev/mapper/centos-larry.domainname.com.au -b 4194304

Примечание: первое имя устройства предназначено для исходного хоста, как определено с помощью команды lvs; это от хоста-источника [[chewie]].

Примечание: это будет уничтожить содержимое целевого диска, убедитесь, что /dev/mapper/centos-larry.domainname.com.au правильно!

Примечание: синхронизация займет много времени - около 100 секунд на гигабайт, то есть: 90 минут для 60-гигабайтного диска.

Однако вы можете выполнить синхронизацию во время использования виртуальной машины; последующие синхронизации могут быть на 25 процентов быстрее

Сценарий распечатает параметры, которые он использует (может появиться сообщение об устаревшем модуле, это нормально). Затем он отображает команду ssh, которую он использует, и запускает ее (вы увидите сообщение только для авторизованного персонала, когда он это сделает). Во время синхронизации отображается общее количество скопированных блоков и средняя скорость. Наконец, он распечатывает сообщение о завершении с количеством секунд, которое потребовалось.

Что нужно знать

Вы можете отменить синхронизацию с помощью CTRL C и перезапустить ее позже, снова запустив команду

Заключительные шаги на целевом хосте

  • Войдите на целевой хост, например
     ssh user@darth.domainname.com.au
  • Создайте виртуальную машину, например:
    virsh define larry.xml
  • Запустите новую определенную машину, например:
    sudo virsh start larry
  • Отметьте его для запуска при загрузке хоста, например:
    sudo virsh autostart larry

Примечание: может потребоваться изменить детали виртуальной машины в соответствии с новой средой.

Я столкнулся с этой проблемой с парой моих старых серверов KVM, но это действительно раздражает, когда это происходит, и может вызвать проблемы с любой из установленных виртуальных машин. В моем случае он регулярно переводил одну из моих виртуальных машин в состояние сброса, поскольку дисковое пространство медленно истощалось. Приведенные ниже инструкции в некоторой степени зависят от версии KVM / Distro. В моем случае у меня CentOS 7.5

CentOS Linux release 7.5.1804 (Core) and Qemu-KVM version 1.5.3

По умолчанию образы KVM расположены в папке / var / lib / libvirt / images /

Вам нужно найти имя виртуальной машины, для этого используйте список virsh

virsh list
 Id    Name                           State
----------------------------------------------------
 12    VM-Name                        paused

Остановить виртуальную машину virsh остановить имя виртуальной машины

Для меня я сначала копирую файл, а не перемещаю. Скопируйте файл qcow в новое место

cp /var/lib/libvirt/images/VM-Name.qcow2 /home/VMImages/

Отредактируйте XML-файл виртуальной машины, чтобы указать новое местоположение "исходного файла". Virsh edit VM-Name

Вы захотите изменить "исходный файл" этот файл

Перезапустите службу libvirtd

service libvirtd restart

Затем перезапустите виртуальную машину, и все будет в порядке.

virsh start VM-Name