Modo corretto di spostare kvm vm


34

Mi chiedo quale sia il modo corretto di spostare una VM tra due host KVM senza utilizzare alcun tipo di archiviazione condivisa

Basterebbe copiare i file su disco e il dump XML dalla macchina KVM di origine a quella di destinazione? In tal caso, quali comandi devono essere eseguiti per importare la VM sulla destinazione?

Il sistema operativo è Ubuntu sia su Dom0 che su DomU.

Grazie in anticipo

Risposte:


41
  1. copia i dischi della VM /var/lib/libvirt/imagesdall'host src nella stessa directory sull'host di destinazione
  2. sull'host di origine eseguire virsh dumpxml VMNAME > domxml.xmle copiare questo xml nell'host di destinazione
  3. sull'host di destinazione eseguito virsh define domxml.xml

avviare la VM.

  • Se la posizione del disco differisce, è necessario modificare i dispositivi / nodo del disco xml per puntare all'immagine sull'host di destinazione
  • Se la VM è collegata a reti definite personalizzate, dovrai modificarle dal file XML sull'host di destinazione o ridefinirle ( virsh net-dumpxml > netxml.xmle virsh net-define netxml.xml && virsh net-start NETNAME & virsh net-autostart NETNAME)

e se usare il volume logico invece del file come memoria ... penso che avrò problemi con il dispositivo uuid
inemanja

2
Puoi rimuovere gli UUID del dispositivo dall'xml, basta lasciare il percorso /dev/mapper/vgname-lvname
dyasny

10

Dal momento che non posso ancora commentare, devo pubblicare questo addendum alla risposta di dyasny in questo modo.

Se la VM dispone di snapshot che si desidera conservare, è necessario eseguire il dump dei file xml di snapshot sull'origine con virsh snapshot-dumpxml $dom $name > file.xmlogni snapshot nell'elenco di snapshot della VM virsh snapshot-list --name $dom.

Quindi sulla destinazione utilizzare virsh snapshot-create --redefine $dom file.xmlper completare la migrazione delle istantanee.

Se ti interessa anche quale snapshot è quella corrente, allora fai anche sulla fonte:
virsh snapshot-current --name $dom
e sulla destinazione:
virsh snapshot-current $dom $name

Quindi è possibile utilizzare virsh snapshot-delete --metadata $dom $nameper ogni istantanea per eliminare i file XML sulla sorgente, oppure è possibile eliminarli da/var/lib/libvirt/qemu/snapshots/$guestname


fonti:

  1. mailing list degli utenti di libvirt

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


È comunque troppo lungo per un commento, nessuna preoccupazione. Grazie per il tuo contributo
HBruijn,

Votato perché ti meriti il ​​diritto di commentare :-)
Onnonymous

3

Sì, è sufficiente copiare il file XML e le immagini del disco virtuale, ma ciò ovviamente impedisce una migrazione "live". La macchina virtuale deve essere spenta durante questa procedura.

Una volta copiato nella destinazione, libvirtddeve essere ricaricato o riavviato per riconoscere il nuovo file XML.


Secondo help.ubuntu.com/community/KVM/Virsh e per completare una risposta credo che la sequenza di comandi sarebbe: Sulla fonte Dom0: - Virsh shutdown foo - virsh dumpxml foo> /tmp/foo.xml Quindi sul destinazione Dom0: - Copia sui file del disco e inserendoli nella stessa directory del Dom0 di origine - Copia sul dump XML - virsh create /tmp/foo.xml - virsh start foo
Onitlikesonic

Abbastanza ragionevole se lo usi virsh. Vorrei solo copiare i file direttamente e ricaricare libvirtd.
Michael Hampton

2

Istruzioni dettagliate sulla copia di macchine virtuali utilizzando blocksync.py

Queste istruzioni si applicano a una VM che utilizza un disco fornito da LVM e presuppone che Python si trovi su ciascuno degli host

Scarica lo script blocksync.py da https://gist.github.com/rcoup/1338263 e inserisci l'host di origine e di destinazione nella cartella / home / utente.

