Мне интересно, как правильно перемещать виртуальную машину между двумя хостами KVM без использования какого-либо общего хранилища
Достаточно ли скопировать файлы на диске и дамп XML с исходного KVM-компьютера на целевой? Если да, то какие команды нужно выполнить, чтобы импортировать виртуальную машину в место назначения?
ОС - это Ubuntu как на Dom0, так и на DomU.
заранее спасибо
/var/lib/libvirt/images
на хосте src в тот же каталог на хосте назначенияvirsh dumpxml VMNAME > domxml.xml
и скопируйте этот xml на целевой хостvirsh define domxml.xml
запустить виртуальную машину.
Если виртуальная машина подключена к пользовательским сетям, вам нужно будет либо отредактировать их из xml на целевом хосте, либо переопределить их.
virsh net-dumpxml NETNAME > 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/snapshots/$guestname
Источники:
Да, достаточно простого копирования XML-файла и образов виртуальных дисков, но это, очевидно, исключает «живую» миграцию. Во время этой процедуры виртуальную машину необходимо выключить.
После копирования в место назначения libvirtd
необходимо перезагрузить или перезапустить, чтобы распознать новый файл XML.
Эти инструкции применимы к виртуальной машине, использующей диск, предоставленный LVM, и предполагают, что Python находится на каждом из хостов.
Загрузите скрипт blockync.py из https://gist.github.com/rcoup/1338263 и поместите как исходный, так и целевой хост в папку / home / user.
Вам также потребуется "sudo" доступ к "root" на обеих машинах.
В качестве альтернативы вы можете делать все как root, но только если ваш ssh-ключ дает вам root-доступ хотя бы к целевой машине. ** В этом случае удалите имя пользователя из командной строки.
ssh user@chewie.domainname.com.au
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.
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
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
Создайте файл определения тома, например:
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