Prawidłowy sposób przenoszenia kvm vm

34

Zastanawiam się, jaki jest właściwy sposób przenoszenia maszyny wirtualnej między dwoma hostami KVM bez korzystania z jakiejkolwiek pamięci współdzielonej

Czy wystarczy skopiować pliki dyskowe i zrzut XML ze źródłowej maszyny KVM na docelową? Jeśli tak, jakie polecenia należy uruchomić, aby zaimportować maszynę wirtualną w miejscu docelowym?

System operacyjny to Ubuntu zarówno na Dom0, jak i DomU.

Z góry dziękuję

Onitlikesonic
źródło

Odpowiedzi:

41
  1. skopiuj dyski maszyny wirtualnej z /var/lib/libvirt/imageshosta src do tego samego katalogu na hoście docelowym
  2. na hoście źródłowym uruchom virsh dumpxml VMNAME > domxml.xmli skopiuj ten plik xml do hosta docelowego
  3. na uruchomieniu hosta docelowego virsh define domxml.xml

uruchom maszynę wirtualną.

  • Jeśli lokalizacja dysku jest inna, musisz edytować urządzenia / węzeł dysku xml, aby wskazywały obraz na hoście docelowym
  • Jeśli maszyna wirtualna jest podłączona do niestandardowo zdefiniowanych sieci, musisz albo edytować je poza plikiem xml na hoście docelowym, albo też je przedefiniować ( virsh net-dumpxml > netxml.xmli virsh net-define netxml.xml && virsh net-start NETNAME & virsh net-autostart NETNAME)
dyasny
źródło
a co, jeśli użyjesz woluminu logicznego zamiast pliku jako magazynu ... myślę, że będę miał problem z urządzeniem uuid
inemanja
2
Możesz usunąć UUID urządzenia z xml, po prostu zostaw /dev/mapper/vgname-lvnametam ścieżkę
dyasny
10

Ponieważ nie mogę jeszcze komentować, muszę w ten sposób opublikować ten dodatek do odpowiedzi dyasny.

Jeśli maszyna wirtualna ma migawki, które chcesz zachować, należy zrzucić pliki xml migawki w źródle virsh snapshot-dumpxml $dom $name > file.xmldla każdej migawki na liście migawek maszyny wirtualnej virsh snapshot-list --name $dom.

Następnie użyj miejsca docelowego, virsh snapshot-create --redefine $dom file.xmlaby zakończyć migrację migawek.

Jeśli zależy Ci również na tym, która migawka jest aktualna, wykonaj dodatkowo na źródłowym:
virsh snapshot-current --name $dom
i docelowym:
virsh snapshot-current $dom $name

Następnie możesz użyć virsh snapshot-delete --metadata $dom $namedla każdej migawki, aby usunąć pliki XML ze źródła, lub możesz po prostu usunąć je/var/lib/libvirt/qemu/snapshots/$guestname


Źródła:

  1. lista mailingowa użytkowników libvirt

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

LN2
źródło
W każdym razie jest za długo na komentarz, bez obaw. Dzięki za wkład
HBruijn,
Głosowano, ponieważ zasługujesz na prawo do komentowania :-)
Onnonymous
3

Tak, wystarczy skopiować plik XML i obrazy dysku wirtualnego, ale oczywiście wyklucza to migrację „na żywo”. Maszyna wirtualna musi zostać wyłączona podczas tej procedury.

Po skopiowaniu do miejsca docelowego libvirtdnależy go ponownie załadować lub uruchomić ponownie, aby rozpoznać nowy plik XML.

Michael Hampton
źródło
Zgodnie z help.ubuntu.com/community/KVM/Virsh i aby udzielić odpowiedzi, uważam, że sekwencja poleceń będzie następująca: Na źródłowym Dom0: - zamknięcie virsh foo - virsh dumpxml foo> /tmp/foo.xml Następnie na docelowy Dom0: - Skopiuj pliki dyskowe i umieść je w tym samym katalogu co źródłowy Dom0 - Skopiuj zrzut XML - virsh utwórz /tmp/foo.xml - virsh start foo
Onitlikesonic
Wystarczająco rozsądne, jeśli używasz virsh. Po prostu skopiowałbym pliki bezpośrednio i załadowałem ponownie libvirtd.
Michael Hampton
2

Szczegółowe instrukcje dotyczące kopiowania maszyn wirtualnych za pomocą blockync.py

Te instrukcje dotyczą maszyny wirtualnej korzystającej z dysku dostarczonego przez LVM i zakładają, że Python znajduje się na każdym z hostów

Pobierz skrypt blockync.py ze strony https://gist.github.com/rcoup/1338263 i umieść host źródłowy i docelowy w folderze / home / user.