Precursore

  • Dovrai avere accesso "ssh" a entrambe le macchine (sorgente e destinazione) per il tuo utente.
  • Dovrai anche avere l'accesso 'sudo' a 'root' su entrambe le macchine.

  • In alternativa, puoi fare tutto come root, ma solo se la tua chiave ssh ti dà l'accesso root almeno al computer di destinazione. ** In questo caso, rimuovere il nome utente dalle righe di comando.

Impostazioni di esempio

  • La macchina virtuale si trova sull'host dom0 noto come chewie
  • La destinazione desiderata sull'host dom0 noto come darth e qui aveva un IP interno 10.10.10.38 (per il nostro esempio)
  • Nel nostro caso reale utilizziamo centos 7 come sistema operativo dom0 su entrambe le macchine
  • La macchina VIRTUALE in questo caso che stiamo spostando si chiama LARRY
  • L'utente che esegue l'azione è USER (che sarà il tuo nome)
  • DOM0 indica il server fisico effettivo

Procedura

Passaggi iniziali sull'host di origine

  • Accedere all'host dom0 che attualmente ha la macchina (l'host "sorgente"), ad esempio:
    ssh user@chewie.domainname.com.au
  • Rimani come tuo utente, quindi non diventare utente sudo * Elenca le macchine con
    sudo virsh: tutti
  • Scarica la definizione della macchina usando, ad esempio:
    sudo virsh dumpxml larry> larry.xml
  • Copia la definizione di dump nella nuova macchina (l'host "target"), ad esempio:

    scp -p larry.xml 10.10.10.38:larry.xml
    è possibile modificare l'ip interno con il nome del server dom0 di destinazione ** Nota: è consigliabile utilizzare l'indirizzo IP per la destinazione, ad es .:
    scp -p larry.xml user@10.10.10.38: larry.xml

    Se non è possibile copiare a causa di chiavi il gatto larry.xml e copiarlo Quindi è possibile ssh in un'altra macchina e creare file e incollarlo.

  • Trova la dimensione e il nome del disco della VM usando

    sudo lvs --units B
    .
    ** Il comando sopra dovrebbe mostrare la dimensione esattamente in byte. ** Il nome del disco della macchina si trova nella prima colonna dell'elenco, il suo gruppo di volumi nella seconda e la dimensione nell'ultima. ** Determina il nome del dispositivo come / dev // ** Verifica con un comando 'll' Ad esempio, in questo output: vm_larry vg1 -wi-ao ---- 69793218560B

LV VG Attr LSize Pool Dati origine% Meta% Sposta registro Cpy% Sincronizzazione Converti
  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

  • Il nome del disco è "vm_larry", il gruppo di volumi è "vg1".
  • Il nome del dispositivo è / dev / vg1 / vm_larry
  • Uscita per es:
    ls -l / dev / vg1 / vm_larry
    è: lrwxrwxrwx. 1 radice radice 8 gennaio 31 13:57 / dev / vg1 / vm_larry -> ../dm-11

Passaggi iniziali sull'host di destinazione

  • Accedi all'host di destinazione, ad es
    ssh user@darth.domainname.com.au
  • Resta come il tuo utente. cioè non diventare root.
  • Creare un file di definizione del volume, ad esempio:

    vi larry.domainname.com.au-vol.xml
    o
    nano larry.domainname.com.au-vol.xml
    con le seguenti righe: NOTA: sarà necessario prendere la dimensione in byte dalla VM originale e inserirla nello script seguente. Il comando sulla macchina di origine per dimensione era 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>
    

Nota: questa definizione è per un disco di 69793218560 byte per larry VM, modificare se necessario per la VM effettiva.

Nota: il nome e l'ultima parte del percorso devono corrispondere e verranno utilizzati come nome del nuovo disco.

Crea il nuovo disco dalla definizione, usando

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

dirà Vol larry.domainname.com.au creato da larry.domainname.com.au-vol.xml

Rendi accessibile il file del dispositivo disco:

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

Modifica la definizione xml copiata, ad esempio:

vi larry.xml

Trova la definizione del disco nel file (cerca "source dev =") e sostituisci il dispositivo con quello appena creato (puoi ls / dev / centos / per vedere vm), ad esempio: / dev / drbd4 -> / dev / CentOS / larry.domainname.com.au

Questo cambio di ponte è stato unico per la nostra situazione.

** Trova eventuali riferimenti a "br1" nelle stanze dell'interfaccia e modificalo in "br0" ad es. Stai cambiando il bridge sorgente in modo che la linea sia così

Passaggi finali sull'host di origine

  • Accedi all'host di origine, ad es

    ssh user@chewie.domainname.com.au

  • La migliore pratica sarebbe quella di spegnere la VM sull'host di origine prima di eseguire la sincronizzazione finale, ma non è necessario. (arresto virsh NameOfMachine)

  • Se non si trova già sull'host di origine, scaricare lo script blocksync.py da https://gist.github.com/rcoup/1338263

  • Se il tuo nome utente è utente (ad esempio), copia lo script blocksync.py in entrambe le macchine in / home / user e chown user: user e chmod 755 lo script.

  • Se non si trova già sull'host di destinazione, copiarlo lì, ad esempio:
scp -p blocksync.py user@10.10.10.38: blocksync.py
  • Usalo per copiare il disco di origine sul disco di destinazione, ad es

Comando che esegue la copia

sudo -E python blocksync.py / dev / vg1 / vm_larry user@10.10.10.38 /dev/mapper/centos-larry.domainname.com.au -b 4194304

Nota: il primo nome del dispositivo è per l'host di origine, come determinato dal comando 'lvs'; questo proviene da un host [[chewie]] di origine.

Nota: questo distruggerà il contenuto del disco di destinazione, assicurati che /dev/mapper/centos-larry.domainname.com.au sia corretto!

Nota: la sincronizzazione richiederà molto tempo: circa 100 secondi per gigabyte, ovvero 90 minuti per un disco da 60 gigabyte.

Tuttavia, è possibile eseguire una sincronizzazione mentre la VM è in uso; le sincronizzazioni successive possono essere fino al 25 percento più veloci

Lo script stamperà i parametri che sta utilizzando (potrebbe esserci un messaggio su un modulo obsoleto, va bene). Successivamente, mostra il comando ssh che sta usando ed esegue (vedrai il messaggio del personale autorizzato solo quando lo fa). Durante la sincronizzazione, visualizzerà un totale parziale di blocchi copiati e la sua velocità media. Infine, stampa un messaggio di completamento con il numero di secondi necessari.

Cose da sapere

È possibile annullare la sincronizzazione con CTRL C e riavviarlo in seguito eseguendo nuovamente il comando

Passaggi finali sull'host di destinazione

  • Accedi all'host di destinazione, ad es
     ssh user@darth.domainname.com.au
  • Creare la macchina virtuale, ad esempio:
    virsh definisce larry.xml
  • Avviare la macchina appena definita, ad esempio:
    sudo virsh avvia larry
  • Contrassegnalo per l'avvio all'avvio dell'host, ad esempio:
    sudo virsh avvio automatico larry

Nota: potrebbe essere necessario modificare i dettagli della VM in base al nuovo ambiente.


Non ho provato questo, ma hai ottenuto il mio voto per le istruzioni dettagliate fornite. Quando arriverà il momento di farlo, ci proverò molto probabilmente.
G Trawo,

1

Ho riscontrato questo problema con un paio dei miei vecchi server KVM, ma è davvero fastidioso quando succede e può causare problemi con qualsiasi VM installata. Nel mio caso ha spinto regolarmente una delle mie macchine virtuali nello stato di ripristino, poiché lo spazio su disco si esauriva lentamente. Le istruzioni seguenti sono in qualche modo sensibili alla versione KVM / Distro. Nel mio caso, ho CentOS 7.5

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

Per impostazione predefinita, le immagini KVM si trovano nella posizione / var / lib / libvirt / images /

È necessario trovare il nome della macchina virtuale, per questo utilizzare l'elenco virsh

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

Arresta il VM virsh stop VM-Name

Per me copio prima il file, anziché spostarlo. Copia il file qcow nella nuova posizione

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

Modifica il file xml VM, in modo che faccia riferimento alla nuova posizione "file sorgente" virsh modifica VM-Name

Dovrai cambiare il "file sorgente" questo file

Riavvia il servizio libvirtd

service libvirtd restart

Quindi riavvia la VM e dovresti essere pronto per partire.

virsh start VM-Name
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.