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
/var/lib/libvirt/images
sur l'hôte src dans le même répertoire sur l'hôte de destinationvirsh dumpxml VMNAME > domxml.xml
et copiez ce fichier xml sur l'hôte de destinationvirsh define domxml.xml
démarrez la VM.
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.
virsh net-dumpxml NETNAME > netxml.xml
virsh net-define netxml.xml && virsh net-start NETNAME & virsh net-autostart NETNAME
)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:
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.
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.
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.
ssh [email protected]
Sudo virsh --all
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.xmlvous 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.
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
ls -l/dev/vg1/vm_larryest: lrwxrwxrwx. 1 racine root 8 31 janvier 13:57/dev/vg1/vm_larry -> ../dm-11
ssh [email protected]
Créez un fichier de définition de volume, par exemple:
vi larry.domainname.com.au-vol.xmlou
nano larry.domainname.com.au-vol.xmlavec 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
** 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
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.
scp -p blocksync.py [email protected]: blocksync.py
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.
Vous pouvez annuler la synchronisation avec CTRL C et la redémarrer plus tard en exécutant à nouveau la commande
ssh [email protected]
virsh define larry.xml
Sudo virsh start larry
Sudo virsh autostart larry
Remarque: il peut être nécessaire de modifier les détails du VM pour l'adapter au nouvel environnement.
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