Frage Richtiger Weg, um kvm vm zu bewegen


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

Würden die Disk-Dateien und der XML-Dump von der Quell-KVM-Maschine zum Ziel kopiert werden? Wenn ja, welche Befehle müssen ausgeführt werden, um die VM auf dem Ziel zu importieren?

OS ist Ubuntu sowohl auf Dom0 als auch auf DomU.

Danke im Voraus


28
2017-10-02 14:20


Ursprung




Antworten:


  1. Kopieren Sie die Festplatten der VM von / var / lib / libvirt / images auf dem src-Host in das gleiche Verzeichnis auf dem Zielhost
  2. auf dem Quellhost ausführen virsh dumpxml VMNAME > domxml.xml und kopiere dieses XML in das Ziel. Wirt
  3. auf dem Zielhost ausführen virsh define domxml.xml

Starten Sie die VM.

  • Wenn sich der Speicherort der Festplatte unterscheidet, müssen Sie den Geräte- / Festplattenknoten des xml so bearbeiten, dass er auf das Image auf dem Zielhost verweist
  • Wenn die VM an benutzerdefinierte definierte Netzwerke angeschlossen ist, müssen Sie sie entweder aus dem XML auf dem Zielhost bearbeiten oder sie neu definieren (virsh net-dumpxml > netxml.xml und das virsh net-define netxml.xml && virsh net-start NETNAME & virsh net-autostart NETNAME)

31
2017-10-02 14:45



und was, wenn logisches Volumen anstelle von Datei als Speicher benutzen ... ich denke, dass ich Problem mit Gerätuuid haben werde - inemanja
Sie können die Geräte-UUIDs aus dem XML-Speicher entfernen, lassen Sie den Pfad einfach /dev/mapper/vgname-lvname Dort - dyasny


Da ich noch keinen Kommentar abgeben kann, muss ich diesen Zusatz zu Dyasnys Antwort auf diese Weise veröffentlichen.

Wenn die VM Snapshots enthält, die Sie beibehalten möchten, sollten Sie die Snapshot-XML-Dateien mit der Datei auf der Quelle sichern virsh snapshot-dumpxml $dom $name > file.xml für jeden Snapshot in der Snapshot-Liste der VM virsh snapshot-list --name $dom.

Dann auf dem Ziel verwenden virsh snapshot-create --redefine $dom file.xml um die Snapshots zu migrieren.

Wenn Ihnen auch wichtig ist, welcher Snapshot der aktuelle Snapshot ist, tun Sie dies zusätzlich an der Quelle:
virsh snapshot-current --name $dom
 und auf dem Ziel:
virsh snapshot-current $dom $name

Dann kannst du verwenden virsh snapshot-delete --metadata $dom $name Für jeden Snapshot, um die XML-Dateien in der Quelle zu löschen, oder Sie können sie einfach 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/


8
2017-12-03 14:46



Es ist sowieso zu lang für einen Kommentar, keine Sorgen. Danke für deinen Beitrag - HBruijn
Upvoted, weil Sie das Recht zu kommentieren verdienen :-) - Onnonymous


Ja, nur das Kopieren der XML-Datei und der Images der virtuellen Festplatte ist ausreichend, aber dies schließt natürlich eine "Live" -Migration aus. Die VM muss während dieses Vorgangs ausgeschaltet sein.

Einmal zum Ziel kopiert, libvirtd muss neu geladen oder neu gestartet werden, um die neue XML-Datei zu erkennen.


3
2017-10-02 14:31



Gemäß help.ubuntu.com/community/KVM/Virsh und um eine Antwort zu vervollständigen, glaube ich, würde die Reihenfolge der Befehle sein: Auf der Quelle Dom0: - virsh shutdown foo - virsh dumpxml foo> / tmp / foo.xml Dann auf dem Ziel Dom0: - Kopieren Sie die Dateien und legen Sie sie auf das gleiche Verzeichnis wie die Quelle Dom0 - Über den XML-Dump kopieren - virsh create /tmp/foo.xml - virsh start foo - Onitlikesonic
Angemessen genug, wenn Sie es benutzen virsh. Ich würde nur die Dateien direkt kopieren und neu laden libvirtd. - Michael Hampton♦


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 und legen Sie Quell- und Zielhost im Ordner "/ home / user" ab.

Vorläufer

  • Sie benötigen für Ihren Benutzer "ssh" Zugriff auf beide Maschinen (Quelle und Ziel).
  • Sie müssen auf beiden Rechnern auch 'sudo' Zugriff auf 'root' haben.

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

Beispieleinstellungen

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

Verfahren

