web-dev-qa-db-fra.com

Manière correcte de déplacer kvm vm

Je me demande quelle est la bonne façon de déplacer un VM entre deux KVM sans utiliser aucun type de stockage partagé

La copie des fichiers disque et du vidage XML de la source KVM vers la destination suffirait-elle? Si oui, quelles commandes doivent être exécutées pour importer la VM sur la destination?

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

Merci d'avance

40
Onitlikesonic
  1. copiez les disques de la VM depuis /var/lib/libvirt/images sur l'hôte src dans le même répertoire sur l'hôte de destination
  2. sur l'hôte source exécuté virsh dumpxml VMNAME > domxml.xml et copiez ce fichier xml sur l'hôte de destination
  3. sur l'hôte de destination exécuter virsh define domxml.xml

démarrez la VM.

  • Si l'emplacement du disque diffère, vous devez modifier les périphériques/nœud de disque du xml pour pointer vers l'image sur l'hôte de destination
  • Si le VM est attaché à des réseaux personnalisés définis, vous devrez soit les éditer hors du xml sur 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)
47
dyasny

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

Si le VM a 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.xml pour chaque instantané dans la liste des instantanés de VM virsh snapshot-list --name $dom.

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

Si vous vous souciez également de l'instantané qui est l'actuel, faites en plus 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 $name pour 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 des utilisateurs de libvirt

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

10
LN2

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

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

4
Michael Hampton

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

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

Téléchargez le script blocksync.py depuis https://Gist.github.com/rcoup/133826 et placez à la fois l'hôte source et de destination dans votre dossier/home/user.

Précurseur

  • Vous devrez avoir un accès 'ssh' aux deux machines (source et cible) pour votre utilisateur.
  • Vous devrez également avoir 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.

Exemples de paramètres

  • La machine virtuelle est sur l'hôte dom0 appelé chewie
  • La destination souhaitée sur l'hôte dom0 appelé darth et avait une adresse IP interne ici 10.10.10.38 (pour notre exemple)
  • Dans notre cas réel, nous utilisons centos 7 comme système d'exploitation dom0 sur les deux machines
  • La machine VIRTUELLE dans ce cas que 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, alors ne devenez pas un utilisateur de Sudo.
    Sudo virsh --all
  • Videz la définition de la machine en utilisant, par exemple:
    Sudo virsh dumpxml larry> larry.xml
  • Copiez la définition sauvegardée sur la nouvelle machine (l'hôte "cible"), par exemple:

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

    Si vous ne pouvez pas copier à cause des clés le chat larry.xml et le copier Ensuite, vous pouvez ssh dans une autre machine et créer un fichier et le coller.

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

    Sudo lvs - unités B
    .
    ** La commande ci-dessus doit afficher la taille exactement en octets. ** Le nom du disque de la machine se trouve 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 en tant que/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 ---- 1288490188 .____.] 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 root 8 31 janvier 13:57/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 comme votre propre utilisateur. c'est-à-dire ne devenez pas root.
  • Créez un fichier de définition de volume, par exemple:

    vi larry.domainname.com.au-vol.xml
    ou
    nano larry.domainname.com.au-vol.xml
    avec les lignes suivantes: REMARQUE - Vous devrez prendre la taille en octets de l'original VM et mettre dans le script ci-dessous. La commande sur la machine source pour la taille était Sudo lvs --unités 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 de 69793218560 octets pour VM larry, modifiez 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 dira Vol larry.domainname.com.au créé à partir de larry.domainname.com.au-vol.xml

Rendez le fichier du périphérique de disque accessible:

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 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.

** Trouvez toutes les références à "br1" dans les strophes d'interface et changez-le en "br0" par ex. vous changez le pont source donc la ligne est comme ça

Étapes finales sur l'hôte source

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

    ssh [email protected]
  • La meilleure pratique serait d'arrêter le VM sur l'hôte source avant de faire la synchronisation finale mais n'a pas besoin d'être fait. (Virsh shutdown NameOfMachine)

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

  • 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.

  • S'il n'est pas déjà 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 est pour l'hôte source, tel que déterminé à partir de la commande 'lvs'; celui-ci provient d'un hôte [[chewie]] source.

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

Le script affichera les paramètres qu'il utilise (il peut y avoir un message concernant un module obsolète, c'est correct). Ensuite, il affiche la commande ssh qu'il utilise et l'exécute (vous ne verrez que le message du personnel autorisé lorsqu'il le fera). Pendant sa synchronisation, il affichera un total cumulé de blocs copiés et sa vitesse moyenne. Enfin, il imprime un message d'achèvement avec le nombre de secondes nécessaires.

À savoir

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

Étapes finales sur l'hôte cible

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

Remarque: il peut être nécessaire de modifier les détails du VM pour l'adapter au nouvel environnement.

3
Dale Carter

J'ai rencontré ce problème avec quelques-uns de mes anciens serveurs KVM, mais c'est vraiment ennuyeux quand cela se produit et peut causer des problèmes avec n'importe quelle machine virtuelle installée. Dans mon cas, il en a régulièrement poussé un de mes machines virtuelles dans l'état de réinitialisation, car l'espace disque était épuisé lentement. Les instructions ci-dessous sont quelque peu sensibles à la version 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 liste virsh d'utilisation

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

Arrêtez le VM virsh stop VM-Name

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

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

Modifiez le fichier VM xml, pour référencer le 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 le VM et vous devriez être prêt à partir.

virsh start VM-Name
2
gerryamurphy