65 votes

La bonne façon de déplacer une vm kvm

Je me demande quelle est la manière correcte de déplacer une VM entre deux hôtes KVM. sans utiliser aucun type de stockage partagé

Est-ce que copier les fichiers disques et le dump XML de la machine KVM source vers la machine de destination suffirait ? Si oui, quelles commandes doivent être exécutées pour importer la VVM sur la destination ?

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

Merci d'avance

88voto

Andrew T Points 1088
  1. copier les disques de la VM de /var/lib/libvirt/images sur l'hôte src vers le même répertoire sur l'hôte de destination
  2. sur l'hôte source, exécutez virsh dumpxml VMNAME > domxml.xml et copier ce xml sur l'hôte de destination
  3. sur l'hôte de destination, exécutez virsh define domxml.xml

démarrer la VM.

  • Si l'emplacement du disque est différent, vous devez modifier le nœud devices/disk du fichier xml pour pointer vers l'image sur l'hôte de destination.
  • Si la VM est attachée à des réseaux personnalisés, vous devrez soit les modifier dans le fichier xml de l'hôte de destination, soit les redéfinir également.

    1. Sur la machine source virsh net-dumpxml NETNAME > netxml.xml
    2. copier netxml.xml sur la machine cible
    3. Sur la machine cible virsh net-define netxml.xml && virsh net-start NETNAME & virsh net-autostart NETNAME )

14voto

Ewerton Points 1250

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

Si la VM a des snapshots que vous voulez préserver, vous devez vider les fichiers xml des snapshots sur la source avec virsh snapshot-dumpxml $dom $name > file.xml pour chaque snapshot dans la liste des snapshots de la VM virsh snapshot-list --name $dom .

Ensuite, sur la destination, utilisez virsh snapshot-create --redefine $dom file.xml pour terminer la migration des snapshots.

Si vous vous souciez également de savoir quel instantané est le plus récent, alors faites-le en plus sur la source :
virsh snapshot-current --name $dom
et sur la destination :
virsh snapshot-current $dom $name

Vous pouvez alors utiliser virsh snapshot-delete --metadata $dom $name pour chaque instantané pour supprimer les fichiers xml sur la source, ou vous pouvez simplement les supprimer à partir 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/

4voto

Michael Hampton Points 232226

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

Une fois copié sur la destination, libvirtd doit être rechargé ou redémarré pour reconnaître le nouveau fichier XML.

3voto

Dale Carter Points 31

Instructions détaillées sur la copie des VMs en utilisant blocksync.py

Ces instructions s'appliquent à une VM utilisant un disque fourni par LVM et supposent que Python est sur chacun des hôtes

Téléchargez le script de blocksync.py à partir de https://gist.github.com/rcoup/1338263 et le placer sur l'hôte source et l'hôte de destination dans votre dossier /home/user.

Précurseur

  • Vous devrez disposer d'un accès "ssh" aux deux machines (source et cible) pour votre utilisateur.

  • Vous devrez également disposer d'un accès 'sudo' à 'root' sur les deux machines.

  • Vous pouvez également tout faire en tant que root, mais seulement 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.

Exemples de réglages

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

Procédure

Étapes initiales sur l'hôte source

  • Connectez-vous à l'hôte dom0 qui possède actuellement la machine (l'hôte "source"), par exemple : ssh user@chewie.domainname.com.au

  • Restez en tant que votre utilisateur, donc ne devenez pas sudo user *Liste des machines avec sudo virsh --all

  • Dump 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.xmlvous pouvez changer l'ip interne par le nom de votre serveur dom0 de destination. \*\* Note : il est préférable d'utiliser l'adresse IP de la cible, par exemple :    scp -p larry.xml user@10.10.10.38:larry.xml

    Si vous ne pouvez pas copier à cause des clés, faites le chat larry.xml et copiez-le. Ensuite, vous pouvez vous connecter à une autre machine, créer le fichier et le coller.

  • Trouvez la taille et le nom du disque de la VM en utilisant

    sudo lvs --units B.  

    ** La commande ci-dessus devrait montrer la taille exacte en octets. ** Le nom du disque de la machine est dans la première colonne de la liste, son groupe de volume dans la deuxième, et la taille dans la dernière. ** Déterminez le nom du périphérique comme étant /dev//. ** Vérifiez-le avec une commande 'll'. Par exemple, dans cette sortie : vm_larry vg1 -wi-ao---- 69793218560B

    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

  • Le nom du disque est 'vm_larry', le groupe de volume est 'vg1'.

  • Le nom du périphérique est /dev/vg1/vm_larry

  • Sortie par exemple : ls -l /dev/vg1/vm_larryest : lrwxrwxrwx. 1 root root 8 Jan 31 13:57 /dev/vg1/vm_larry -> ../dm-11

