Spiegelung eines Linux-Systems

Im Laufe der Zeit wird der so schön eingerichtete Linux-PC immer unentbehrlicher, so dass früher oder später die Frage auftaucht, was man denn eigentlich macht, wenn das System z.B. durch einen Ausfall der Festplatte plötzlich nicht mehr verfügbar sein sollte.

Mit dem Kommando "tar" kann man zumindest Backups der wichtigsten Verzeichnisse (wie "/etc", "/root", "/home" usw.) und veränderlichen Dateien (z.B. in "/var") erstellen, so dass man das System durch eine Neuinstallation und das Zurückkopieren der gesicherten Dateien wieder herstellen kann.

Aufwendigere Absicherungen wie ausfallsichere Server, Hochverfügbarkeitssysteme oder professionelle Datensicherungen kommen aus Zeit- und Kostengründen oft nicht in Betracht, besonders nicht im häuslichen Netzwerk. Zudem ist die Wiederherstellung eines Systems aus den Datensicherungen zeitaufwendig.

Hat man auf einem der Linux-PCs im Netzwerk noch ausreichend Platz übrig, kann man den Server auch komplett "spiegeln". Fällt der Server-Rechner dann aus, kann das gespiegelte System diesen nach wenigen Minuten ersetzen. Läuft der Server dann wieder, kann umgekehrt das Originalsystem aus dem gespiegelten System wieder hergestellt werden.

Eine reguläre Datensicherung, bei dem die Backup-Datenträger mit verschiedenen Sicherungsständen an sicheren Orten aufbewahrt werden, ersetzt dieses Verfahren natürlich nicht.

Die Idee zu einem gespiegelten Server stammt aus dem Artikel "Server-Spiegelei" von Conny Dittmann, erschienen im Linux-Magazin Heft 4/2002, S. 99.


   Verzeichnisse einrichten bzw. kopieren

Das Verfahren wird hier an einem Beispiel beschrieben (s. Bild 1). Auf dem Rechner PC1 befindet sich das System "pc1", bestehend aus der Boot- und der Root-Partition. Auf dem Rechner PC2 befindet sich ein Grundsystem "pc2", das ebenfalls aus einer Boot- und einer Root-Partition besteht. Zusätzlich befinden sich auf dem Rechner PC2 zwei freie Partitionen hda2 und hda6.

Das Linux-System "pc1" (Quellsystem) auf dem Rechner PC1 soll nun zum Rechner PC2 gespiegelt werden, so dass das gespiegelte System "pmirr" (Zielsystem) entsteht.


Systemspiegelung

Bild 1: System spiegeln


Wie in Bild 1 dargestellt, wird zuerst das System "pc1" zum Rechner PC2 in das Unterverzeichnis "/pc1m" kopiert. Zum Erstellen dieser 1:1-Kopie wird das Programm "rsync" zum Synchronisieren von Verzeichnissen verwendet. Anschließend wird das gespiegelte System "pmirr" gebootet. Das vollständige Skript zur Einrichtung des Zielsystems befindet sich auf dieser Seite im Anhang 1.

