Manière correcte de déplacer KVM VM

34

Je me demande quelle est la bonne façon de déplacer une machine virtuelle entre deux hôtes KVM sans utiliser aucun type de stockage partagé

Est-il suffisant de copier les fichiers du disque et le cliché XML de la machine KVM source vers la machine cible? Si tel est le cas, quelles commandes doivent être exécutées pour importer la machine virtuelle sur la destination?

Le système d'exploitation est Ubuntu sur les Dom0 et DomU.

Merci d'avance

Onitlikesonic
la source

Réponses:

41
  1. copier les disques de la machine virtuelle de l' /var/lib/libvirt/imageshôte src dans le même répertoire sur l'hôte de destination
  2. sur l'hôte source, exécutez virsh dumpxml VMNAME > domxml.xmlet copiez ce fichier XML sur l'hôte de destination
  3. sur l'hôte de destination virsh define domxml.xml

démarrez la VM.

  • Si l'emplacement du disque diffère, vous devez éditer le nœud devices / disk du xml pour qu'il pointe vers l'image sur l'hôte de destination.
  • Si la machine virtuelle est attachée à des réseaux définis personnalisés, vous devrez soit les éditer hors du XML sur l'hôte de destination, soit les redéfinir également ( virsh net-dumpxml > netxml.xmlet le virsh net-define netxml.xml && virsh net-start NETNAME & virsh net-autostart NETNAME).
Dyasny
la source
et si utiliser volume logique au lieu de fichier en tant que stockage ... je pense que je vais avoir un problème avec l'appareil uuid
inemanja
2
Vous pouvez retirer le périphérique UUID du xml, il suffit de laisser le chemin /dev/mapper/vgname-lvnamelà - bas
dyasny
10

Comme je ne peux pas encore commenter, je dois poster cet addendum à la réponse de dyasny de cette façon.

Si la machine virtuelle contient des instantanés que vous souhaitez conserver, vous devez vider les fichiers XML de l'instantané sur la source avec virsh snapshot-dumpxml $dom $name > file.xmlpour chaque instantané de la liste des instantanés de la machine virtuelle virsh snapshot-list --name $dom.

Ensuite, sur la destination, utilisez virsh snapshot-create --redefine $dom file.xmlpour terminer la migration des instantanés.

Si vous voulez également savoir quel cliché est le cliché actuel, faites de même sur la source:
virsh snapshot-current --name $dom
et sur la destination:
virsh snapshot-current $dom $name

Ensuite, vous pouvez utiliser virsh snapshot-delete --metadata $dom $namepour chaque instantané pour supprimer les fichiers XML sur la source, ou vous pouvez simplement les supprimer de/var/lib/libvirt/qemu/snapshots/$guestname


Sources:

  1. Liste de diffusion libvirt-users

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

LN2
la source
C'est trop long pour un commentaire de toute façon, pas de souci. Merci pour votre contribution
HBruijn
Voté parce que vous méritez le droit de commenter :-)
anonyme
3

Oui, il suffit de copier le fichier XML et les images de disque virtuel, mais cela empêche évidemment une migration "en direct". La VM doit être éteinte pendant cette procédure.

Une fois copié sur la destination, libvirtdil faut recharger ou redémarrer pour reconnaître le nouveau fichier XML.

Michael Hampton
la source
Selon help.ubuntu.com/community/KVM/Virsh et pour compléter une réponse, je pense que la séquence de commandes serait la suivante: Sur le source source: - virsh shutdown foo - virsh dumpxml foo> /tmp/foo.xml Puis sur le destination Dom0: - Copiez les fichiers du disque et placez-les dans le même répertoire que le fichier source Dom0 - Copiez le dump XML - virsh create /tmp/foo.xml - virsh start foo
Onitlikesonic
Assez raisonnable si vous utilisez virsh. Je viens de copier les fichiers directement et recharger libvirtd.
Michael Hampton
2

Instructions détaillées sur la copie de machines virtuelles à l'aide de blocksync.py

Ces instructions s’appliquent à une machine virtuelle utilisant un disque fourni par LVM et supposent que Python se trouve sur chacun des hôtes.

Téléchargez le script blocksync.py à l' adresse https://gist.github.com/rcoup/1338263 et mettez-le à la fois sur les hôtes source et de destination dans votre dossier / home / user.