Prekursor

  • Musisz mieć dostęp „ssh” do obu komputerów (źródłowego i docelowego) dla swojego użytkownika.
  • Będziesz także musiał mieć dostęp „sudo” do „root” na obu komputerach.

  • Alternatywnie możesz zrobić wszystko jako root, ale tylko jeśli twój klucz ssh daje ci dostęp do roota przynajmniej do maszyny docelowej. ** W takim przypadku usuń nazwę użytkownika z wiersza poleceń.

Przykładowe ustawienia

  • Maszyna wirtualna znajduje się na hoście dom0 o nazwie chewie
  • Miejsce docelowe pożądane na hoście dom0, znane jako darth, i miało tutaj wewnętrzny adres IP 10.10.10.38 (dla naszego przykładu)
  • W naszym przypadku używamy centos 7 jako systemu operacyjnego dom0 na obu komputerach
  • Maszyna WIRTUALNA w tym przypadku, w którym się poruszamy, nazywa się LARRY
  • Użytkownik wykonujący akcję to USER (który będzie Twoim imieniem)
  • DOM0 oznacza rzeczywisty serwer fizyczny

Procedura

Pierwsze kroki na hoście źródłowym

  • Zaloguj się do hosta dom0, który obecnie ma maszynę (host „źródłowy”), np .:
    ssh uż[email protected]
  • Pozostań jako użytkownik, więc nie zostań użytkownikiem sudo * Wyświetl listę maszyn z
    sudo virsh --all
  • Zrzuć definicję komputera, używając np .:
    sudo virsh dumpxml larry> larry.xml
  • Skopiuj zrzuconą definicję na nowy komputer (host „docelowy”), np .:

    scp -p larry.xml 10.10.10.38:larry.xml
    możesz zmienić wewnętrzny adres IP na docelową nazwę serwera dom0 ** Uwaga: najlepiej jest użyć adresu IP dla celu, np .:
    scp -p larry.xml uż[email protected]: larry.xml

    Jeśli nie możesz skopiować z powodu kluczy, plik cat larry.xml i skopiuj go. Następnie możesz ssh na innym komputerze, utworzyć plik i wkleić go.

  • Znajdź rozmiar i nazwę dysku maszyny wirtualnej za pomocą

    sudo lvs --units B
    .
    ** Powyższe polecenie powinno pokazywać rozmiar dokładnie w bajtach. ** Nazwa dysku komputera znajduje się w pierwszej kolumnie listy, jego grupa woluminów w drugiej, a rozmiar w ostatniej. ** Określ nazwę urządzenia jako / dev // ** Sprawdź ją za pomocą polecenia „ll” Na przykład w tym wyniku: vm_larry vg1 -wi-ao ---- 69793218560B

LV VG Attr LSize Pula Pochodzenie Dane% Meta% Przenieś Log Cpy% Synchronizacja Konwertuj
  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

  • Nazwa dysku to „vm_larry”, grupa woluminów to „vg1”.
  • Nazwa urządzenia to / dev / vg1 / vm_larry
  • Dane wyjściowe dla np .:
    ls -l / dev / vg1 / vm_larry
    to: lrwxrwxrwx. 1 root root 8 stycznia 31 13:57 / dev / vg1 / vm_larry -> ../dm-11

Pierwsze kroki na hoście docelowym

  • Zaloguj się do hosta docelowego, np
    ssh uż[email protected]
  • Pozostań jako własny użytkownik. tj. nie rootuj.
  • Utwórz plik definicji woluminu, np .:

    vi larry.domainname.com.au-vol.xml
    lub
    nano larry.domainname.com.au-vol.xml
    z następującymi wierszami: UWAGA - Musisz pobrać rozmiar w bajtach z oryginalnej maszyny wirtualnej i umieścić w poniższym skrypcie. Poleceniem na maszynie źródłowej dla rozmiaru było sudo lvs - jednostki 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>
    

Uwaga: ta definicja dotyczy 69793218560 bajtów dysku dla maszyny wirtualnej VM, w razie potrzeby zmień ją dla rzeczywistej maszyny wirtualnej.

Uwaga: nazwa i ostatnia część ścieżki powinny być zgodne i będą używane jako nazwa nowego dysku.

Utwórz nowy dysk z definicji, używając

   sudo virsh vol-create --pool centos larry.domainname.com.au-vol.xml

wyświetli Vol larry.domainname.com.au utworzony z larry.domainname.com.au-vol.xml

Udostępnij plik urządzenia dyskowego:

sudo chgrp wheel /dev/mapper/centos-larry.domainname.com.au
sudo chmod g + rw /dev/mapper/centos-larry.domainname.com.au

Edytuj skopiowaną definicję xml, np .:

vi larry.xml

Znajdź definicję dysku w pliku (wyszukaj „source dev =”) i zamień urządzenie na właśnie utworzone (możesz ls / dev / centos /, aby zobaczyć vm), np .: / dev / drbd4 -> / dev / centos / larry.domainname.com.au

