Archive for the 'XenServer' Category

VM exportieren und importieren über SSH

Sonntag, Juli 1st, 2012

Der herkömmliche Weg

Eine XenServer-VM exportieren und importieren über das CLI ist simpel. Man mountet auf beiden XenServern (auf dem ex- und importierenden) einen NFS-Server (z.B. nach /mnt):

mount 10.10.10.10:/nfs /mnt

und startet dann den Export der virtuellen Maschine BLUBB:

xe vm-export vm=BLUBB filename=/mnt/BLUBB.xva

Das dauert dann eine Weile, bis alle Daten in diese Datei geschrieben worden sind. Wenn das fertig ist, startet man den Import auf dem zweiten XenServer:

xe vm-import filename=/mnt/BLUBB.xva

und wartet wieder, bis auch das abgeschlossen ist. Diese ganze Geschichte hat nur einen Haken: man braucht im Idealfall soviel Festplattenplatz, wie in der VM an Festplattenplatz genutzt wird (also gerade aktive Daten auf der VM-Platte) – im schlimmsten Fall aber soviel Platz, wie die virtuelle Festplatte gross ist. Ein Beispiel:

  • ein CentOS wird auf einer 100GB virtuellen Festplatte installiert
  • bei der Installation werden 2GB an Daten auf diese Festplatte geschrieben
  • wird die VM jetzt exportiert, wird die Exportdatei etwa 2GB groß
  • jetzt schreibt man zusätzlich 98GB an Daten in der VM auf die virtuelle Festplatte und löscht diese Daten dann wieder
  • wird die VM jetzt exportiert, wird die Exportdatei etwa 100GB groß, man braucht also 100GB auf dem NFS-Server.

Das zeigt, dass beim Löschen von Dateien nicht der Inhalt selbst gelöscht wird (und ausgenullt oder überschrieben wird), sondern nur entsprechende Verweise in der Dateisystemstruktur gelöscht werden. Um diese Dateien wirklich zu Löschen müsste man den freien Speicher der Festplatte mit Nullen oder Zufall überschreiben. Sollte man sich für ersteres entscheiden, hat dies auch beim Export wieder den Vorteil, dass die Datei kleiner wird.

Der SSH-Weg

Es gibt aber auch einen Weg den Import und Export einer VM gleichzeitig zu erledigen:

ssh SERVER-A-IP „xe vm-export vm=BLUBB filename=“ | xe vm-import filename=/dev/stdin

Nochmal zur Erläuterung, was passieren soll: Man will eine VM von Server A nach Server B verschieben, ohne sie temporär irgendwo abzulegen. Um dies zu erreichen, meldet man sich auf Server B an und startet eine SSH-Sitzung zu Server A. Das Kommando, welches durch SSH auf A ausgeführt wird, exportiert die VM, schreibt sie aber nicht in eine Datei. Wenn beim xe vm-export der filename leer bleibt, geht die Ausgabe nach stdout und das wird durch SSH zum Server B transportiert. Nun muss nur noch die Ausgabe an vm-import gegeben werden. Leider funktioniert hier der Parameter filename etwas anders und holt sich die Eingabe nicht von stdin. Aber das ist insofern kein Problem, als dass stdin auch über eine Datei angesprochen werden kann (/dev/stdin).

Auch hier gilt: sollte viel auf der Festplatte der VM herumgeschrieben worden sein, dauert der Export mitunter sehr lange. Aber man erspart sich das Speichern auf einem NFS-Server oder einem anderen Medium.

 

Ubuntu 10.04 HVM to PV

Freitag, Februar 24th, 2012

