Ein laufendes Linux klonen / kopieren / sichern

Ich stehe immer wieder mal vor der Herausforderung, eine ganze Linux Installation zu duplizieren oder zumindest in Sicherheit zu bringen.
Z.B. den produktiv laufenden Raspberry Pi im Fitnessstudio, inklusive der aktuellen Konfiguration.
Oder wie jetzt im Moment das Linux auf einem gemieteten Server, bei dem Arbeiten an Festplatten geplant sind, ich aber noch mit ein paar Tests beschäftigt bin, die ich nicht unterbrechen möchte.

In beiden Fällen habe ich keinen direkten Zugriff auf die Geräte. Ich kann also nicht (ohne weiteres) die SD Karte des Raspberries ausbauen und in meinem PC zu Hause kopieren. Und auf den Server kann ich überhaupt nur per SSH zugreifen.

Hier also eine Anleitung für das Klonen eines laufenden Linux Servers.
Alles als root ausführen oder vor jeden Befehl ein sudo setzen.

1. Quell-Rechner vorbereiten

Mein Quellsystem ist ein CentOS 7 mit 3 RAID 5 Arrays auf 4 Festplatten. Ein kleines Array mit 1,5 GB für /boot, noch eines mit 4 GB als swap, ein großes Array für /.
Auf dem großen Array sind nur 160 GB belegt.

Erst einmal möglichst viele Services stoppen, damit z.B. Datenbanken unbeschadet kopiert werden können. Also alles, was Dateien ändert oder blockiert. Bei mir ist das nur der Webserver httpd, denn das ist die primäre Funktion des Servers.

Dann brauchen wir auf dem Quellcomputer nur noch das Tool rsync.
Falls nötig mit yum install rsync installieren und mit rsync --daemon starten.

2. Ziel-Computer vorbereiten, minimales Linux installieren

Als Ziel dient mir eine virtuelle Maschine auf meinem PC mit einer, 200 GB großen, virtuellen Festplatte.
Es könnte aber genauso auch ein kompletter PC sein. Wichtig ist nur, daß die Architektur die selbe ist, und genug Festplattenplatz zur Verfügung steht.
Mit Architektur ist z.B. x86_64 (also 64 Bit Intel/AMD) gemeint.

Die restliche Hardware ist gar nicht so wichtig, da vieles beim Bootvorgang automatisch erkannt wird. Auf die Festplattenkonfiguration gehen wir allerdings noch genauer ein.

Im Internet finden sich einige Anleitungen, bei denen die Boot-Dateien der alten Installation übernommen werden.
Meine Erfahrungen damit waren eher negativ, ich habe es oft nicht geschafft, das kopierte System wieder zu booten.

Also umgehe ich diese Problematik damit, dass ich auf dem Zielgerät erst mal ein minimales Linux installiere, von dem letztendlich aber nur die Partitionierung und die zum booten nötigen Dateien (in /boot) verwendet wird. Alles andere wird gelöscht und mit den Daten vom Quell-System überschrieben.
Dabei sollte natürlich die gleiche Distribution benutzt werden, in meinem Fall also ein Minimal CentOS 7.

 

Auf die Installation gehe ich hier nicht im Detail ein, denn die ist ziemlich selbsterklärend. Die automatisch generierte Partitionierung kann man übernehmen, der Rest ist ziemlich egal, da sowieso alles wieder gelöscht wird.

Wir booten anschließend das minimale Linux, bringen die Filesystem-Tabelle (fstab) in Sicherheit und speichern auch noch die wichtigen Daten der Partitionierung. Denn die wollen wir ja übernehmen. Da das ganze /etc Verzeichnis überschrieben wird, /boot aber erhalten bleibt, parken wir die Dateien einfach dort. Das lsblk Kommando ist übrigens höchst nützlich um Mountpoints, UUIDs etc. einfach anzuzeigen.

[root@cds1 ~]# cp /etc/fstab /boot
[root@cds1 ~]# lsblk -o +FSTYPE -o +UUID >/boot/lsblk.bak
[root@cds1 ~]# cat /boot/lsblk.bak

NAME              MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT UUID
fd0                 2:0    1     4K 0  disk
sda                 8:0    0   200G 0  disk
├─sda1              8:1    0   1.5G 0  part /boot  c7fd4f8a-1d9a-44da-8186-cf45aabd4e52
└─sda2              8:2    0 198.5G 0  part        KTam84-WBBk-ZlvF-Enh4-UcM8-h5U0-YToT6B
├─centos_cds1-root 253:0   0 194.5G 0   lvm /      fd7523a0-4148-4d00-99f0-ce2d90503885
└─centos_cds1-swap 253:1   0     4G 0   lvm [SWAP] 3be0f287-7072-4f16-9055-895c72888d52
sr0                 11:0   1    61M 0   rom        2015-10-29-23-33-06-00

3. Live Linux booten

Nun booten wir das Zielsystem von einer Live-Linux DVD (oder ISO Image), da wir vom installierten minimalen Linux ja nur das /boot Verzeichnis und die Partitionierung benötigen und den Rest löschen wollen.
Was für ein Live-Linux benutzt wird ist relativ egal, die nötigen Tools sollten überall vorhanden sein. Ich nehme jedoch ein Live CentOS 7, das zur kopierten Variante passt.
Alle folgenden Kommandos im Live Linux entweder als root ausführen, oder per sudo.

4. Partitionen des Minimal Linux mounten