Précurseur

  • Vous devez avoir un accès 'ssh' aux deux machines (source et cible) pour votre utilisateur.
  • Vous aurez également besoin d'un accès «sudo» à «root» sur les deux machines.

  • Alternativement, vous pouvez tout faire en tant que root, mais uniquement si votre clé ssh vous donne un accès root à au moins la machine cible. ** Dans ce cas, supprimez le nom d'utilisateur des lignes de commande.

Exemple de paramètres

  • La machine virtuelle est sur l'hôte dom0 appelé chewie.
  • La destination souhaitée sur l'hôte dom0 est connue sous le nom de darth et possède ici une adresse IP interne 10.10.10.38 (pour notre exemple)
  • Dans notre cas actuel, nous utilisons centos 7 comme système d'exploitation dom0 sur les deux machines.
  • La machine VIRTUELLE dans ce cas nous nous déplaçons s'appelle LARRY
  • L'utilisateur effectuant l'action est USER (qui sera votre nom)
  • DOM0 signifie le serveur physique réel

Procédure

Premières étapes sur l'hôte source

  • Connectez-vous à l'hôte dom0 qui possède actuellement la machine (l'hôte "source"), par exemple:
    ssh [email protected]
  • Restez en tant qu'utilisateur pour ne pas devenir utilisateur sudo * Répertoriez les machines avec
    sudo virsh --all
  • Vider la définition de la machine en utilisant, par exemple:
    sudo virsh dumpxml larry> larry.xml
  • Copiez la définition vidée sur la nouvelle machine (l'hôte "cible"), par exemple:

    scp -p larry.xml 10.10.10.38:larry.xml
    vous pouvez remplacer l'ip interne par le nom de votre serveur dom0 de destination ** Remarque: il est préférable d'utiliser l'adresse ip de la cible, par exemple:
    scp -p larry.xml [email protected]: larry.xml

    Si vous ne pouvez pas copier en raison de clés le chat larry.xml et le copier, vous pouvez alors ssh dans une autre machine, créer un fichier et le coller.

  • Recherchez la taille et le nom du disque de la machine virtuelle à l'aide de

    sudo lvs --units B
    .
    ** La commande ci-dessus devrait afficher la taille exactement en octets. ** Le nom du disque de la machine est dans la première colonne de la liste, son groupe de volumes dans la seconde et sa taille dans la dernière. ** Déterminez le nom du périphérique sous la forme / dev // ** Vérifiez-le avec une commande 'll' Par exemple, dans cette sortie: vm_larry vg1 -wi-ao ---- 69793218560B

LV VG Attr LSize Pool Data Origin% 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

  • Le nom du disque est 'vm_larry', le groupe de volumes est 'vg1'.
  • Le nom du périphérique est / dev / vg1 / vm_larry
  • Sortie pour par exemple:
    ls -l / dev / vg1 / vm_larry
    est: lrwxrwxrwx. 1 racine racine 8 janvier 31 13h57 / dev / vg1 / vm_larry -> ../dm-11

Premières étapes sur l'hôte cible

  • Connectez-vous à l'hôte cible, par exemple
    ssh [email protected]
  • Restez en tant que votre propre utilisateur. c'est-à-dire ne devenez pas root.
  • Créez un fichier de définition de volume, par exemple:

    vi larry.nomdedomaine.com.au-vol.xml
    ou
    nano larry.nomdomaine.com.au-vol.xml
    avec les lignes suivantes: NOTE - Vous devrez prendre la taille en octets de la machine virtuelle d’origine et la mettre dans le script ci-dessous. La commande sur la machine source pour la taille était 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>
    

Remarque: cette définition concerne un disque 69793218560 octets pour la machine virtuelle larry, modifiez-la si nécessaire pour la machine virtuelle réelle.

Remarque: le nom et la dernière partie du chemin doivent correspondre et seront utilisés comme nouveau nom de disque.

Créez le nouveau disque à partir de la définition, en utilisant

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

il va dire Vol larry.domainname.com.au créé à partir de larry.domainname.com.au-vol.xml

Rendre le fichier de périphérique de disque accessible:

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

Editez la définition XML copiée, par exemple:

vi larry.xml

Recherchez la définition du disque dans le fichier (recherchez "source dev =") et remplacez le périphérique par celui que vous venez de créer (vous pouvez ls / dev / centos / pour voir vm), par exemple: / dev / drbd4 -> / dev / centos / larry.domainname.com.au

Ce changement de pont était unique à notre situation.

** Recherchez les références à "br1" dans les strophes d'interface et remplacez-le par "br0", par exemple, vous modifiez le pont source de façon à ce que la ligne ressemble à ceci

Dernières étapes sur l'hôte source

  • Connectez-vous à l'hôte source, par exemple

    ssh [email protected]

  • La meilleure pratique consiste à arrêter la machine virtuelle sur l'hôte source avant de procéder à la synchronisation finale, mais cela n'est pas nécessairement le cas. (virsh shutdown NameOfMachine)

  • Si ce n'est pas déjà fait sur l'hôte source, téléchargez le script blocksync.py à l' adresse https://gist.github.com/rcoup/1338263.

  • Si votre nom d'utilisateur est utilisateur (par exemple), copiez le script blocksync.py sur les deux machines dans / home / user et chown user: user et chmod 755 le script.

  • Si ce n'est pas déjà fait sur l'hôte cible, copiez-le là, par exemple:
scp -p blocksync.py [email protected]: blocksync.py
  • Utilisez-le pour copier le disque source sur le disque cible, par exemple

Commande qui fait la copie

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

Remarque: le premier nom de périphérique correspond à l'hôte source, comme déterminé à partir de la commande 'lvs'; celui-ci provient d'un hôte source [[chewie]].

Remarque: ceci détruira le contenu du disque cible, assurez-vous que /dev/mapper/centos-larry.domainname.com.au est correct!

Remarque: la synchronisation prendra beaucoup de temps - environ 100 secondes par gigaoctet, soit 90 minutes pour un disque de 60 gigaoctets.

Cependant, vous pouvez effectuer une synchronisation lorsque la machine virtuelle est en cours d'utilisation. les synchronisations suivantes peuvent être jusqu'à 25% plus rapides

Le script affichera les paramètres qu’il utilise (un message concernant un module obsolète peut apparaître, c’est acceptable). Ensuite, il affiche la commande ssh qu'il utilise et l'exécute (vous verrez alors le message réservé au personnel autorisé uniquement). Lors de sa synchronisation, il affichera le total cumulé des blocs copiés et sa vitesse moyenne. Enfin, il affiche un message d'achèvement avec le nombre de secondes qu'il a pris.

Choses à savoir

Vous pouvez annuler la synchronisation avec CTRL C et la redémarrer ultérieurement en réexécutant la commande.

Dernières étapes sur l'hôte cible

  • Connectez-vous à l'hôte cible, par exemple
     ssh [email protected]
  • Créez la machine virtuelle, par exemple:
    virsh définir larry.xml
  • Démarrer la machine nouvellement définie, par exemple:
    sudo virsh start larry
  • Marquez-le pour qu'il démarre au démarrage de l'hôte, par exemple:
    sudo virsh autostart larry

Remarque: il peut être nécessaire de modifier les détails de la machine virtuelle pour les adapter au nouvel environnement.

Dale Carter
la source
Je n'ai pas essayé cela, mais vous avez eu mon vote positif pour les instructions détaillées fournies. Quand le moment sera venu de faire cela, je vais probablement essayer.
G Trawo
1

J'ai rencontré ce problème avec quelques-uns de mes anciens serveurs KVM, mais c'est vraiment gênant lorsque cela se produit et peut causer des problèmes avec n'importe laquelle des machines virtuelles installées. Dans mon cas, il a régulièrement poussé l'un de mes ordinateurs virtuels dans l'état de réinitialisation, l'espace disque étant épuisé lentement. Les instructions ci-dessous sont quelque peu sensibles à la version de KVM / Distro. Dans mon cas, j'ai CentOS 7.5

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

Par défaut, les images KVM se trouvent à l’emplacement / var / lib / libvirt / images /.

Vous devez trouver le nom de la machine virtuelle, pour cette utilisation, virsh list

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

Arrêtez la VM virsh stop VM-Name

Pour moi, je copie d'abord le fichier plutôt que de le déplacer. Copiez le fichier qcow dans le nouvel emplacement

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

Editez le fichier XML de la VM pour référencer le nouvel emplacement "fichier source" virsh edit VM-Name

Vous voudrez changer le "fichier source" de ce fichier

Redémarrez le service libvirtd

service libvirtd restart

Ensuite, redémarrez la machine virtuelle et vous devriez être prêt à partir.

virsh start VM-Name
gerryamurphy
la source