Xen Migration eines physischen Servers

Vor kurzem stand ich vor der Aufgabe, von einem physischen Server ein exaktes Xen Image zu erstellen, und dies auf einem anderen Server unter Xen zum laufen zu bekommen. Eigentlich eine Standardaufgabe, nur habe ich zu dem Thema wenig im Netz gefunden. Auch zur Erinnerung für mich selber, hier eine kleine Kurzanleitung für Leute die keine langen Erklärungen benötigen.

Das Ziel ist, dass ein virtueller Xen Server die Daten und Funktionen des bestehenden physischen Servers (phys, mit root Partition /dev/sda1 vollständig übernimmt.

Im folgenden verwende ich für den physischen Server an einigen Stellen das Kürzel "phys".

Auf dem Xen-Host Server sollten netcat und dd installiert sein. Zumindest dd sollte man voraussetzen können. Auf einigen Systemen heisst das netcat executable nc. Die Anleitung muss dann natürlich entsprechend angepasst werden.

Inhaltsverzeichnis


Daten übertragen

Zunächst den physischen Server mit Knoppix oder einem vergleichbaren Live-System booten - auf jeden Fall darf die Systempartition nicht gemounted sein.

Nun richten wir auf dem Ziel-Rechner (dem Xen-Host) einen Listener ein, der auf die ankommenden Daten des Server-Images wartet, und diese in eine Datei auf die Festplatte des Xen-Hosts schreibt.

In diesem Fall verwenden wir Port 2222 zur Kommunikation, und übertragen die Daten zunächst in das Verzeichnis /data/phys.

Auf der root-Konsole des Xen-Hosts.


mkdir /data/phys
>cd /data/phys
>netcat -p 2222 -l |dd ibs=8M of=disk.img


Alternativ, wenn Kompression gewünscht wird:


>netcat -p 2222 -l | gzip -d |dd ibs=8M of=disk.img


Man kann gzip an dieser Stelle natürlich auch durch bzip2 oder 7z ersetzen, wenn man bessere Kompression benötigt.


Nun auf dem via Knoppix o.Ä. gebooteten physischen Server, die Festplatte mit dd auslesen, und via netcat an den Xen-Host senden.


>dd if=/dev/sda1 |netcat 192.168.2.191 2222


bzw. alternativ mit Kompression:


>dd if=/dev/sda1 | gzip -c |netcat 192.168.2.191 2222


Xen-Image anpassen

Dann auf dem Xen-Server das soeben übertragene Disk Image als Loopback-Device mounten, um Anpassungen vornehmen zu können:


>mkdir /data/phys/mount
>mount -o loop -t ext3 /data/phys/disk.img /data/phys/mount
>chroot /data/phys/mount


Jetzt /etc/fstab editieren und dort (mindestens) die root Partition und swap auf /dev/hda umstellen. z.B. so:

vim /etc/fstab


/dev/hda1     /     ext3     errors=remount-ro   0     1
proc          /proc proc     rw,nodev,nosuid,noexec              0     0
/dev/hda2     none  swap     sw                    0     0


Nun noch ein paar Schritte, die ich mir in diesem Fall aus /usr/lib/xen-tools/edgy.d abgeschaut habe, da der physiche Server in meinem Fall ein Ubuntu Edgy Eft System beinhaltete.

Bei anderen Distributionen kann man sich auch gut an den Standardprozeduren der Xen-Tools orientieren, die man (zumindest bei Ubuntu) unter /usr/lib/xen-tools/[DISTRIBUTION].d findet.

Also folgende Schritte ausführen:

  • Hardware clock deaktivieren


>/usr/sbin/update-rc.d -f hwclock.sh remove


  • Überflüssige ttys deaktivieren:


>rm /etc/event.d/tty[!1]


  • Netzwerkeinstellung verbessern (sonst kann es zu Paketverlusten kommen)


>echo "" >> /etc/network/interfaces
>echo "post-up  ethtool -K eth0 tx off" >> /etc/network/interfaces


Somit sind die Anpassungen beendet. Sollten noch weitere Anpassungen vor einem ersten boot des Xen-Images nötig sein, ist dies der Punkt an dem man sie durchführen sollte.

Anschliessend verlassen wir das chroot, und geben das Disk image wieder frei.


>exit
>cd /
>umount /data/phys/disk.img


Xen Guest in Betrieb nehmen

Jetzt noch eine Swapdisk erstellen (in diesem Fall mit 2048 MB grösse)


>cd /data/phys
>dd if=/dev/zero of=swap.img bs=1024k count=2048
>mkswap swap.img


Falls die domain Images standardmässig in /xen-images/domains liegen. Im folgenden steht [name] als Platzhalter für den Namen des neu einzurichtenden Xen-Guests


>cd /xen-images/domains
>mkdir /xen-images/domains/[name]
>


Jetzt eine Config-Datei erstellen in /etc/xen/[name].conf z.B. so:


#
#  Kernel + memory size
#
kernel      = '/boot/vmlinuz-2.6.22-14-xen'
ramdisk     = '/boot/initrd.img-2.6.22-14-xen'
memory      = '2048'

#
#  Disk device(s).
#
root        = '/dev/hda1 ro'
disk        = [ 'file:/xen-images/domains/pys/disk.img,hda1,w', 'file:/xen-images/domains/phys/swap.img,hda2,w' ]

#
#  Hostname
#
name        = ' devserver.wpintern.de'

#
#  Networking
#
vif         = [ 'ip=[IP],mac=[MAC]' ]

#
#  Behaviour
#
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'

extra = ' TERM=xterm xencons=tty console=tty1'
vcpus = '2'
<hr/>
---

Wichtig dabei zum Verständnis:

* [IP] und [MAC] bitte durch primäre IP und Mac-Adresse des physischen Servers ersetzen dessen Aufgaben jetzt von dem Xen Image übernommen werden.
  (Wichtig: falls der physiche Server weiterhin im gleichen Netzsegment wie der Xen Server eingesetzt werden soll, muss einer von beiden natürlich seine
 Mac-Adresse ändern. ggf. später)
* Die angegebenen Kernel und initrd images müssen '''ausserhalb''' des Disk images liegen, und müssen Xen untzerstützen 
* Xen hat einen eigenen bootloader (pygrub) daher muss im Image kein Bootloader  installiert werden.

Zum Abschluss noch einen Eintrag in der Hosts-Datei machen, die dem Servernamen und seiner primären IP entspricht.

Dann auf dem Xen-Host mit

<hr/>
<pre>
>xm create /etc/xen/[ name].conf


Den neuen (alten) Xen guest starten.

Und mit


>xm console [name]

beim booten beobachten.


Nachträglich das Dateisystem vergrössern

Das Dateisystem lassen wir erstmal so gross wie es ist - das können wir später so vergrössern: (für 5 GB, z.B. so)

Zuerst xen guest runterfahren, und sicherstellen dass disk.img nicht irgendwie gemounted ist. Dann:


>dd if=/dev/zero bs=1024k count=5000 >> disk.img
>resize2fs -f disk.img


© Kai Londenberg - 2008-2010