Правильний спосіб переміщення kvm vm


34

Мені цікаво, що є правильним способом переміщення VM між двома хостами KVM, не використовуючи загального сховища

Чи достатньо буде скопіювати файли диска та дамп XML з вихідної машини KVM до пункту призначення? Якщо так, то які команди потрібно запустити, щоб імпортувати vm в пункт призначення?

ОС є Ubuntu і в Dom0, і в DomU.

Спасибі заздалегідь

Відповіді:


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

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

  • Якщо розташування диска відрізняється, вам потрібно відредагувати пристрої / диск диска xml, щоб вказати на зображення на хості призначення
  • Якщо VM приєднано до визначених користувачем мереж, вам потрібно буде або відредагувати їх із xml на хості призначення, або переробити їх також ( virsh net-dumpxml > netxml.xmlі virsh net-define netxml.xml && virsh net-start NETNAME & virsh net-autostart NETNAME)

а що робити, якщо використовувати логічний том замість файлу як сховище ... я думаю, у мене виникнуть проблеми з пристроєм uuid
inemanja

2
Ви можете видалити UUID з пристрою з xml, просто залиште /dev/mapper/vgname-lvnameтуди шлях
діасний

10

Оскільки я поки не можу коментувати, я мушу опублікувати це доповнення до відповіді Діасни таким чином.

Якщо у ВМ є знімки, які ви хочете зберегти, вам слід скинути xml-файли virsh snapshot-dumpxml $dom $name > file.xmlзнімка у вихідному коді для кожного знімка зі списку знімків VM 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

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


Занадто довго для коментарів, ніяких турбот. Дякуємо за ваш внесок
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

Детальні вказівки щодо копіювання віртуальних машин за допомогою блоків

Ці інструкції стосуються VM з використанням диска, що надається LVM, і передбачає, що Python є на кожному з хостів

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

Попередник

  • Потрібно мати доступ 'ssh' до обох машин (джерела та цілі) для вашого користувача.
  • Вам також потрібно мати "sudo" доступ до "root" на обох машинах.

  • Крім того, ви можете зробити все як root, але лише якщо ваш ключ ssh надає вам доступ до кореневої системи принаймні до цільової машини. ** У цьому випадку видаліть ім'я користувача з командних рядків.

Приклад налаштувань

  • Віртуальна машина знаходиться на хості dom0, відомому як chewie
  • Цільове місце призначення на хості dom0, відомому як дарт і мав тут внутрішній IP 10.10.10.38 (для нашого прикладу)
  • У нашому реальному випадку ми використовуємо centos 7 як операційну систему dom0 на обох машинах
  • ВІРТУАЛЬНА машина, в якій ми рухаємося, називається ЛАРРІ
  • Користувач, який здійснює дію, є USER (яке буде ваше ім’я)
  • DOM0 означає фактичний фізичний сервер

Порядок

Початкові кроки на вихідному хості

  • Увійдіть до хоста dom0, який наразі має машину ("вихідний" хост), наприклад:
    ssh user@chewie.domainname.com.au
  • Залишайтеся своїм користувачем, тому не ставайте користувачем sudo * Перелічіть машини
    sudo virsh - всі
  • Вивантажте визначення машини за допомогою, наприклад:
    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

    Якщо ви не можете скопіювати через ключі кішку larry.xml і скопіювати її, тоді ви можете сш в іншу машину і створити файл і вставити його.

  • Знайдіть розмір та назву диска VM за допомогою

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

LV VG Attr LSize Походження даних басейну% Мета% Журнал переміщення 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
  • Будьте власним користувачем. тобто не вкорінюються.
  • Створіть файл визначення обсягу, наприклад:

    vi larry.domainname.com.au-vol.xml
    або
    nano larry.domainname.com.au-vol.xml
    із наступними рядками: ПРИМІТКА - Вам потрібно буде взяти розмір у байтах від оригінальної програми VM та поставити його нижче в сценарій. Командою на вихідній машині для розміру було sudo lvs - юнити 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 байт-диска для VM larry, зміни в міру необхідності для фактичного VM.

Примітка: ім'я та остання частина шляху повинні збігатися і використовуватимуться як нове ім’я диска.

Створіть новий диск із визначення, використовуючи

   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

  • Найкращою практикою було б відключення VM на вихідному хості перед тим, як зробити остаточну синхронізацію, але цього не потрібно робити. (відключення virsh NameOfMachine)

  • Якщо ви ще не знаходитесь на вихідному хості, завантажте скрипт blockync.py з https://gist.github.com/rcoup/1338263

  • Якщо ваше ім'я користувача є користувачем (наприклад), тоді скопіюйте сценарій blockync.py на обидва машини в / home / user та chown user: user та chmod 755.

  • Якщо це вже не на цільовому хості, скопіюйте його, наприклад:
scp -p blockync.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-гігабайтного диска.

Однак ви можете робити синхронізацію під час використання VM; наступні синхронізації можуть бути до 25 відсотків швидшими

Сценарій роздруковує параметри, які він використовує (може бути повідомлення про застарілий модуль, це нормально). Далі, він відображає команду ssh, яку вона використовує, і запускає її (ви побачите повідомлення авторизованого персоналу лише тоді, коли це зробить). Під час синхронізації він відображатиме загальну кількість скопійованих блоків та середню швидкість. Нарешті, він друкує повідомлення про завершення з кількістю секунд, які знадобилося.

Що потрібно знати

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

Останні кроки на цільовому вузлі

  • Увійти до цільового хоста, наприклад
     ssh user@darth.domainname.com.au
  • Створіть віртуальну машину, наприклад:
    virsh визначити larry.xml
  • Запустіть щойно визначений апарат, наприклад:
    sudo virsh start larry
  • Позначте його для початку хості завантаження, наприклад:
    sudo virsh автозапуск larry

Примітка. Можливо, буде потрібно змінити деталі VM, щоб відповідати новій обстановці.


Я цього не пробував, але ви отримали мою інформацію про надані детальні інструкції. Коли настане час це зробити, я, швидше за все, спробую це.
G Trawo

1

Я зіткнувся з цією проблемою з парою своїх старих серверів KVM, але це насправді дратує, коли це відбувається, і може спричинити проблеми з будь-яким із встановлених VM. У моєму випадку він регулярно підштовхував один із моїх віртуальних машин до стану скидання, оскільки дисковий простір повільно вичерпувався. Наведені нижче інструкції дещо чутливі до версії KVM / Distro. У моєму випадку у мене є CentOS 7.5

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

За замовчуванням у зображеннях KVM розміщені розташування / var / lib / libvirt / images /

Вам потрібно знайти ім'я VM, для цього використовуйте список virsh

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

Зупинка VM virsh stop VM-Name

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

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

Відредагуйте XML-файл VM, щоб посилатися на нове місце розташування "вихідного файлу" virsh редагувати VM-ім'я

Ви хочете змінити "вихідний файл" цього файлу

Перезапустіть сервіс libvirtd

service libvirtd restart

Потім перезапустіть VM, і вам слід добре пройти.

virsh start VM-Name
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.