Ich kam letztens in die Verlegenheit ein Linux-System schnell auf eine andere Hardware umziehen zu müssen. Also laufendes System auf neue, nackte Hardware. Das zu klonende System war ein Ubuntu von der Stange. Da beiden Systemen 64-Bit-Prozessoren innewohnten stand einer schnellen Migration nichts im Wege. Also noch schnell die neuste Grml-Version 2011.12 (Knecht Rootrecht) geladen und damit die neue Hardware gebootet. Es darf natürlich auch eine andere LiveCD sein, aber ich mag GRML.
Auf der zsh vom GRML angekommen habe ich erstmal die Partitionen gemäß des zu klonenden Systems angelegt.
fdisk /dev/sda
Also eigentlich war es nur eine Systempartition und eine Swap-Partition. Da es um eine Kopie der Daten und nicht der Dateisysteme ging konnte ich die Datenpartition auch größer anlegen. An dieser Stelle kann man die gesamte Partitionsstruktur ändern und Partitionen weglassen oder neue hinzufügen. Man muss nur darauf achten, dass die Daten auch noch in die jeweiligen Ziel-Partitionen passen.
Nun erzeugt man in den erstellten Partitionen die Dateisysteme. In meinem Fall war dies nur die eine Systempartition.
mkfs.ext4 /dev/sda1
Das erzeugte Dateisystem habe ich anschließend gemountet und in dieses gewechselt. Bei mehreren Partitionen müssen diese natürlich entsprechend unterhalb der neuen Root-Partition gemountet werden.
mkdir -p /mnt/sda1
mount /dev/sda1 /mnt/sda1
cd /mnt/sda1
Nun kam der eigentlich wichtige Schritt: das kopieren der Daten. Man sollte auf dem zu klonenden System möglichst alle wichtigen Dienste stoppen, um Inkonsistenzen in den Daten zu vermeiden. Also schaltet man alle laufenden Webserver, Mailserver, etc. ab. Nur der SSH-Server muss noch laufen. Und schon kann der Kopiervorgang aus der GRML-Instanz heraus gestartet werden.
ssh root@OriginalSystem "tar czf - --exclude /proc /" | tar xvzf -
Dieser Aufruf kopiert alle Daten außer das /proc-Pseudo-Dateisystem in das aktuelle Verzeichnis, also auf die neue Platte. Zeit für einen Kaffee. Oder zwei - je nach Plattengröße und Netzwerk.
Wieder zurück, muss das kopierte Linuxsystem noch an die neue Hardwareumgebung angepasst werden. Dafür begeben wir uns in eine chroot-Umgebung innerhalb der gerade kopierten Daten. Doch zuerst müssen wir noch einige wichtige Dateisysteme aus der Live-Umgebung in die chroot-Umgebung einhängen.
mount -o bind /dev /mnt/sda1/dev
mount -o bind /sys /mnt/sda1/sys
mkdir -p /mnt/sda1/proc
mount -t proc /proc /mnt/sda1/proc
Jetzt aber rein in die gute Stube.
chroot /mnt/sda1 /bin/bash
Als erstes sollte man den Bootloader neu installieren und konfigurieren, damit man anschließend auch in das neue System booten kann.
grub-install /dev/sda
update-grub
Nun sollte man sich noch die UUIDs der neuen Partitionen anzeigen lassen und die /etc/fstab entsprechend anpassen.
blkid
vi /etc/fstab
Und schon ist man fertig. Man kann die chroot-Umgebung verlassen, alle Dateisysteme wieder aushängen und neu starten.
exit
cd
umount /mnt/sda1{/dev,/proc,/sys,}
reboot
Hat man nichts vergessen oder falsch gemacht sollte das neue System booten - logisch. Nun kann man sich daran machen, den Hostnamen, das Netzwerk und so weiter anzupassen. Und wer meint, dies sei jetzt aber kompliziert gewesen, der sollte sich mal etwas tiefer mit den Aufbauten und Funktionsweisen von Unix- und Linux-Systemen beschäftigen und dann das gleiche mal mit einem Windows-System probieren.
Und ja, es gibt auch andere schicke Lösungen wie ZFS und Snapshots aber es ging mir ja um den Fall, dass man gerade ein Standard-Linux vor der Nase hat und muss dieses Umziehen. Weitere Fragen, Hinweise und Fehlerkorrekturen bitte in die Kommentare. Und das Backup nicht vergessen!