Richtige Methode zum Verschieben von kvm vm


34

Ich frage mich, wie man eine VM richtig zwischen zwei KVM-Hosts verschiebt, ohne einen gemeinsamen Speicher zu verwenden

Würde es ausreichen, die Festplattendateien und den XML-Speicherauszug vom Quell-KVM-Rechner zum Ziel zu kopieren? Wenn ja, welche Befehle müssen ausgeführt werden, um die VM auf dem Ziel zu importieren?

Das Betriebssystem ist Ubuntu auf Dom0 und DomU.

Danke im Voraus

Antworten:


41
  1. Kopieren Sie die Festplatten der VM vom /var/lib/libvirt/imagessrc-Host in dasselbe Verzeichnis auf dem Zielhost
  2. Führen Sie auf dem virsh dumpxml VMNAME > domxml.xmlQuellhost diese XML aus und kopieren Sie sie auf den Zielhost
  3. auf dem Zielhost ausführen virsh define domxml.xml

Starten Sie die VM.

  • Wenn sich der Speicherort des Datenträgers unterscheidet, müssen Sie die Geräte / den Datenträgerknoten der XML bearbeiten, um auf das Image auf dem Zielhost zu verweisen
  • Wenn die VM an benutzerdefinierte Netzwerke angeschlossen ist, müssen Sie sie entweder aus der XML-Datei auf dem Zielhost heraus bearbeiten oder sie ebenfalls neu definieren ( virsh net-dumpxml > netxml.xmlund die virsh net-define netxml.xml && virsh net-start NETNAME & virsh net-autostart NETNAME).

und was ist, wenn Sie logisches Volume anstelle von Datei als Speicher verwenden ... Ich glaube, ich werde ein Problem mit Gerät uuid haben
inemanja

2
Sie können die Geräte-UUIDs aus der XML- /dev/mapper/vgname-lvname
Datei

10

Da ich noch keinen Kommentar abgeben kann, muss ich diesen Zusatz zu dyasnys Antwort auf diese Weise posten.

Wenn die VM über Snapshots verfügt, die Sie beibehalten möchten, sollten Sie die Snapshot-XML-Dateien virsh snapshot-dumpxml $dom $name > file.xmlfür jeden Snapshot in der Snapshot-Liste der VM in der Quelle sichern virsh snapshot-list --name $dom.

Verwenden Sie dann auf dem Ziel virsh snapshot-create --redefine $dom file.xml, um die Migration der Snapshots abzuschließen.

Wenn es Ihnen auch wichtig ist, welcher Schnappschuss der aktuelle ist, dann machen Sie zusätzlich auf der Quelle:
virsh snapshot-current --name $dom
und auf dem Ziel:
virsh snapshot-current $dom $name

Anschließend können Sie virsh snapshot-delete --metadata $dom $namefür jeden Schnappschuss die XML-Dateien in der Quelle löschen oder sie einfach von löschen/var/lib/libvirt/qemu/snapshots/$guestname


Quellen:

  1. libvirt-users Mailingliste

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


Es ist sowieso zu lang für einen Kommentar, keine Sorge. Vielen Dank für Ihren Beitrag
HBruijn

Upvoted, weil Sie das Recht auf Kommentar verdienen :-)
Onnonymous

3

Ja, es reicht aus, nur die XML-Datei und die Images der virtuellen Festplatte zu kopieren, aber dies schließt offensichtlich eine "Live" -Migration aus. Die VM muss während dieses Vorgangs ausgeschaltet sein.

Nach dem Kopieren in das Ziel libvirtdmuss es neu geladen oder neu gestartet werden, um die neue XML-Datei zu erkennen.


Laut help.ubuntu.com/community/KVM/Virsh und um eine Antwort zu vervollständigen, würde die Befehlsfolge lauten: Auf der Quelle Dom0: - virsh shutdown foo - virsh dumpxml foo> /tmp/foo.xml Dann auf der Ziel-Dom0: - Kopieren Sie die Festplattendateien und legen Sie sie im selben Verzeichnis wie die Quell-Dom0 ab. - Kopieren Sie den XML-Dump. - virsh create /tmp/foo.xml - virsh start foo
Onitlikesonic

Angemessen genug, wenn Sie verwenden virsh. Ich würde einfach die Dateien direkt kopieren und neu laden libvirtd.
Michael Hampton

2

Detaillierte Anweisungen zum Kopieren von VMs mit blocksync.py

Diese Anweisungen gelten für eine VM, die eine von LVM bereitgestellte Festplatte verwendet, und setzen voraus, dass sich Python auf jedem der Hosts befindet

Laden Sie das Skript blocksync.py von https://gist.github.com/rcoup/1338263 herunter und legen Sie sowohl den Quell- als auch den Zielhost in Ihrem Ordner / home / user ab.

