Wenn Ihr einen Home-Server aufsetzt, wie z.B. in meiner Anleitung Ubuntu-Server beschrieben, freut Ihr Euch selbstverständlich über jede Hürde, die Ihr erfolgreich gemeistert habt. Wenn dann alles so läuft, wie Ihr es Euch vorgestellt habt und Euer Server sozusagen in den "Produktivbetrieb" geht, sammeln sich schnell Daten auf dem Server an. Vieles davon wäre im Fall eines Festplattendefekts unwiederbringlich verloren, denkt nur einmal an Eure Urlaubsbilder. Ihr solltet Euch also schleunigst Gedanken über die Sicherung Eurer Daten machen.

Eine Möglichkeit ist die Sicherung Eurer Daten in einem Archiv mit dem Befehl 'tar' (Tape Archiver). Wie der Name schon sagt, wurde tar ursprünglich geschrieben, um Daten auf Bandlaufwerken zu sichern. Es kann aber auch auf andere Speichermedien oder in eine Datei gesichert werden. Eine komplette Übersicht über die möglichen Parameter und Optionen findet Ihr u.a. auf Ubuntu Manpages.

Grundsätzliche Überlegungen

Bevor wir loslegen, müssen drei Dinge entscheiden:

  1. Was soll gesichert werden?
  2. Wie soll gesichert werden?
  3. Wo soll gesichert werden?

1. Was soll gesichert werden?

Auf meinem Server habe ich alle Datenverzeichnisse unterhalb von /home angelegt. Aktuell sieht es ungefähr so aus:

root@ubuntusvr:/home# ls -l
insgesamt 48
drwxrwsr-x 43 root     users     4096 2011-05-16 20:29 Allgemein
drwxrwsr-x  4 Bibo    Bibo     4096 2011-05-06 09:18 Bibo
drwxrwsr-x  2 root     root     16384 2011-05-04 22:00 lost+found
drwxrwsr-x  6 root     users     4096 2011-05-09 13:57 media
drwxrwsr-x  5 root     users     4096 2011-05-04 23:22 pcinst
drwxrwsr-x  4 root     root      4096 2011-05-04 22:26 samba
drwxrwsr-x  3 sysadmin sysadmin  4096 2011-05-04 22:56 sysadmin
drwxrwsr-x  3 Willi Willi  4096 2011-05-04 22:48 Willi
drwxrwsr-x  2 root     users     4096 2011-05-04 22:35 www

Ich möchte natürlich nicht alles sichern. 'lost+found' brauche ich nun wirklich nicht und 'www' ist nur eine temporäre Testumgebung für den Webserver. Diese beiden Verzeichnisse sollen von der Sicherung ausgeschlossen werden.

2. Wie soll gesichert werden?

Man unterscheidet drei Backup-Arten:

2.1. Vollständiges Backup

Wie der Name sagt, sichert ein vollständiges Backup alle Daten in den ausgewählten Verzeichnissen. Bei einer täglichen vollständigen Sicherung würden sehr große Datenmengen anfallen, obwohl sich nur ein Bruchteil der Daten geändert hat und die Sicherung würde unnötig viel Zeit beanspruchen.

2.2. Differenzielles Backup

Bei einem differenziellen Backup wird ein einziges Mal ein Vollbackup gemacht. Danach werden nur noch neue und geänderte Dateien gesichert. Gelöschte oder veraltete Dateien (von denen eine neue Version gesichert wurde), werden aus dem Sicherungssatz entfernt. Tar unterstützt leider keine differenziellen Backups, das können nur große, professionelle Backup-Lösungen.

2.3. Inkrementelles Backup

Beim inkrementellen Backup werden - wie beim differenziellen Backup - alle Dateien gesichert, die seit der letzten Sicherung neu erstellt oder geändert wurden. Es werden jedoch keine veralteten oder gelöschten Dateien aus dem Sicherungssatz entfernt. Diese Möglichkeit bietet tar.