Die Schritte sind im einzelnen:

  • Auf PC2 stehen neben dem bereits installierten Grundsystem zwei leere Partitionen zur Verfügung, die groß genug sind, die Verzeichnisse "/boot" und "/" des Quellsystems aufzunehmen:

      /dev/hda2    (soll pc1:/boot des Quellsystems aufnehmen)
      /dev/hda6    (soll pc1:/     des Quellsystems aufnehmen)

    Besteht das Quell- oder Zielsystem aus weiteren Partitionen, muss diese Aufteilung natürlich entsprechend angepasst werden.

  • Für das Zielsystem werden auf PC2 zwei Verzeichnisse eingerichtet und die Partitionen gemountet:

      pc2:/pc1m/boot für /dev/hda2      (= pmirr:/boot)
      pc2:/pc1m/root für /dev/hda6      (= pmirr:/    )
  • Der Inhalt der Boot-Partition des Quellsystems wird in die Boot-Partition des Zielsystems kopiert:

      pc1:/boot  nach   pc2:/pc1m/boot  (= pmirr:/boot)
  • Die folgenden Verzeichnisse bzw. Mountpoints werden auf dem Zielsystem nur eingerichtet (je nach den Verzeichnissen des Quellsystems):

      pc2:/pc1m/root/boot               (= pmirr:/boot)
      pc2:/pc1m/root/media              (= pmirr:/media)
      pc2:/pc1m/root/media/cdrom        (= pmirr:/media/cdrom)
      pc2:/pc1m/root/media/floppy       (= pmirr:/media/floppy)
      pc2:/pc1m/root/lost+found         (= pmirr:/lost+found)
      pc2:/pc1m/root/mnt                (= pmirr:/mnt)
      pc2:/pc1m/root/proc               (= pmirr:/proc)
  • Die folgenden Verzeichnisse werden vom Quell- in das Zielsystem kopiert (je nach den Verzeichnisses des Quellsystems):

      pc1:/bin   nach   pc2:/pc1m/root/bin   (= pmirr:/bin)
      pc1:/dev    "     pc2:/pc1m/root/dev   (= pmirr:/dev)
      pc1:/etc    "     pc2:/pc1m/root/etc   (= pmirr:/etc)
      pc1:/home   "     pc2:/pc1m/root/home  (= pmirr:/home)
      pc1:/lib    "     pc2:/pc1m/root/lib   (= pmirr:/lib)
      pc1:/opt    "     pc2:/pc1m/root/opt   (= pmirr:/opt)
      pc1:/root   "     pc2:/pc1m/root/root  (= pmirr:/root)
      pc1:/sbin   "     pc2:/pc1m/root/sbin  (= pmirr:/sbin)
      pc1:/srv    "     pc2:/pc1m/root/srv   (= pmirr:/srv)
      pc1:/sys    "     pc2:/pc1m/root/sys   (= pmirr:/sys)
      pc1:/tmp    "     pc2:/pc1m/root/tmp   (= pmirr:/tmp)
      pc1:/usr    "     pc2:/pc1m/root/usr   (= pmirr:/usr)
      pc1:/var    "     pc2:/pc1m/root/var   (= pmirr:/var)

    Weitere eigene Verzeichnisse können hinzu kommen wie z.B.

      pc1:/bak   nach   pc2:/pc1m/root/bak   (= pmirr:/bak)
      pc1:/test   "     pc2:/pc1m/root/test  (= pmirr:/test)
      usw.

    In der Datei /etc/fstab ist das Dateisystem festgelegt. Da dieses zwischen Quell- und Zielsystem unterschiedlich ist, wird diese Datei nur einmal bei der Einrichtung des Zielsystems vom Grundsystem des PC2 kopiert.

      pc2:/etc/fstab      nach   pc2:/pc1m/root/etc/fstab

    Diese Datei muss dann entsprechend den Partitionen des Zielsystems angepasst werden. Bei den weiteren Synchronisierungen zwischen Quell- und Zielsystem wird diese Datei nicht mitkopiert (siehe Skript).

  • Für die Ausführung der Spiegelung mit Hilfe eines Skripts ist es sinnvoll, den Public Key für "ssh" auf dem Quellsystem zu hinterlegen. Dadurch erspart man sich die Eingabe des root-Passwortes bei jedem "rsync"-Aufruf.

  • Das Kommando "rsync" wird noch mit der zusätzlichen Option "--numeric-ids" aufgerufen, damit die User- und Group-IDs der Dateien des Zielsystems mit denen des Quellsystems übereinstimmen. Ohne diese Option ordnet "rsync" die User- und Group-IDs nach den Namen zu, nicht nach den Nummern. So könnte es z.B. zu falschen User-IDs bei Verzeichnissen und Dateien auf dem Zielsystem kommen, wenn ein User sowohl auf dem Quellsystem als auch auf dem Grundsystem vorhanden ist, jedoch auf beiden Systemen verschiedene User-IDs hat.

  • Die "rsync"-Option "--delete-after" bewirkt, dass Dateien auf dem Zielsystem erst nach der Synchronisierung gelöscht werden. Für diese Option muss das Zielsystem über ausreichenden Plattenplatz verfügen.

  • Befinden sich das Quell- und Zielsystem auf verschiedenen Rechnern, sind auch die Netzwerkkarten unterschiedlich. In diesem Fall muss man die Netzwerkeinstellungen des Zielsystems neu vornehmen. Man kann diese Neueinstellungen nach dem erstmaligen Kopieren auch einmal vornehmen und bei den weiteren Spiegelungen die Verzeichnisse, in denen die Netzwerkkonfiguration festgelegt ist, von der Spiegelung ausnehmen, indem man die Zeile im Skript, in der das Verzeichnis /etc kopiert wird, erweitert. z.B. um

      --exclude=/etc/sysconfig/network/ifcfg-eth-id-*

    Welche Dateien bzw. Verzeichnisse von den Spiegelungen auszunehmen sind, ist systemabhängig. Befinden sich Quell- und Zielsystem auf demselben Rechner, ist diese Ausnahme nicht notwendig.