Vorläufer

  • Sie müssen für Ihren Benutzer 'ssh'-Zugriff auf beide Computer (Quelle und Ziel) haben.
  • Sie müssen auch auf beiden Rechnern 'sudo'-Zugriff auf' root 'haben.

  • Alternativ können Sie alles als Root ausführen, aber nur, wenn Sie mit Ihrem SSH-Schlüssel als Root mindestens auf den Zielcomputer zugreifen können. ** Entfernen Sie in diesem Fall den Benutzernamen aus den Befehlszeilen.

Beispieleinstellungen

  • Die virtuelle Maschine befindet sich auf dem dom0-Host, der als chewie bezeichnet wird
  • Das gewünschte Ziel auf dem dom0-Host, bekannt als darth, hatte hier eine interne IP 10.10.10.38 (für unser Beispiel)
  • In unserem aktuellen Fall verwenden wir auf beiden Computern Centos 7 als dom0-Betriebssystem
  • Die VIRTUELLE Maschine, die wir in diesem Fall bewegen, heißt LARRY
  • Der Benutzer, der die Aktion ausführt, ist USER (dies ist Ihr Name).
  • DOM0 bedeutet den tatsächlichen physischen Server

Verfahren

Erste Schritte auf dem Quellhost

  • Melden Sie sich bei dem dom0-Host an, auf dem sich derzeit der Computer befindet (der "Quell" -Host), z. B .:
    ssh user@chewie.domainname.com.au
  • Bleiben Sie als Ihr Benutzer, werden Sie also kein sudo-Benutzer
    sudo virsh --all
  • Sichern Sie die Maschinendefinition mit:
    sudo virsh dumpxml larry> larry.xml
  • Kopieren Sie die gedumpte Definition auf den neuen Rechner (den "Ziel" -Host), zB:

    scp -p larry.xml 10.10.10.38:larry.xml
    Sie können die interne IP-Adresse in den Namen Ihres Dom0-Zielservers ändern. ** Hinweis: Am besten verwenden Sie die IP-Adresse für das Ziel, z.
    scp -p larry.xml user@10.10.10.38: larry.xml

    Wenn Sie aufgrund von Schlüsseln die cat larry.xml nicht kopieren und kopieren können, können Sie ssh in eine andere Maschine kopieren und eine Datei erstellen und diese einfügen.

  • Ermitteln Sie die Größe und den Namen der VM-Festplatte mithilfe von

    sudo lvs --units B
    .
    ** Der obige Befehl sollte die Größe genau in Bytes anzeigen. ** Der Laufwerksname des Computers befindet sich in der ersten Spalte der Liste, die Volume-Gruppe in der zweiten und die Größe in der letzten. ** Ermitteln Sie den Gerätenamen als / dev // ** Überprüfen Sie ihn mit einem 'll'-Befehl. Beispiel für diese Ausgabe: vm_larry vg1 -wi-ao ---- 69793218560B

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

  • Der Datenträgername lautet "vm_larry", die Datenträgergruppe "vg1".
  • Der Gerätename lautet / dev / vg1 / vm_larry
  • Ausgabe für zB:
    ls -l / dev / vg1 / vm_larry
    ist: lrwxrwxrwx. 1 root root 8 Jan 31 13:57 / dev / vg1 / vm_larry -> ../dm-11

Erste Schritte auf dem Zielhost

  • Melden Sie sich beim Zielhost an, z
    ssh user@darth.domainname.com.au
  • Bleiben Sie als Ihr eigener Benutzer. dh werde nicht root.
  • Erstellen Sie eine Volume-Definitionsdatei, zB:

    vi larry.domainname.com.au-vol.xml
    oder
    nano larry.domainname.com.au-vol.xml
    mit den folgenden Zeilen: HINWEIS - Sie müssen die Größe in Byte von der ursprünglichen VM übernehmen und in das folgende Skript einfügen. Der Befehl auf dem Quellcomputer für Größe lautete 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>
    

Hinweis: Diese Definition gilt für eine 69793218560-Byte-Festplatte für VM Larry. Ändern Sie sie nach Bedarf für die tatsächliche VM.

Hinweis: Der Name und der letzte Teil des Pfads müssen übereinstimmen und werden als neuer Laufwerksname verwendet.

Erstellen Sie die neue Festplatte aus der Definition mit

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

Es wird Vol larry.domainname.com.au aus larry.domainname.com.au-vol.xml angezeigt

Machen Sie die Datenträger-Gerätedatei zugänglich:

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

Bearbeiten Sie die kopierte XML-Definition, zB:

vi larry.xml

Suchen Sie die Festplattendefinition in der Datei (suchen Sie nach "source dev =") und ersetzen Sie das Gerät durch das soeben erstellte (Sie können ls / dev / centos / verwenden, um vm anzuzeigen), z. B .: / dev / drbd4 -> / dev / centos / larry.domainname.com.au

Dieser Brückenwechsel war einzigartig für unsere Situation.

