Montag, 29. April 2013

P2V - Clone eines Linux Systems (OpenSuse) mit Boardmitteln

Ausgangspunkt war ein altes Linux System mit OpenSuse 11.3 das ich virtualisieren wollte. Die Anwendungen waren eine Oracle DB und ein Wiki dessen Lebenszeit dem Ende zuging. Zudem war die Hardware mehr als genug für diese Zwecke. Also war mein erster Gedanke den ESX-Converter von VMware zu nehmen.
Der ESX Converter existiert nur noch in einer alten Version mit der man auf ESX Systemen größer als Version 4.X nichts mehr mit anfangen kann. Die Windows Version wollte ich nicht auf meine bestehenden Server installieren. Also mußte eine andere Variante her.

Zum Clonen mit Boardmitteln benötigen wir:
- Ein ESX Server
- eine VM-Config für das zukünftige Linux-System inkl. Festplatten und Netzwerk wie im Original System
- SSH Zugang zum alten Linux System

Das Original System:
CPU:  4xXEON ohn HT
RAM: 8GB
HDD: sda und sdb mit jeweils mehren hundert Gigabyte Größe
App: Apache, Perl-Wiki, PostgreSQL-DBs, Oracle-DB mit APEX
OS: OpenSuse 11.3

Das Clone System:
- läuft auf ESX5
- HDD, RAM und NICs identisch in Anzahl bzw. Größe konfiguriert

Prinzip-Ablauf:
Auf dem Clone System mit einer Rescue System booten und die Festplatten-Inhalte per dd Command und der Secure Shell in die Raw Device der virtuellen Maschine schreiben.e


################################################################
# Auf Original-System:
################################################################


# Ausgabe der Partitions Tabellen in eine Datei

sfdisk -d /dev/sda > partition_sda.txt
sfdisk -d /dev/sdb > partition_sdb.txt

# Bei Bedarf anpassen
# Beispiel Ausgabe 
# partition table of /dev/sdb
unit: sectors

/dev/sdb1 : start=       63, size=398294721, Id=83
/dev/sdb2 : start=        0, size=        0, Id= 0
/dev/sdb3 : start=        0, size=        0, Id= 0
/dev/sdb4 : start=        0, size=        0, Id= 0



################################################################
# Clone-System:
################################################################

# Rescue Disk booten - OpenSuse 12.3 (Network ISO)

# Netzwerk Zugriff einrichten

# IP Adresse hinzufügen
ip addr add 192.168.0.40/24 dev eth0
# Std-Gateway setzen
ip route add default via 192.168.0.1 dev eth0
# Prüfung
ip addr
ip route


# SSH Daemon starten
rcsshd start
# Root Passwort zur Anmeldung setzen
passwd root


################################################################
# Auf Original-System:
################################################################

# Beschreibung der Partitionstabellen kopieren
scp ./partition_sd*.txt root@192.168.0.40:/root

################################################################
# Clone-System:
################################################################

# Einspielen der Partition-Table
sfdisk /dev/sda < partition_sda.txt
sfdisk /dev/sdb < partition_sdb.txt


################################################################
# Auf Original-System:
################################################################

# Dienste stoppen
/etc/init.d/oracle_stop_all
rcpostgresql stop
rcapache2 stop
rcsmb stop
rcnmb stop
rcwinbind stop
cnfsserver stop
rccups stop
rcrpcbind stop
rcpostfix stop

# Alle Cronjobs deaktivieren
crontab -e

# Daten Blockweise kopieren, bei Bedarf mit Gzip o.ä.
dd if=/dev/sda1  | ssh 192.168.0.40 dd of=/dev/sda1 # Swap-Part.
dd if=/dev/sda2  | ssh 192.168.0.40 dd of=/dev/sda2 # Root-Part.
dd if=/dev/sdb1  | ssh 192.168.0.40 dd of=/dev/sdb1 # Data-Part.

# Bsp mit gzip
# dd if=/dev/sda1 | gzip  --fast -c  | ssh 192.168.0.40 "gzip -d -c | dd of=/dev/sda1"

# Die Komprimierung mittels Gzip lohnt sich nicht
# Die Zeit für die Komprimierung ist sehr hoch und der Gewinn niedrig da die Daten sich schlecht    
# komprimieren lassen. Man könnte höchstens den leeren Festplattenplatz mittels einer risiegen Datei 
# mit 0 oder 1 beschreiben und dann löschen. Dann könnte Gzip diesen leeren Festplattenplatz gut 
# komprimieren. 

################################################################
# Clone-System:
################################################################

# Log des Filesystems zurücksetzen, da während des Kopiervorganges Änderungen am System  wahrscheinlich durchgeführt wurden

# XFS Log zurücksetzen
xfs_repair -L /dev/sda2
xfs_repair -L /dev/sdb1

# Ausgabe könnte so aussehen
xfs_repair -L /dev/sdb1
Phase 1 - find and verify superblock...
Phase 2 - using internal log
        - zero log...
        - scan filesystem freespace and inode maps...
block (1,10584775-10584775) multiply claimed by cnt space tree, state - 2
agi_freecount 214, counted 215 in ag 1
sb_ifree 1071, counted 1072
        - found root inode chunk
Phase 3 - for each AG...
        - scan and clear agi unlinked lists...
        - process known inodes and perform inode discovery...
        - agno = 0
        - agno = 1
corrupt block 0 in directory inode 268435745
        will junk block