Das Skript für die Spiegelung muss an die tatsächlichen Gegebenheiten angepasst und kann dann gestartet werden. Das Kopieren kann man auf der Konsole verfolgen. Man staunt schon über die Anzahl der Dateien, die auf dem System vorhanden sind. Mit dem Kommando "df" kann man sich auf einer anderen Konsole ansehen, wie sich die Partitionen nach und nach "füllen". Je nach PCs und Netzwerkverbindung dauert das erstmalige Kopieren auch einige Zeit.

Das Zielsystem kann dann in regelmäßigen Zeitabständen mit dem Quellsystem synchronisiert werden. Diese Synchronisierungen gehen dann erheblich schneller, da "rsync" nur die Unterschiede zwischen den Systemen überträgt.

Anmerkung: In dem gezeigten Beispiel erfolgt das Kopieren aus dem laufenden System heraus. Im ungünstigsten Fall (wenn z.B. gerade Datensätze in eine Datenbank geschrieben werden) kann das gespiegelte System inkonsistent sein. Mögliche Abhilfen:

  • Sicherung der Datenbanken usw. auf reguläre Weise, damit die Daten ordnungsgemäß wieder hergestellt werden können. Diese Sicherung sollte unabhängig von der Spiegelung sowieso vorgenommen werden.

  • Stoppen der entsprechenden Server vor dem Start der Spiegelung.

  • Ausführung der Spiegelung, indem auf beiden Rechnern Grundsysteme installiert und gestartet werden. Dann kann das Quellsystem als "ruhendes" System kopiert werden. Befinden sich das Quell- und Zielsystem auf demselben Rechner, wird das Quellsystem in jedem Fall als ruhendes System kopiert, da erst das Grundsystem gestartet werden muss.

Hinweis: Wenn man aus irgendwelchen Gründen im Zielsystem Verzeichnisse wieder löschen will und sich dabei z.B. im Verzeichnis /pc1m/root befindet, also am Prompt z.B. eingibt:

  pc2:/pc1m/root # rm -r etc

sollte man darauf achten, dass man vor dem zu löschenden Verzeichnis kein "/" angibt, weil sonst das Verzeichnis des Grundsystems gelöscht wird!


   Booten des gespiegelten Systems

Nachdem das Quellsystem kopiert und die Datei /etc/fstab von Hand angepasst ist, muss das Zielsystem noch mit "Grub" bootbar gemacht werden.

Dazu muss das Zielsystem in der Datei "/boot/grub/menu.lst" des Systems pc2 hinzugefügt werden, z.B.

  title Gespiegeltes System
  kernel (hd0,1)/vmlinuz root=/dev/hda6 vga=0x317 selinux=0 \
          splash=silent resume=/dev/hda5  showopts
  initrd (hd0,1)/initrd

Es ist sinnvoll, einfacher und schneller, das Zielsystem vor der ersten Spiegelung auf normale Weise zu installieren. Bei der ersten Spiegelung brauchen dann nur die Änderungen übertragen zu werden. Außerdem wird die grub-Bootloader-Konfiguration bei der Installation automatisch um das Zielsystem ergänzt und die Datei fstab richtig erzeugt.

Bevor man das Ersatzsystem startet, muss das Quellsystem auf PC1 zunächst vom Netz getrennt werden, denn das gespiegelte System hat dieselbe IP-Adresse wie das Quellsystem, so dass es zur Kollision käme, wenn beide Systeme gleichzeitig am Netz liefen.

Das Ersatzsystem sollte nun genauso funktionieren wie das ursprüngliche System.


   Anmerkungen