Ta zmiana mostu była wyjątkowa w naszej sytuacji.

** Znajdź wszelkie odniesienia do „br1” w sekcjach interfejsu i zmień je na „br0”, np. Zmieniasz most źródłowy, więc linia wygląda tak

Ostatnie kroki na hoście źródłowym

  • Zaloguj się do hosta źródłowego, np

    ssh uż[email protected]

  • Najlepszą praktyką byłoby zamknięcie maszyny wirtualnej na hoście źródłowym przed wykonaniem ostatecznej synchronizacji, ale nie trzeba tego robić. (zamknięcie systemu Virsh NameOfMachine)

  • Jeśli nie masz jeszcze hosta źródłowego, pobierz skrypt blockync.py ze strony https://gist.github.com/rcoup/1338263

  • Jeśli twoja nazwa użytkownika to użytkownik (na przykład), skopiuj skrypt blockync.py na oba komputery do / home / user i użytkownik chown: user i skrypt chmod 755.

  • Jeśli nie ma go jeszcze na hoście docelowym, skopiuj go tam, np .:
scp -p blocksync.py uż[email protected]: blocksync.py
  • Użyj go, aby skopiować dysk źródłowy na dysk docelowy, np

Polecenie wykonujące kopiowanie

sudo -E python blocksync.py / dev / vg1 / vm_larry uż[email protected] /dev/mapper/centos-larry.domainname.com.au -b 4194304

Uwaga: pierwsza nazwa urządzenia jest dla hosta źródłowego, jak określono w poleceniu „lvs”; ten jest z hosta źródłowego [[chewie]].

Uwaga: spowoduje to zniszczenie zawartości dysku docelowego, upewnij się, że /dev/mapper/centos-larry.domainname.com.au jest poprawny!

Uwaga: synchronizacja zajmie dużo czasu - około 100 sekund na gigabajt, tj .: 90 minut na dysk 60 gigabajtów.

Można jednak wykonać synchronizację, gdy maszyna wirtualna jest używana; kolejne synchronizacje mogą być do 25 procent szybsze

Skrypt wydrukuje parametry, których używa (może pojawić się komunikat o przestarzałym module, to jest w porządku). Następnie wyświetla komendę ssh, której używa i uruchamia ją (wtedy zobaczysz komunikat tylko dla autoryzowanego personelu). Podczas synchronizacji wyświetli całkowitą liczbę skopiowanych bloków i średnią prędkość. Na koniec wyświetla komunikat o zakończeniu z liczbą sekund, które zajęło.

Rzeczy, które warto wiedzieć

Możesz anulować synchronizację za pomocą CTRL C i zrestartować ją później, ponownie uruchamiając polecenie

Ostatnie kroki na hoście docelowym

  • Zaloguj się do hosta docelowego, np
     ssh uż[email protected]
  • Utwórz maszynę wirtualną, np .:
    virsh zdefiniuj larry.xml
  • Uruchom nowo zdefiniowaną maszynę, np .:
    Sudo Virsh rozpocząć Larry
  • Zaznacz, aby rozpocząć przy rozruchu hosta, np .:
    Sudo Virsh Autostart Larry

Uwaga: może być konieczna zmiana szczegółów maszyny wirtualnej w celu dopasowania do nowego środowiska.

Dale Carter
źródło
Nie próbowałem tego, ale otrzymałem moje poparcie dla szczegółowych instrukcji. Jeśli przyjdzie czas, aby to zrobić, najprawdopodobniej spróbuję tego.
G Trawo
1

Wystąpił ten problem z kilkoma moimi starszymi serwerami KVM, ale jest to naprawdę denerwujące, kiedy to się dzieje, i może powodować problemy z dowolną z zainstalowanych maszyn wirtualnych. W moim przypadku regularnie spychał jedną z moich maszyn wirtualnych do stanu resetowania, ponieważ miejsce na dysku było powoli wyczerpane. Poniższe instrukcje są nieco wrażliwe na wersję KVM / Distro. W moim przypadku mam CentOS 7.5

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

Domyślnie obrazy KVM znajdują się w lokalizacji / var / lib / libvirt / images /

Musisz znaleźć nazwę maszyny wirtualnej, w tym celu użyj listy virsh

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

Zatrzymaj VM virsh stop VM-Name

Dla mnie najpierw kopiuję plik, a nie ruszam się. Skopiuj plik qcow do nowej lokalizacji

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

Edytuj plik XML VM, aby odwoływał się do nowej lokalizacji pliku źródłowego. Edytuj VM-Name

Będziesz chciał zmienić „plik źródłowy” tego pliku

Uruchom ponownie usługę libvirtd

service libvirtd restart

Następnie uruchom ponownie maszynę wirtualną i powinieneś już iść.

virsh start VM-Name
gerryamurphy
źródło