Erste Schritte auf dem Quellenhost

  • Melden Sie sich beim dom0-Host an, auf dem sich die Maschine befindet (der "source" -Host), zB:
    ssh benutzer@chewie.domainname.com.au
  • Bleiben Sie als Ihr Benutzer, also werden Sie kein sudo Benutzer * Maschinen auflisten mit
    sudo virsh --all
  • Dump die Maschinendefinition mit, zB:
    sudo virsh dumpxml larry> larry.xml
  • Kopieren Sie die ausgelagerte Definition auf die neue Maschine (den "Zielhost"), zB:

    scp -p larry.xml 10.10.10.38:larry.xml
      Sie können die interne IP-Adresse zu Ihrem Zieldomänenserver-Namen ändern ** Hinweis: Am besten verwenden Sie die IP-Adresse für das Ziel, z.
    scp -p larry.xml benutzer@10.10.10.38: larry.xml

    Wenn du aufgrund der Schlüssel die cat larry.xml nicht kopieren kannst und kopiere sie Dann können Sie ssh in andere Maschine und Datei erstellen und einfügen.

  • Suchen Sie die Größe und den Namen der Festplatte der VM mit

    Sudo lvs - Einheiten B
    .
    ** Der obige Befehl sollte die Größe genau in Byte anzeigen. ** Der Disk-Name des Rechners befindet sich in der ersten Spalte der Auflistung, seine Volume-Gruppe in der Sekunde und die Größe in der letzten Spalte. ** Ermitteln Sie den Gerätenamen als / dev // ** Überprüfen Sie es mit einem 'll' Befehl Zum Beispiel in dieser Ausgabe: vm_larry vg1 -wi-ao ---- 69793218560B

LV VG Attr LSize Pool Origin Daten% Meta% Move Log Cpy% Sync Konvertieren
  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 Laufwerksname lautet 'vm_larry', die Volume-Gruppe '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 am Ziel-Host an, z
    ssh benutzer@darth.domainname.com.au
  • Bleib als dein eigener Benutzer. d. h. nicht zur Wurzel werden.
  • 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 Bytes von der ursprünglichen VM nehmen und in das folgende Skript einfügen. Der Befehl auf der Quellmaschine für Größe war 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 Festplatte mit 69793218560 Bytes für VM-Larry. Ändern Sie diese für die tatsächliche VM.

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

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 erstellt

Machen Sie die Disk-Device-Datei 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

Finde die Diskdefinition in der Datei (suche nach "source dev =") und ersetze das Gerät durch das gerade erstellte (du kannst ls / dev / centos / um vm zu sehen), zB: / dev / drbd4 -> / dev / centos / larry.domainname.com.au

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

** Finden Sie irgendwelche Verweise auf "br1" in den Schnittstellenzeilen und ändern Sie sie in "br0", z. Sie ändern Source-Brücke, so Linie ist wie folgt         

Letzte Schritte auf dem Quellenhost

  • Melden Sie sich am Quell-Host an, z

    ssh benutzer@chewie.domainname.com.au

  • Die beste Vorgehensweise besteht darin, die VM auf dem Quellhost vor der endgültigen Synchronisierung herunterzufahren, sie muss jedoch nicht ausgeführt werden. (virsh Herunterfahren NameOfMachine)

  • Laden Sie das Skript blocksync.py aus dem Quellverzeichnis herunter, falls noch nicht geschehen https://gist.github.com/rcoup/1338263

  • Wenn Ihr Benutzername ein Benutzer ist (zum Beispiel), dann kopieren Sie das Skript blocksync.py in beide Maschinen in / home / user und chown user: user und chmod 755 das Skript.

  • Wenn nicht bereits auf dem Ziel-Host, kopieren Sie es dort, zB:
scp -p blocksync.py benutzer@10.10.10.38: blocksync.py
  • Verwenden Sie diese Option, um den Quelldatenträger auf den Zieldatenträger zu kopieren, z

Befehl, der das Kopieren ausführt

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

Hinweis: Der erste Gerätename bezieht sich auf den Quellen-Host, wie im Befehl 'lvs' festgelegt. dieser ist von einem [[chewie]] Quell-Host.

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

Hinweis: Die Synchronisierung dauert sehr lange - etwa 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 Parameter, die es verwendet (es kann eine Nachricht über ein veraltetes Modul geben, das ist in Ordnung).  Als nächstes zeigt es den verwendeten ssh-Befehl an und führt es aus (Sie sehen dann die autorisierte Nur-Mitarbeiter-Nachricht).  Während seiner Synchronisierung wird eine laufende Summe der kopierten Blöcke und die Durchschnittsgeschwindigkeit angezeigt.  Schließlich gibt es eine Abschlussmeldung mit der Anzahl der Sekunden aus.

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 am Ziel-Host an, z
     ssh benutzer@darth.domainname.com.au
  • Erstellen Sie die virtuelle Maschine, zB:
    virsh definiert larry.xml
  • Starten Sie die neu definierte Maschine, zB:
    Sudo Virsh Start larry
  • Markieren Sie diese Option, um beim Host-Boot zu starten, z.
    sudo virsh autostart larry

Hinweis: Es kann erforderlich sein, die Details der VM an die neue Umgebung anzupassen.


1
2018-02-04 09:15