Wir müssen wissen, wie das Live-Linux die Partitionen der Minimalinstallation nennt. Ein CentOS benutzt üblicherweise LVM, d.h. wir werfen einen Blick ins /dev/mapper Verzeichnis und finden z.B. folgendes:
[root@live ~]# ll /dev/mapper
total 0
lrwxrwxrwx. 1 root root 7 Jan 5 10:29 centos_cds1-root -> ../dm-0
lrwxrwxrwx. 1 root root 7 Jan 5 10:29 centos_cds1-swap -> ../dm-1
crw-------. 1 root root 10, 236 Jan 5 10:29 control

Die Root-Partition, auf die wir das Quell-Linux kopieren wollen, heißt also centos_cds1-root. cds1 ist der hostname der Minimalinstallation.

Zunächst ein Verzeichnis erstellen, und “/” der Minimalinstallation dort mounten und in dorthin wechseln:
mkdir /mnt/root
mount /dev/mapper/centos_cds1-root /mnt/root
cd /mnt/root

5. Minimal Linux bis auf /boot, /proc, /run, /sys und /dev löschen

Bevor wir das “alte” Linux herüberkopieren sollten wir die Daten der Minimalinstallation löschen. Aber nicht alles, ein paar Dinge kopieren wir nicht.
Das wäre auf jeden Fall /boot, denn dort sind die Boot-Dateien die ich ja gerade NICHT vom Quell-Linux übernehmen will.
Und dann noch die Verzeichnisse, die automatisch generiert werden: /proc, /sys, /run, /dev.
Alles andere wird gelöscht:

cd /mnt/root
find -H . -maxdepth 1 ! \( -name "proc" -or -name "sys" -or -name "dev" -or -name "run" -or -name "." \) -exec rm -rf {} +

Anschließend sollten sich in /mnt/root nur noch die Verzeichnisse boot, proc, sys, run und dev befinden, sonst nichts.

6. Linux mit rsync kopieren

Jetzt die Daten mit Hilfe von rsync kopieren, dabei besagte Verzeichnisse ausschließen. rsync muss dazu auf dem Quell-Linux laufen.

rsync -e ssh --exclude "dev" --exclude "proc" --exclude "run" --exclude "sys" --exclude "boot" -avHAXz root@cds1.tethis-it.at:/ /mnt/root/

Das dauert ein Weile, bei mir mehrere Stunden.
Danach das Live-Linux NICHT neu starten, wir haben noch ein paar Sachen zu erledigen.

Die Kopie würde jetzt schon mit dem Booten beginnen, aber beim Mounten des Root Verzeichnisses scheitern. Das müssen wir korrigieren, in dem wir die kopierte Filesystem-Tabelle /etc/fstab mit der gesicherten Version in /boot überschreiben:

[root@cds1 ~]# cp /boot/fstab /etc
cp: overwrite ‘/etc/fstab’? y

Und fertig…

Das war’s eigentlich. Ich konnte danach die Kopie meines Server ganz normal booten.
Einige Dinge müssen vielleicht noch angepasst werden.
Z.B. hat die Netzwerkkarte mit Sicherheit den Namen geändert und ist jetzt per Default auf DHCP gesetzt.
In /etc/sysconfig/network-scripts findet sich wahrscheinlich eine ifcfg-XXX Datei, wobei XXX der alte Namen der Netzwerkkarte des Quell-Linux ist. Vielleicht möchte man einige dieser Einstellungen übernehmen, was man am einfachsten über das grafische Frontend tun kann.

 

Lass andere teilhaben...

3 Gedanken zu „Ein laufendes Linux klonen / kopieren / sichern“

  1. Danke. Genau die Anleitung,die ich schon Jahre gesucht hab. :) Hab (nach ein paar leichten Änderungen) endlich meinen vServer lauffähig in eine VM ziehen können. Auf die Idee mit der FSTAB bin ich irgendwie nicht gekommen.

    Allerdings hab ich ein paar Anmerkungen:
    In Abschnitt 5 würde ich die Zeile noch um -or -name “sys” ergänzen und in Abschnitt 6 ebenso um
    –exclude “proc”
    Gerade wenn man das Ganze benutzt um ein System für Backup oder Staging zu clonen. Es richtet nicht jeder eine extra Boot-Partition ein,auch wenn das Sinn macht.

    Dann gibts in Abschnitt noch einen Fehler. Die Zeile sieht aus,als würde sie vom Zielsystem aus laufen und nicht vom Quellsystem. Das könnte unter Umständen Probleme mit sich bringen,falls man den Befehl auf der Quelle startet und möglicherweise gleichlautende Verzeichnisse oder wenig Platz auf der HDD hat.

    Bei mir sieht der hintere Teil (unter Debian) so aus: -avHAXz / root@:/mnt/root
    und wird auf dem Quellsystem gestartet.
    Wobei der / die Quelle angibt.

  2. find -H . -maxdepth 1 ! \( -name “proc” -or -name “sys” -or -name “dev” -or -name “run” -or -name “.” \) -exec rm -rf {} +

    Da sollte wohl unbedingt noch

    find -H . -maxdepth 1 ! \(-name “boot” -or -name “proc” -or -name “sys” -or -name “dev” -or -name “run” -or -name “.” \) -exec rm -rf {} +

    also boot rein…?

    1. Hallo!

      Kommt darauf an, ob man den kernel und die boot-Parameter auch sichern möchte, oder?
      Wenn man “boot” in die Ausnahmenliste aufnimmt, braucht man auf der Ziel-Seite ein boot-Verzeichnis mit einem Kernel, der zum Rest der kopierten Installation passt.
      Wenn die Hardware von Quelle und Ziel unterschiedlich ist, könnte das Kopieren von “boot” auch wirklich problematisch sein.

      Ausprobieren, würde ich sagen :)

      LG,

      Christian

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert