Правильный способ перемещения виртуальной машины KVM

Вопрос или проблема

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

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

Операционная система — Ubuntu как на Dom0, так и на DomU.

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

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

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

  • Если расположение диска отличается, вам нужно будет отредактировать узел devices/disk в 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/snapshot/$guestname


Источники:

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

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

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

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

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

Процедура

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

  • Войдите на хост dom0, который в данный момент имеет машину (это “исходный” хост), например:
    ssh [email protected]
  • Оставайтесь как пользователь, не переходите в режим sudo
    * Перечислите машины с

    sudo virsh --all
  • Создайте дамп определения машины, например:
    sudo virsh dumpxml larry > larry.xml
  • Скопируйте дамп определения на новую машину (это “целевой” хост), например:

    scp -p larry.xml 10.10.10.38:larry.xml

    вы можете изменить внутренний ip на имя целевого дом0
    ** Примечание: лучше использовать ip-адрес для цели, например:

    scp -p larry.xml [email protected]:larry.xml

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

  • Найдите размер и имя диска ВМ, используя

    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 [email protected]
  • Оставайтесь как свой пользователь. То есть, не переходите в режим 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 байтового диска для ВМ larry, измените по мере необходимости для фактической ВМ.

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

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

   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 [email protected]
  • Лучшей практикой было бы выключить виртуальную машину на исходном хосте перед финальной синхронизацией, но это не обязательно. (virsh shutdown NameOfMachine)

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

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

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

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

sudo -E python blocksync.py /dev/vg1/vm_larry [email protected] /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 [email protected]
  • Создайте виртуальную машину, например:
    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) и Qemu-KVM version 1.5.3

По умолчанию изображения KVM находятся в
/var/lib/libvirt/images/

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

virsh list
 Id    Name                           State
----------------------------------------------------
 12    Имя-ВМ                        paused

Остановите ВМ
virsh stop Имя-ВМ

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

cp /var/lib/libvirt/images/Имя-ВМ.qcow2 /home/VMImages/

Отредактируйте XML-файл ВМ, чтобы изменить ссылку на новое местоположение “source file”
virsh edit Имя-ВМ

Вам необходимо изменить “source file” в этом файле

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

service libvirtd restart

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

virsh start Имя-ВМ

Ответ или решение

Перемещение виртуальных машин (VM) между хостами KVM без использования общего хранения данных — это процесс, который требует тщательной подготовки и соблюдения определенных шагов для обеспечения успешной миграции и минимизации рисков для данных. Рассмотрим более подробно, как провести такой процесс на примере Ubuntu.

Основная теория

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

Практический пример

  1. Копирование дисков виртуальной машины:

    • Найдите файлы дисков виртуальной машины на исходном хосте. Обычно они расположены в каталоге /var/lib/libvirt/images.
    • Скопируйте эти файлы на целевой хост в ту же директорию или в другое место по вашему выбору. Для копирования можно использовать scp или rsync.
    scp /var/lib/libvirt/images/vmname-disk.qcow2 [email protected]:/var/lib/libvirt/images/
  2. Экспорт XML-конфигурации:

    • На исходном хосте выполните команду для экспорта конфигурации виртуальной машины в XML-файл:
    virsh dumpxml VMNAME > vmname.xml
    • Перенесите этот XML-файл на целевой хост.
    scp vmname.xml [email protected]:/home/user/
  3. Импорт конфигурации на целевой хост:

    • Определите виртуальную машину на новом хосте, используя переданный XML-файл:
    virsh define /home/user/vmname.xml
    • Если путь к дисковому файлу изменился, откройте XML и обновите путь в секции <source file='/var/lib/libvirt/images/vmname-disk.qcow2'/>.
  4. Настройка сетей (если применимо):

    • Если виртуальная машина подключена к пользовательским сетям, убедитесь, что они определены на новом хосте. Используйте команды для экспорта и импорта сетевых конфигураций.
    virsh net-dumpxml NETNAME > network.xml
    scp network.xml [email protected]:/home/user/
    virsh net-define /home/user/network.xml
    virsh net-start NETNAME
    virsh net-autostart NETNAME

Применение процесса

После завершения всех вышеперечисленных шагов, вы можете запустить виртуальную машину на новом узле. Проверьте её работу и убедитесь, что все необходимые параметры корректно перенесены. Если у виртуальной машины были активные снапшоты, экспортируйте их с помощью virsh snapshot-dumpxml и импортируйте на новом хосте.

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

Оцените материал
Добавить комментарий

Капча загружается...