Hauptseite

Backup mit Linux Boardmitteln

2. April 2009 von zimon

Ich mag die Kommandozeile und ich mag Standardwerkzeuge. Daher möchte ich hier ein paar Backuplösungen vorstellen, die nur mit Standardwerkzeugen auskommen.

Die Vorteile sind

  • Die Werkzeuge sind auf fast jedem System Verfügbar
  • Die Werkzeuge sind im Allgmeinen sehr gut erprobt und enthalten quasi keine Bugs
  • Alles kann mit der Konsole gemacht werden. Also auch wenn man keine graphische Oberfläche hat oder per ssh eingeloggt ist
  • Vieles kann mittels Bash-Scripts automatisiert werden
  • Die Backups können meistens auch unter schwierigen Umständen noch erstellt und eingespielt werden



Komplettes Festplatten-Image erstellen

Um ein Komplettes Image der Festplatte zu erstellen kann man tar benuzten. Dies ist bei so ziemlich jeder Linux-Distribution standardmäßig installiert.

Man bootet mit einer LiveCD oder Knoppix CD. Wenn man einen Root-Server hat, kann man das Rescue-System (so heißt es bei Hetzner, andere Provider sollten jedoch ähnliches anbieten) booten. Nun erstellen wir ein Verzeichnis und mounten darin die Festplatte, die gesichert werden soll. Hat man sein System auf mehrere Partitionen verteilt, kann man diese an die entsprechenden Stellen einbinden oder von jeder einzelnen ein Backup machen. Das folgende Beispiel zeigt, wie man die Partition /dev/sda1 sichert. Die Datei liegt hinterher im Wurzelverzeichnis der Partition als image.tar.gz.  (Alle Befehle mit root-Rechten ausführen):

mkdir /mnt/system
mount /dev/sda1 /mnt/system
cd /mnt/rescue
tar cvzpf image.tar.gz ./ --exclude=image.tar.gz

Diese Datei kann nun auf einen externen Datenträger, einen FTP-Server  oder eine andere Partition/Festplatte kopiert werden.

Ist auf /dev/sda1 nicht genug Platz, so kann man auch direkt auf eine andere Partition bzw. einen Wechelsdatenträger sichern. Im folgenden wird ein Backup von /dev/sda1 nach /dev/sda2 gemacht:

mkdir /mnt/system
mount /dev/sda1 /mnt/system
mkdir /mnt/backup
mount /dev/sda2 /mnt/backup
cd /mnt/backup
tar cvzpf image.tar.gz -C /mnt/system ./

Das Praktische an dieser Datei ist, dass man sie jederzeit wieder auf eine (neue) Festplatte aufspielen kann und das gesammte System wieder hergestellt ist (lediglich der Bootloader muss ggf. neu installiert werden). Dabei ist egal, ob der die Partition eine andere Größe hat (solange alles drauf passt) oder mit einem anderen Dateisystem formatiert ist.
Das Einspielen des Backups geht nun folgendermaßen: Wieder Booten mit LiveCD oder im Rescue-System und dann:

mkdir /mnt/system
mount /dev/sda1 /mnt/system
cd /mnt/system
cp /path/to/backup/image.tar.gz .
tar xvzpf image.tar.gz

Der Kopierbefehl muss entsprechend angepasst werden oder man entpackt direkt vom anderen Medium:

mkdir /mnt/system
mount /dev/sda1 /mnt/system
mkdir /mnt/backup
mount /dev/sda2 /mnt/backup
cd /mnt/backup
tar xvzpf image.tar.gz -C /mnt/system

Wi man Grub neu installiert ist auf dem Ubuntuusers Wiki im Artikel Grub sehr gut beschrieben. (Ich gehe mal davon aus, dass lilo kaum noch genutzt wird und wer es noch nutzt, wird wissen wie man es neu installiert)



Einzelne Verzeichnisse sichern

Möchte man nur bestimmte Verzeichnisse sichern, so kann man auch tar verwenden. Im Prinzip geht dies genauso, nur dass man nicht unbedingt neu zu booten braucht. (Die Pfade müssen dann entsprechend angepasst werden und es braucht nichts gemountet werden. Verzeichnisse brauchen auch nur einmal am Anfang erstellt werden.) Ein Backupscript mit tar gibt es im Ubuntuusers Wiki. Ein weiteres sehr gutes Script mit vielen weiteren Optionen und automatischem FTP-Upload ist Tartarus (Dies ist ein recht großes Bash Script, welches jedoch nur Standardwerkzeuge nutzt).
Möchte man MySQL Datenbanken sichern, so sollte man vorher einen Dump machen und diesen sichern, da sich die Datenbank sonst in einem inkonsistenten Zustand befinden kann.
Hier ein kleines Script, welches alle Datenbanken sichert:

#!/bin/bash
 
# Wohin sollen Datenbank Backups geschrieben werden?
DB_BACKUP_PATH=/pfad/zum/backup/verzeichnis
 
cd $DB_BACKUP_PATH
 
# Bereinigte Liste der Datenbanken erzeugen
#ersetze passwort mit dem root-Passwort der MySQL Datenbank
DBASELIST=`mktemp`
mysqlshow -ppasswort | awk '{print $2}' | grep -v Databases | sort > $DBASELIST
 
for x in `cat $DBASELIST`; do
    #echo "Datenbank: $x sichern";
    mysqldump --opt -ppasswort $x > $x.sql;
done;
 
# Alte .gz-Dateien loeschen
rm *.gz
 
# Dateien zippen
gzip *



Inkrementelles Backup mit rsync

Möchte man regelmäßig ein Backup von zu Hause ziehen, so ist rsync die beste Wahl. Denn es werden nur Dateien kopiert, die sich geändert haben.
rsync ist auch dann eine gute Wahl, wenn man die Möglichkeit hat auf einen Server mit ssh Zugriff zu sichern. Natürlich kann rsync aber auch in ein Verzeichnis sichern.
Eine ausführliche Erklärung zu rsync gibt es im Ubuntuusers Wiki (und natürlich in der manpage). Ein sehr gutes Backup-Script mit Erklärung wurde von Heinlein online gestellt.
Auch bei rsync-Backups ist bei Datenbanken darauf zu achten, dass vorher ein Dump erstellt und nur dieser gesichert wird.



Meine Backuplösung

Ich nutze Tartarus und rsync für die Backups.
Für Tartarus habe ich 3 Configurationen eingerichtet: eine für die Webaccounts, eine für die Datenbanken und eine für Konfigurationsdateien (/etc). Bei den Datenbanken wird obiges Script als Pre-Hook vor dem eigentlichen Backup durchgeführt um nur die Dumps zu sichern. Die Backups werden symmetrisch GPG verschlüsselt, da sie per FTP auf den Backupserver geladen werden, der von Hetzner zur Verfügung steht. Es wird einmal die Woche ein volles Backup und jeden Tag dazwischen ein inkrementelles Backup der Daten erstellt. Backups, die älter als eine Woche sind, werden automatisch gelöscht.
Mit rsync wird jeden Tag ein inkrementelles Backup zu mir nach Hause durchgeführt.


Schlagworte: , , ,



Kommentieren

Kommentarlinks könnten nofollow frei sein.


Bloggeramt.de frisch gebloggt Blogverzeichnis - Blog Verzeichnis bloggerei.de