Wenn man ein Ubuntu als vollvirtualiserte Maschine hat (z.B. wenn man eine physikalische Maschine virtualisiert hat), dann kann man es nachträglich recht einfach in eine paravirtualisierte VM umbauen. Dazu muss der Kernel passen und die Konsoleneinstellungen müssen in der VM angepasst werden. Danach werden ein paar HVM-Einstellungen geleert und der PV-Bootloader festgelegt.

  1. Ubuntu Gast-Einstellungen:
    1. # apt-get update && apt-get install linux-image-generic-pae
      (oder  entsprechenden amd64-Kernel)
    2. # cp /etc/init/tty1.conf /etc/init/hvc0.conf
      Mit beliebigem Editor /etc/init/hvc0.conf editieren und alle vorkommenden tty1 durch hvc0 ersetzen und die Datei speichern.
    3. # shutdown -P now
      Die VM herunterfahren.
  2. XenServer-Einstellungen
    Auf der Konsole des XenServers müssen einige Einstellungen der VM angepasst werden
    1. # xe vm-list power-state=halted
      Zeigt alle abgeschalteten VMs an. Hier die gewünschte VM heraussuchen und die UUID notieren
    2. # xe vm-param-set uuid=UUID HVM-boot-policy=
      UUID durch die vorher ermittelte ersetzen. HVM-boot-policy wird ein leerer Wert zugewiesen
    3. # xe vm-param-set uuid=UUID PV-bootloader=pygrub
      Der Bootloader für die VM wird auf pygrub geändert.
    4. # xe vm-disk-list uuid=UUID
      Zeigt alle der Festplatte zugeordneten Festplatten an. Hier wird die UUID der VBD mit der ID 0 gesucht.
    5. # xe vbd-param-set uuid=VBD_UUID bootable=true
      Diese VBD wird als bootfähig markiert
    6. # xe vm-start uuid=UUID
      VM starten
  3. Gasterweiterungen in der VM installieren
    1. xs-tools.iso bei der VM einlegen
    2. # mount /dev/xvdd /mnt
      In der VM die CD mounten (ggf. die Device- und Ordnernamen anpassen)
    3. # cd /mnt/Linux; ./install.sh
      Gasterweiterungen installieren
      # dpkg -i /mnt/Linux/xe-guest-utils*i386.deb
      (oder statt i386.deb amd64.deb fuer 64bit-Systeme)
    4. # sudo reboot
      VM neustarten

Nach dem Starten der VM muss man meist das XenCenter neustarten, da er sonst keine Eingabe in der Konsole der VM erlaubt.

Diese Prozedur funktioniert sowohl bei Ubuntu 10.04 als auch bei 8.04 und 8.10. Die Namen der Kernel-Images unterscheiden sich zwar hier und da, der grobe Ablauf ist aber der selbe.

 

VMs beenden

Freitag, Februar 24th, 2012

Es gibt mehrere Möglichkeiten um VMs zu beenden. Der einfachste: im XenCenter ein Shut Down auslösen. Das hilft aber nicht immer, dann funktioniert meist ein Force Shut Down.

Heute hatte ich es, dass alle vollvirtualisierte VM keine Konsole mehr angezeigt hat – keinerlei Bild kam, noch nichteinmal irgendwas schwarzes. Auch auf der Konsole haben sich die VMs nicht beenden lassen. Ich bekam lediglich die Meldung, dass noch eine Operation ausgeführt wird. Auch ein xe task-list und xe task-cancel haben das nicht behoben.

Hier hat dann folgender Thread geholfen: http://forums.citrix.com/thread.jspa?threadID=274697&start=15&tstart=0. Der Thread ist zwar fuer XenServer 5.6, es trifft aber auch auf XenServer 6.0.0 zu.

Um es hier nochmal kurz zusammenzufassen:

  1. VM-UUID herausfinden:
    # xe vm-list name-label=XYZ_VM params=uuid
    uuid ( RO)    : ddf7adee-13ff-85d8-d631-8287359f84dc
  2. Domain-ID mittels der UUID der VM herausfinden:
    #  list_domains |grep ddf7adee-13ff-85d8-d631-8287359f84dc
    44 | ddf7adee-13ff-85d8-d631-8287359f84dc |    B H
  3. Die ID 44 dann zum zerstören der Domain verwenden:
    # /opt/xensource/debug/destroy_domain -domid 8
  4. Nun die VM neustarten:
    # xe vm-reboot uuid=ddf7adee-13ff-85d8-d631-8287359f84dc force=true
Danach sollte die VM neustarten und auch wieder verfügbar sein. Um zu testen, ob wirklich wieder alles in Ordnung ist, empfiehlt es sich, die VM nochmal herunterzufahren und dann neuzustarten (kein reboot, ein richtiger Shutdown). Ich hatte hier das Problem, dass ich eine Meldung bekommen habe: 24.02.2012 23:15:33 Error: Starting VM ‚XYZ_VM‘ – The VDI is not available. Das lässt sich am einfachsten durch ein Kopieren der VM beheben (Fastcopy reicht). Die Kopie sollte problemlos starten. Das Original kann dann einfach gelöscht werden.