** Suchen Sie in den Zeilengruppen der Benutzeroberfläche nach Verweisen auf "br1" und ändern Sie sie in "br0", z

Letzte Schritte auf dem Quellhost

  • Melden Sie sich beim Quellhost an, z

    ssh user@chewie.domainname.com.au

  • Die beste Vorgehensweise wäre, die VM auf dem Quellhost herunterzufahren, bevor die endgültige Synchronisierung durchgeführt wird, dies ist jedoch nicht erforderlich. (Virsh Shutdown NameOfMachine)

  • Laden Sie das blocksync.py-Skript von https://gist.github.com/rcoup/1338263 herunter, sofern es nicht bereits auf dem Quellhost vorhanden ist

  • Wenn Ihr Benutzername beispielsweise user ist, kopieren Sie das Skript blocksync.py auf beide Rechner in / home / user und chown user: user und chmod 755 das Skript.

  • Wenn nicht bereits auf dem Zielhost vorhanden, kopieren Sie ihn dorthin, z. B .:
scp -p blocksync.py user@10.10.10.38: blocksync.py
  • Verwenden Sie diese Option, um die Quelldiskette auf die Zieldiskette zu kopieren, z

Befehl, der den Kopiervorgang ausführt

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

Hinweis: Der erste Gerätename gilt für den Quellhost, wie aus dem Befehl 'lvs' ermittelt. Dieser stammt von einem [[chewie]] Quellenhost.

Hinweis: Dies wird zerstören , den Inhalt der Zielscheibe, stellen Sie sicher , dass /dev/mapper/centos-larry.domainname.com.au korrekt ist!

Hinweis: Die Synchronisierung dauert sehr lange - ungefähr 100 Sekunden pro Gigabyte, dh: 90 Minuten für eine 60-Gigabyte-Festplatte.

Sie können jedoch eine Synchronisierung durchführen, während die VM verwendet wird. Nachfolgende Synchronisierungen können bis zu 25 Prozent schneller sein

Das Skript druckt die verwendeten Parameter aus (möglicherweise wird eine Meldung zu einem veralteten Modul angezeigt, dies ist in Ordnung). Anschließend wird der verwendete Befehl ssh angezeigt und ausgeführt (in diesem Fall wird nur die Meldung "Nur autorisierte Mitarbeiter" angezeigt). Während der Synchronisierung werden eine laufende Anzahl kopierter Blöcke und die durchschnittliche Geschwindigkeit angezeigt. Abschließend wird eine Abschlussmeldung mit der Anzahl der Sekunden gedruckt, die sie benötigt hat.

Sachen zu wissen

Sie können die Synchronisierung mit STRG + C abbrechen und später neu starten, indem Sie den Befehl erneut ausführen

Letzte Schritte auf dem Zielhost

  • Melden Sie sich beim Zielhost an, z
     ssh user@darth.domainname.com.au
  • Erstellen Sie die virtuelle Maschine, zB:
    Virsh definieren larry.xml
  • Starten Sie die neu definierte Maschine, zB:
    Sudo Virsh starten Larry
  • Markieren Sie diese Option, um beim Hochfahren des Hosts zu starten. Beispiel:
    sudo virsh autostart larry

Hinweis: Möglicherweise müssen Sie die Details der VM an die neue Umgebung anpassen.


Ich habe dies nicht ausprobiert, aber Sie haben meine Zustimmung zu den detaillierten Anweisungen erhalten. Wenn es Zeit dafür ist, werde ich es höchstwahrscheinlich versuchen.
G Trawo

1

Ich habe dieses Problem bei einigen meiner älteren KVM-Server festgestellt, aber es ist wirklich ärgerlich, wenn es passiert, und kann Probleme mit allen installierten VMs verursachen. In meinem Fall wurde eine meiner VMs regelmäßig in den Reset-Zustand versetzt, da der Festplattenspeicher langsam erschöpft war. Die folgenden Anweisungen sind für die KVM / Distro-Version etwas empfindlich. In meinem Fall habe ich CentOS 7.5

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

Standardmäßig befinden sich die KVM-Images im Verzeichnis / var / lib / libvirt / images /

Sie müssen den Namen der VM finden, für diese Verwendung Virsh-Liste

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

Stoppen Sie den VM-Virsh. Stoppen Sie VM-Name

Für mich kopiere ich die Datei zuerst, anstatt sie zu verschieben. Kopieren Sie die qcow-Datei an den neuen Speicherort

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

Bearbeiten Sie die VM-XML-Datei, um auf den neuen Speicherort der Quelldatei zu verweisen. Bearbeiten Sie den VM-Namen

Sie möchten die "Quelldatei" dieser Datei ändern

Starten Sie den libvirtd-Dienst neu

service libvirtd restart

Starten Sie dann die VM neu und Sie sollten bereit sein zu gehen.

virsh start VM-Name
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.