Ein Problem haben wir bei einer inkrementellen Sicherung: Wenn wir eine Datei versehentlich gelöscht haben und aus unserer Sicherung wiederherstellen möchten, müssen wir in jedem Sicherungssatz nachsehen, ob sich unsere Datei dort befindet. Würden wir ausschließlich inkrementelle Sicherungen anlegen, hätten wir bei täglicher Sicherung nach einem Monat schon 30 Sätze, die wir durchsuchen müssten.

Ein allgemein üblicher Kompromiss zwischen Voll- und inkrementeller Sicherung ist, einmal wöchentlich eine Vollsicherung durchzuführen und an den restlichen Tagen inkrementell zu sichern. Damit haben wir maximal 7 Sicherungssätze, die wir durchsuchen müssen.

3. Wo soll gesichert werden?

Ich habe mich entschieden, die Sicherungen auf einer externen USB-Festplatte zu speichern. Wir man diese in das System einbindet, ist in meiner Anleitung USB-Speicher unter Linux verwalten beschrieben. Die Platte ist unter /media/sicherung eingebunden.

Wie wird's gemacht?

Zur Erläuterung baue ich den Befehl nach und nach auf, also nicht gleich alles abtippen und ausführen Zwinkernd.

Eine Vollsicherung von /home in /media/sicherung können wir mit diesem Befehl anlegen:

tar -cvf /media/sicherung/backup.tar /home

Die Optionen bedeuten:

c = create, ein Archiv erstellen

v = verbose, ausführliche Ausgaben des Programms erzeugen

f = file, Sicherung in eine Datei

/media/sicherung/backup.tar = Pfad und Dateiname des Archivs

/home = Was soll gesichert werden

Leider komprimiert tar die Dateien im Archiv nicht. Wir können das Archiv anschließend mit gzip packen:

gzip backup.tar

erzeugt eine Datei backup.tar.gz. Tar arbeitet jedoch u.a. mit gzip zusammen, wir müssen lediglich den Parameter 'z' angeben, also:

tar -zcvf /media/sicherung/backup.tar.gz /home

Damit sparen wir uns das nachträgliche komprimieren. Den Namen der Backupdatei erweitern wir um '.gz'.

Ich möchte - wie erwähnt - nicht das komplette /home sichern, sondern nur bestimmte Verzeichnisse. Man kann tar auch mehrere Verzeichnisse angeben:

tar -zcvf /media/sicherung/backup.tar.gz /home/Allgemein /home/media /home/pcinst .......

Da ich jedoch nur zwei Verzeichnisse ausschließen möchte, wäre es schön, wenn ich sagen könnte: "Sichere alles in /home außer lost+found und www". Dazu legt man eine Exclude-Datei an, in die man die auszuschließenden Verzeichnisse schreibt und teilt tar diese Datei mit:

/media/sicherung/exclude.lst:

/home/lost+found
/home/www

Befehl:

tar -zcvf /media/sicherung/backup.tar.gz /home -X /media/sicherung/exclude.lst

Da wir nicht jeden Tag eine Vollsicherung machen möchten, legen wir eine Datei an, in dem tar die ein Log aller Dateien mit Prüfsummen anlegt. Anhand dieser Datei ermittelt tar beim nächsten, inkrementellen Backup die neuen und geänderten Dateien, die gesichert werden müssen.

tar -zcvf /media/sicherung/backup.tar.gz /home -X /media/sicherung/exclude.lst -g /media/sicherung/timestamp

Beim ersten Aufruf existiert die Datei 'timestamp' noch nicht, also wird eine Vollsicherung durchgeführt und die Datei angelegt. Beim nächsten Aufruf wird automatisch eine inkrementelle Sicherung durchgeführt.