Étapes initiales sur l'hôte cible

  • Connectez-vous à l'hôte cible, par exemple ssh user@darth.domainname.com.au
  • Restez votre propre utilisateur, c'est-à-dire ne devenez pas root.
  • Créer un fichier de définition de volume, par exemple :

    vi larry.domainname.com.au-vol.xmlo    nano larry.domainname.com.au-vol.xmlavec les lignes suivantes : NOTE - Vous devrez prendre la taille en octets de la VM originale 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>

Note : cette définition est pour un disque de 69793218560 Bytes pour la VM larry, changez si nécessaire pour la VM 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 dira Vol larry.domainname.com.au créé à partir de larry.domainname.com.au-vol.xml

Rendre accessible le fichier de l'unité de disque :

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

Modifiez la définition xml copiée, par exemple :

vi larry.xml

Trouvez la définition du disque dans le fichier (recherchez "source dev =") et remplacez le périphérique par celui qui vient d'être créé (vous pouvez ls /dev/centos/ pour voir le vm), par exemple : /dev/drbd4 -> /dev/centos/larry.domainname.com.au

Ce changement de pont était unique dans notre situation.

** Trouvez toutes les références à "br1" dans les strophes de l'interface et remplacez-les par "br0".

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

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

    ssh user@chewie.domainname.com.au
  • La meilleure pratique serait d'arrêter la VM sur l'hôte source avant de faire la synchronisation finale, mais cela n'est pas nécessaire. (virsh shutdown NomDeLaMachine)

  • S'il n'est pas déjà sur l'hôte source, téléchargez le script de blocksync.py à partir de https://gist.github.com/rcoup/1338263

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

  • S'il n'est pas déjà sur l'hôte cible, copiez-le là, par exemple :

    scp -p blocksync.py user@10.10.10.38:blocksync.py

  • Utilisez-le pour copier le disque source sur le disque cible, par exemple

Commande qui effectue la copie

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

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

Remarque : cela détruire 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 pendant que la VM est en cours d'utilisation ; les synchronisations suivantes peuvent être jusqu'à 25 % plus rapides.

Le script imprime les paramètres qu'il utilise (il peut y avoir un message sur un module déprécié, c'est correct). Ensuite, il affiche la commande ssh qu'il utilise et l'exécute (vous verrez le message réservé au personnel autorisé lorsqu'il le fera). Pendant la synchronisation, il affiche le nombre total de blocs copiés et sa vitesse moyenne. Enfin, elle imprime un message d'achèvement avec le nombre de secondes qu'elle a pris.

Ce qu'il faut savoir

Vous pouvez annuler la synchronisation avec CTRL C et la relancer plus tard en exécutant à nouveau la commande

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

  • Connectez-vous à l'hôte cible, par exemple ssh user@darth.domainname.com.au
  • Créer la machine virtuelle, par exemple : virsh define 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 VM pour l'adapter au nouvel environnement.

2voto

gerryamurphy Points 51

J'ai rencontré ce problème avec quelques uns de mes anciens serveurs KVM, mais c'est vraiment ennuyeux quand ça arrive, et ça peut causer des problèmes avec n'importe laquelle des VM installées. Dans mon cas, il a régulièrement poussé l'une de mes VM dans l'état de réinitialisation, car l'espace disque était lentement épuisé. 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 sont situées /var/lib/libvirt/images/

Vous devez trouver le nom de la VM, pour cela utilisez 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. Copier le fichier qcow vers le nouvel emplacement

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

Modifiez le fichier xml de la VM, pour faire référence au nouvel emplacement du "fichier source". virsh edit VM-Name

Vous voudrez changer le "fichier source" ce fichier

Redémarrez le service libvirtd

service libvirtd restart

Redémarrez ensuite la VM et vous devriez être prêt.

virsh start VM-Name

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X