Правильный способ перемещения квм вм

34

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

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

ОС является Ubuntu на Dom0 и DomU.

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

Onitlikesonic
источник

Ответы:

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

запустить ВМ.

  • Если расположение диска отличается, вам нужно отредактировать узел устройств / диска в xml так, чтобы он указывал на образ на хосте назначения.
  • Если виртуальная машина подключена к пользовательским сетям, вам нужно либо отредактировать их из xml на хосте назначения, либо переопределить их ( virsh net-dumpxml > netxml.xmlи virsh net-define netxml.xml && virsh net-start NETNAME & virsh net-autostart NETNAME)
dyasny
источник
и что, если использовать логический том вместо файла в качестве хранилища ... я думаю, у меня будут проблемы с устройством uuid
inemanja
2
Вы можете удалить UUID , устройства из XML, просто оставить путь /dev/mapper/vgname-lvnameтуда
dyasny
10

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

Если у виртуальной машины есть снимки, которые вы хотите сохранить, вы должны выгрузить 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/

LN2
источник
В любом случае, это слишком долго для комментариев, не беспокойтесь. Спасибо за ваш вклад
HBruijn
Проголосовал, потому что вы заслуживаете право комментировать :-)
Анонимный
3

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

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

Майкл Хэмптон
источник
Согласно help.ubuntu.com/community/KVM/Virsh и чтобы завершить ответ, я полагаю, что последовательность команд будет такой: На источнике Dom0: - virsh shutdown foo - virsh dumpxml foo> /tmp/foo.xml Затем на Dom0 назначения: - скопировать файлы диска и поместить их в тот же каталог, что и исходный Dom0 - скопировать дамп XML - virsh create /tmp/foo.xml - virsh start foo
Onitlikesonic
Достаточно разумно, если вы используете virsh. Я просто скопировал бы файлы напрямую и перезагрузил libvirtd.
Майкл Хэмптон
2

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

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

Загрузите скрипт blocksync.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 на обеих машинах.
  • ВИРТУАЛЬНАЯ Машина в этом случае, которую мы движемся, называется ЛАРРИ
  • Пользователь, выполняющий действие, - ПОЛЬЗОВАТЕЛЬ (который будет вашим именем)
  • DOM0 означает фактический физический сервер

Процедура

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

  • Войдите в систему на хосте dom0, на котором в данный момент находится компьютер (хост "source"), например:
    ssh user@chewie.domainname.com.au
  • Оставайтесь как пользователь, поэтому не становитесь пользователем sudo * Перечислите машины с помощью
    судо вирш - все
  • Дамп определения машины, используя, например:
    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 - подразделения B
    ,
    ** Команда выше должна показывать размер точно в байтах. ** Имя диска машины находится в первом столбце списка, его группа томов - во втором, а размер - в последнем. ** Определите имя устройства как / dev // ** Проверьте его с помощью команды ll. Например, в следующих выходных данных: vm_larry vg1 -wi-ao ---- 69793218560B

LV VG Attr LSize Исходные данные пула% Meta% Журнал перемещения Cpy% Синхронизация
  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 корень корень 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 /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 shutdown NameOfMachine)

  • Если его еще нет на исходном хосте, загрузите сценарий blocksync.py с веб-сайта https://gist.github.com/rcoup/1338263.

  • Если ваше имя пользователя - пользователь (например), то скопируйте скрипт blocksync.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
  • Запустите новую определенную машину, например:
    Судо Вирш начать Ларри
  • Отметьте его для запуска при загрузке хоста, например:
    Судо Вирш Автозапуск Ларри

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

Дейл Картер
источник
Я не пробовал это, но вы получили мой upvote за подробные инструкции. Когда придет время сделать это, я, скорее всего, попробую это.
G Trawo
1

Я столкнулся с этой проблемой с парой моих старых серверов 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, остановите VM-Name

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

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

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

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

Перезапустите сервис libvirtd

service libvirtd restart

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

virsh start VM-Name
gerryamurphy
источник