Man sollte allerdings inkrementelle Sicherungen nicht 'stapeln', d.h. eine inkrementelle Sicherung sollte immer auf einer Vollsicherung aufbauen. Würden inkrementelle Sicherungen aufeinander aufbauen und eine davon wäre defekt, wären die Daten verloren, da sie in den folgenden Sicherungen nicht enthalten sind. Da bei einem inkrementellen Backup auch die timestamp-Datei verändert wird, würde genau dies passieren. Um das zu verhindern, kopieren wir die Datei und geben dem nächsten Backup die Kopie an:

cp /media/sicherung/timestamp /media/sicherung/timestamp.2
tar -zcvf /media/sicherung/backup2.tar.gz /home -X /media/sicherung/exclude.lst -g /media/sicherung/timestamp.2

Bei der nächsten inkrementellen Sicherung kopieren wir einfach die Datei erneut. Möchten wir eine neue Vollsicherung anlegen, löschen wir einfach die Datei timestamp.

Überprüfung des Sicherungsarchiv

Bei einer Sicherung ist es nicht ganz uninteressant zu wissen, ob denn unser Archiv auch intakt ist. Daher testen wir unser Backup mit gzip und checken das Ergebnis:

gzip -t /media/sicherung/backup.tar.gz
ergebnis=$?
echo $ergebnis

Die Rückgabewerte von gzip sind

0 = alles ok
1 = Fehler
2 = Warnungen

Zurückspielen (Restore)

Tar speichert relativ zum Dateipfad. d. eine Datei wird nicht als /pfad/zur/datei, sondern als pfad/zur/datei gespeichert. Dadurch können wir ein Archiv an jedem beliebigen Ort zurückspielen, wobei die Verzeichnisstruktur erhalten bleibt. Das wurde uns bei der Erstellung des Archivs auch mitgeteilt:

tar: Removing leading `/' from member names bzw.

tar: Entferne führende "/" von Elementnamen

je nach Sprachversion.

Mit dem Parameter -P könnten die Daten auch mit dem absoluten Pfaden gespeichert werden, was allerdings äußerst unflexibel wäre.

Um ein Archiv am Originalort zurückzuspielen, wechseln wir in das übergeordnete Verzeichnis oder geben das Basisverzeichnis mit der Option -C an. Der Parameter -x entpackt das Archiv oder auch einzelne Dateien daraus:

tar -C /Ziel -xvzf /media/sicherung/backup.tar.gz

Dieser Befehl entpackt das komplette Archiv in das Verzeichnis /Ziel.

Wir können auch einzelne Dateien aus dem Archiv auswählen. Dazu geben wir einfach den Pfad und Dateinamen an:

tar -C /Ziel -xvzf /media/sicherung/backup.tar.gz pfad/zur/zieldatei_im_archiv

Archivdateien durchsuchen

Wenn wir - wie beschrieben - mit inkrementellen Sicherungen arbeiten, müssen wir ja feststellen, in welchem Sicherungssatz sich die gesuchte Datei befindet. Mit dem Parameter -t wird der Inhalt des Archivs gelistet. Um eine Datei zu suchen, geben wir ein:

tar -tzf /media/sicherung/backup.tar.gz | grep dateiname

Ein Script zur täglichen Datensicherung erstellen

Für eine tägliche Sicherung unserer Daten wäre es äußerst mühsam, jeden Tag die timestamp-Datei zu kopieren bzw. zu löschen und den tar-Befehl von Hand einzugeben.

Wir benötigen ein Script, mit dem wir das alles automatisch erledigen lassen.  Ich möchte auch anhand des Dateinamens sehen, ob es sich um eine Voll- oder inkrementelle Sicherung handelt. Das Sicherungsdatum soll ebenfalls im Namen enthalten sein. Damit ich nicht versehentlich Sicherungsdaten lösche, möchte ich die USB-Platte nur für die Sicherung mounten und anschließend wieder dismounten. Wie so etwas geht, lest Ihr im nächsten Teil:

Ein Script zur Datensicherung

 


Zusätzliche Informationen