Ein solches gespiegeltes System hat weitere Vorteile:

  • Die Spiegelung des Servers kann nicht nur im lokalen Netz, sondern auch über das Internet erfolgen. Entfernte Standorte der beiden Rechner erhöhen zusätzlich die Ausfallsicherheit.

  • Stehen weitere Linux-PCs zur Verfügung, kann man das Originalsystem auch mehrfach sichern. Umgekehrt kann man auf einem System mit genügend großer Festplatte auch mehrere Systeme sichern.

  • Wichtige Daten wie das "/home"-Verzeichnis lassen sich öfter sichern als das Gesamtsystem.

  • Sind die Platten in beiden Rechnern in auswechselbaren Halterungen (Quick-Out-Halterungen), braucht man bei einem Festplattencrash nur die Platte auszuwechseln, um das System wieder einsatzbereit zu machen.

  • Anstelle des laufenden Originalsystems kann man auch das gespiegelte "eingefrorene System" in einem konsistenten Zustand sichern.

  • Ein gespiegeltes System bietet die Möglichkeit, beliebige Änderungen ohne Rücksicht auf die Folgen zu testen. Nach den Experimenten synchronisiert man das Testsystem einfach wieder mit dem Originalsystem. Ist die Festplatte im Zielrechner groß genug, kann man das Originalsystem auch mehrfach auf dieser Platte sichern und eines der gespiegelten Systeme als Testsystem verwenden.

In meinem lokalen Netz wird der Hauptserver/-router regelmäßig auf einen anderen Server gespiegelt. Durch Starten des Ersatzsystems und Umstecken der Ethernetverbindungen ist man nach wenigen Minuten wieder am Netz. Das gespiegelte System funktioniert einwandfrei.



Anhang 1: Skript zum Spiegeln eines Linux-Systems


#!/bin/sh
# Skript zum Spiegeln von PC1 nach PC2.
# Dieses Skript muß an die jeweiligen Gegebenheiten angepasst werden.
# Nach der Anpassung die folgende Zeile entfernen:
exit 1

# Nach Ausführung dieses Skripts muss die Datei /etc/fstab
# des pc2-Grundsystems kopiert und von Hand angepasst werden.

# Dieses Skript soll nur auf PC2 laufen
if [ "$HOSTNAME" != "pc2" ]; then
  echo "Aufruf '$0' nur auf PC2 zulässig"
  exit 1
fi

# Variablen
rscmd="rsync -az -v --numeric-ids --delete --delete-after -e ssh"
rhost="pc1.local.netw:"
mboot="/pc1m/boot"
mroot="/pc1m/root"

# Mirror-Partitionen auf PC2 mounten:
mount /dev/hda2 $mboot
mount /dev/hda6 $mroot

# Systemverzeichnisse nur einrichten:
test ! -d $mroot/boot && (mkdir $mroot/boot; chmod 755 $mroot/boot)
test ! -d $mroot/media && (mkdir $mroot/media; chmod 755 $mroot/media)
test ! -d $mroot/media/cdrom && (mkdir $mroot/media/cdrom; chmod 755 $mroot/media/cdrom)
test ! -d $mroot/media/floppy && (mkdir $mroot/media/floppy; chmod 755 $mroot/media/floppy)
test ! -d $mroot/lost+found && (mkdir $mroot/lost+found; chmod 755 $mroot/lost+found)
test ! -d $mroot/mnt && (mkdir $mroot/mnt; chmod 755 $mroot/mnt)
test ! -d $mroot/proc && (mkdir $mroot/proc; chmod 555 $mroot/proc)

# Systemverzeichnisse kopieren:
$rscmd  $rhost/boot  /pc1m
$rscmd  $rhost/bin   /pc1m/root
$rscmd  $rhost/dev   /pc1m/root
# Nächste Zeile evt. um --exclude=/etc/sysconfig/network/ifcfg-eth-id-* ergänzen (s. Text)
$rscmd  $rhost/etc   /pc1m/root --exclude=/etc/fstab
$rscmd  $rhost/home  /pc1m/root
$rscmd  $rhost/lib   /pc1m/root
$rscmd  $rhost/opt   /pc1m/root
$rscmd  $rhost/root  /pc1m/root
$rscmd  $rhost/sbin  /pc1m/root
$rscmd  $rhost/srv   /pc1m/root
$rscmd  $rhost/sys   /pc1m/root
$rscmd  $rhost/tmp   /pc1m/root
$rscmd  $rhost/usr   /pc1m/root
$rscmd  $rhost/var   /pc1m/root

# Anwenderverzeichnisse kopieren:
$rscmd  $rhost/bak   /pc1m/root
$rscmd  $rhost/test  /pc1m/root

# Mirror-Partitionen wieder unmounten:
umount $mboot
umount $mroot

exit 0

Nach oben

© 1996-2018 Alfred Fokken