- Вопрос или проблема
- Подробные инструкции по копированию ВМ с помощью blocksync.py
- Подготовка
- Примеры настроек
- Процедура
- Начальные шаги на исходном хосте
- Начальные шаги на целевом хосте
- Это изменение моста было уникальным для нашей ситуации.
- Заключительные шаги на исходном хосте
- Команда, выполняющая копирование
- Что нужно знать
- Заключительные шаги на целевом хосте
- Ответ или решение
- Основная теория
- Практический пример
- Применение процесса
Вопрос или проблема
Я хотел бы узнать, как правильно переместить виртуальную машину между двумя KVM-хостами без использования какого-либо общего хранилища
Достаточно ли будет скопировать файлы дисков и дамп XML с исходной KVM-машины на целевую? Если да, то какие команды нужно выполнить, чтобы импортировать виртуальную машину на целевом хосте?
Операционная система — Ubuntu как на Dom0, так и на DomU.
Заранее спасибо
- скопируйте диски ВМ из
/var/lib/libvirt/images
на исходном хосте в ту же директорию на целевом хосте - на исходном хосте выполните
virsh dumpxml VMNAME > domxml.xml
и скопируйте этот xml на целевой хост - на целевом хосте выполните
virsh define domxml.xml
Запустите виртуальную машину.
- Если расположение диска отличается, вам нужно будет отредактировать узел devices/disk в xml, чтобы он указывал на образ на целевом хосте
-
Если виртуальная машина подключена к пользовательским сетям, вам необходимо либо удалить их из xml на целевом хосте, либо переопределить их там же
- На исходной машине
virsh net-dumpxml NETNAME > netxml.xml
- Скопируйте netxml.xml на целевой хост
- На целевом хосте выполните
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
Источники:
Да, просто копирование 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 функционировала на новом хосте без сбоев.
Практический пример
-
Копирование дисков виртуальной машины:
- Найдите файлы дисков виртуальной машины на исходном хосте. Обычно они расположены в каталоге
/var/lib/libvirt/images
. - Скопируйте эти файлы на целевой хост в ту же директорию или в другое место по вашему выбору. Для копирования можно использовать
scp
илиrsync
.
scp /var/lib/libvirt/images/vmname-disk.qcow2 [email protected]:/var/lib/libvirt/images/
- Найдите файлы дисков виртуальной машины на исходном хосте. Обычно они расположены в каталоге
-
Экспорт XML-конфигурации:
- На исходном хосте выполните команду для экспорта конфигурации виртуальной машины в XML-файл:
virsh dumpxml VMNAME > vmname.xml
- Перенесите этот XML-файл на целевой хост.
scp vmname.xml [email protected]:/home/user/
-
Импорт конфигурации на целевой хост:
- Определите виртуальную машину на новом хосте, используя переданный XML-файл:
virsh define /home/user/vmname.xml
- Если путь к дисковому файлу изменился, откройте XML и обновите путь в секции
<source file='/var/lib/libvirt/images/vmname-disk.qcow2'/>
.
-
Настройка сетей (если применимо):
- Если виртуальная машина подключена к пользовательским сетям, убедитесь, что они определены на новом хосте. Используйте команды для экспорта и импорта сетевых конфигураций.
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, сохраняя при этом все их параметры и состояния. Это особенно важно в ситуациях, когда требуется масштабирование или оптимизация ресурсов в пределах данных центров обработки данных.