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.
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
|