no . entry for directory 268435745
no .. entry for directory 268435745
problem with directory contents in inode 268435745
cleared inode 268435745
data fork in ino 363511577 claims free block 22729164
imap claims a free inode 369521264 is in use, correcting imap and clearing inode
cleared inode 369521264
imap claims a free inode 369521266 is in use, correcting imap and clearing inode
cleared inode 369521266
imap claims a free inode 369521286 is in use, correcting imap and clearing inode
cleared inode 369521286
imap claims a free inode 369521290 is in use, correcting imap and clearing inode
cleared inode 369521290
        - agno = 2
        - agno = 3
        - process newly discovered inodes...
Phase 4 - check for duplicate blocks...
        - setting up duplicate extent list...
        - check for inodes claiming duplicate blocks...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
entry "maildrop" at block 0 offset 312 in directory inode 805306538 references free inode 268435745
        clearing inode number in entry at offset 312...
Phase 5 - rebuild AG headers and trees...
        - reset superblock...
Phase 6 - check inode connectivity...
        - resetting contents of realtime bitmap and summary inodes
        - traversing filesystem ...
bad hash table for directory inode 805306538 (no data entry): rebuilding
rebuilding directory inode 805306538
        - traversal finished ...
        - moving disconnected inodes to lost+found ...

disconnected inode 369520539, moving to lost+found
disconnected inode 369520540, moving to lost+found
disconnected inode 369521250, moving to lost+found
disconnected inode 369521251, moving to lost+found
disconnected inode 369521291, moving to lost+found
Phase 7 - verify and correct link counts...
resetting inode 805306538 nlinks from 16 to 15
done

# Ich habe keine Daten verloren! Und ich habe das Verfahren mehrfach angewendet.
# Deshalb habe ich auch die DBs heruntergefahren! Selbst mit allen laufenden Programmen geht es gut

# Boot-Konfig anpassen

# Vorbereitung 
# Ich befinde mich noch auf der Rescue Konsole der Rettungs-DVD von OpenSuse!!!
# Diese Verzeichnisse werden benötigt um die folgenden Konfig-Programme wie Grub2 korrekt laufen zu lassen

mount /dev/sda2 /mnt/
mount /dev/sdb1 /mnt/var/
mount --bind /dev   /mnt/dev
mount --bind /proc  /mnt/proc

# Ändere Root 
chroot /mnt

# GRUB neu einspielen
# Bei Grub Fehler 21:
# Error 21: Selected disk does not exist
grub-install --recheck /dev/sda

# Ansonsten nur dieses hier
grub --batch < /etc/grub.conf

# Noch in der chroot Umgebung? Wichtig für die Pfadangabe

vi /boot/grub/menu.lst # Alte HDD Verweise durch neue ersetzen
# Hier /dev/disk/by-label durch /dev/sda2

# RAM-Disk neu erstellen
mkinitrd
Ausgabe:
Kernel image:   /boot/vmlinuz-2.6.34.10-0.6-default
Initrd image:   /boot/initrd-2.6.34.10-0.6-default
Root device:    /dev/sda2 (mounted on / as xfs)
Kernel Modules: scsi_mod aacraid thermal_sys thermal libata ata_piix ata_generic processor fan exportfs xfs scsi_transport_spi mptbase mptscsih mptspi sd_mod 
Features:       block resume.userspace resume.kernel
Bootsplash:     openSUSE (1024x768)
38025 blocks

Kernel image:   /boot/vmlinuz-2.6.34.10-0.6-desktop
Initrd image:   /boot/initrd-2.6.34.10-0.6-desktop
Root device:    /dev/sda2 (mounted on / as xfs)
Kernel Modules: scsi_mod aacraid thermal_sys thermal libata ata_piix ata_generic processor fan exportfs xfs scsi_transport_spi mptbase mptscsih mptspi sd_mod 
Features:       block resume.userspace resume.kernel
Bootsplash:     openSUSE (1024x768)
38129 blocks

# Mountpoints anpassen
vi /etc/fstab

# Änderung für die Home-Partition 
# Wurde von /home nach /var/home verschoben. Damit aber die Apps 
# nichts davon bemerken machen wir hier ein Rebind und tragen diesen 
# in die /etc/fstab ein

/var/home            /home               none                              0 0

# Da neue NICs auch neue MAC-IDs mitbringen, würden neue Einträge erstellt werden
# Dies wird hiermit verhindert!
vi /etc/udev/rules.d/70-persistent-net.rules

# Ausgabe
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:AA:BB:CC:11:22", ATTR{type}=="1", KERNEL=="wlan*",NAME="wlan0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*",TTR{address}=="00:AA:BB:CC:11:23", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# IP Adressen anpassen, da Altsystem noch läuft
# Entweder neues System und neue IP
# oder altes System neue IP und neues System behält die alten bei.

# Auf dem Original System ==> vi /etc/sysconfig/network/ifcfg-eth0 und die IP ändern

# Reboot der Clone Systems
reboot

Das sollte es gewesen sein. Hiernach ist das alte System unter einer anderen IP erreichbar bzw. ausgeschaltet. Und das neue System (Clone) behält die alte IP und kann nach starten der gestoppten Dienste weitermachen wie bisher.
Die Dauer der Umstellung hängt das allein von den Datenmengen ab die kopiert werden müssen.
Ich mußte 230 GB Daten kopieren, bei 1GBit Netzwerk, sind das rund 1 Stunde und 20 min bei ca. 50 MB/sec.