dckg.net
Blog
Tools
Downloads
Samstag, 5 Dezember 2015 in Linux
Backup unter Linux
Vorab eine Übersicht der drei Werkzeuge dd, rsync und tar:

NameInkrementellOutput: eine DateiOutput: komprimiertOnline
ddneinjajanein
rsyncjaneinneinja
tarneinjajanein


dd ist eher etwas für die lokale Verwendung. Damit können Abbilder und Kopien von Laufwerken und Partitionen erstellt werden.
dd if=/dev/sda of=image.img # backup
dd if=image.img of=/dev/sda # restore

Siehe auch man dd

Nachteilig ist hier, dass wirklich Sektor-für-Sektor Abbilder erstellt werden, eine 100GB große Partition, von der 10GB belegt ist, würde die erstellte Imagedatei trotzdem 100GB belegen.

Ungeachtet dessen kann der Output von dd mit gzip direkt komprimiert werden:
dd if=/dev/sda | gzip > image.img.gz # backup
gzip -cd image.img.gz | dd of=/dev/sda # restore



Gzip deckt sozusagen schon einen Teilbereich von tar ab.
Die von tar erstellten Dateien werden auch Tarball genannt. tar sammelt einfach Dateien und Ordner in einer Datei. Zudem erlaubt die eingebaute Kompression die anschließende Komprimierung der tar Datei.
Ein Beispiel:

tar -zcpf myBackup.tar.gz /dir1 /dir2 /dir3 /dir4 /dir5 /dirN # backup
tar xf myBackup.tar.gz -C /root/of/extraction #restore

So lassen sich leicht Backups erstellen.
Größtes Manko hier: myBackup.tar.gz wird jedes mal komplett neu erstellt, selbst wenn sich seit dem letzten Backup nichts geändert hat, folglich eine enorme Ressourcenverschwendung.


rsync synchronisiert ganze Verzeichnisse, verschlüsselt, zu einer entfernten Maschine oder lokal, und zwar nur, was sich auch wirklich geändert hat.
Daher muss bloß ein einziges Mal alles Synchronisiert werden, darauf folgend werden zwar geänderte Dateien übertragen, obendrein verfügt rsync über einen Delta-Alogrithmus, d.h. von einer bearbeiteten Datei wird, wenn möglich, lediglich der Teil übertragen, der auch wirklich verändert wurde.

Zur Syntax:

rsync -params /source_dir1 /source_dir2 /source_dirX /target/dir


Es können beliebig viele Quellverzeichnisse in ein Zielverzeichnis synchronisiert werden. Sowohl lokal, als auch auf eine entfernte Maschine.

Eine wichtige Unterscheidung gilt es bei der Angabe des/der Quellverzeichnisse(s) zu beachten:

rsync -params /source_dir1 user@target.tld:/target/dir



rsync -params /source_dir1/ user@target.tld:/target/dir

Ersteres synchronisiert den Ordner source_dir1 unter dir, letzteres dagegen synchronisiert die Inhalte von source_dir1 in den Ordner dir.

Deshalb würde ich jegliches rsync Kommando immer mit dem -v und -n Parameter ausführen, welcher eine detaillierte Ausgabe liefert, beziehungsweise das Ganze erst einmal nur simuliert, ohne wirklich Änderungen durchzuführen.

Einige Anwendungsfälle:
1:1 Backup

rsync -azvn --delete /source/dir/ user@target.tld:/target/dir


Cloud-Synchronisation
Upload

rsync -rtpvn --delete --update /source/dir/ user@target.tld:/target/dir

Download

rsync -rtpvn --delete --update user@target.tld:/source/dir/ /target/dir


Komplettes Systembackup

rsync -aAXn --numeric-ids --info=progress2 --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} 1.2.3.4:/ /path/to/backup/folder

Systembackup Wiederherstellung

rsync -aAXn --numeric-ids --delete --info=progress2 --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} /path/to/backup/folder 1.2.3.4:/

Nach einer solchen Wiederherstellung ist zwingend ein Neustart nötig.


Eine kleine Übersicht von von mir häufig verwendeten Parametern:










































































































































Parameter

Bedeutung

-a

eignet sich für Backups, speichert Berechtigungen, Besitzer, etc, mehr dazu im man rsync

-r

rekursiv

-t

Zeitstempel der Datei unverändert lassen - übertragen

-R

relative Pfadnamen - parent Verzeichnisse

-z

Dateien vor dem Transfer komprimieren

-m

leere Ordner überspringen

-v

verbose - detaillierter Output

--info=progress2

anstelle von -v und --progress, zeigt eine gesamte Fortschrittsanzeige an, nicht bei jeder einzelnen Datei

-n

dry-run, simulierter Durchlauf

-l

Symlinks als Symlinks kopieren

-L

Symlinks folgen und den eigentlichen Inhalt herunterladen

-p

Berechtigungen beibehalten

-u --update

Nur Dateien übertragen, die auf der Quelle neuer sind, als auf dem Ziel. (erfordert -t Zeitstempel)

--delete

Dateien und Ordner bei Bedarf im Zielverzeichnis löschen

--progress

Fortschrittsanzeige Übertragung

--partial

Bei Abbruch der Übertragung wird gerade Übertragene Datei nicht gelöscht, fortsetzbar nach erneutem rsync Aufruf. Nützlich bei schlechten Verbindungen.



Schlussendlich gibt es nicht die optimale Art und Weise, ein Backup auszuführen.
Doch warum nur eins der drei Programme verwenden?
Eine interessante Kombination ist es nämlich, die Vorteile von tar und rsync zu kombinieren:
tar für zentrale, komprimierte Speicherung aller Dateien in einer Datei.
rsync für schnelle, effiziente, inkrementelle Synchronisation.

Angenommen ich möchte von einem Produktivsystem jeweils den Datenbestand der vergangenen 7 Tage vorhalten:

rsync azvn --progress --delete /source/dir/ user@backupserver.tld:/backup/current

Das zu sichernde Quellverzeichnis wird z.b. täglich um 3 Uhr Nachts mit den Backupserver synchronisiert.
Nachfolgend wird auf dem Backupserver folgendes Skript ausgeführt, z.B. mit
ssh user@backupserver.tld -t "/path/to/script":

cd /backup/previous
tar -zcpvf backup_$(date +%F_%H-%M-%S).tar.gz /backup/current
ls -tr | head -n -7 | xargs rm # keep n backups # this is dangerous, if working dir is wrong!

Dieses Skript erstellt einen komprimierten Tarball, mit einem Namen wie backup_2015-12-05_20:50:07.tar.gz und löscht anschließend alle Dateien des aktuellen Ordners, bis auf die 7 neusten Dateien.

Da der eigentliche Ordner, in den rsync synchronisiert, nicht angetastet wird, besteht weiterhin der Vorteil einer sehr schnellen Synchronisation, kombiniert mit der optionalen Möglichkeit, die letzten 7 Versionsstände wiederherzustellen. Tar benötigt leider sieben mal die volle Größe.

Eventuell lässt sich durch Nutzung des modernen xz-Kompressionsverfahrens
(tar mit Parameter J (xz) statt c (gzip), Paket xz-utils)
gegenüber der Komprimierung mit gzip der benötigte Speicherplatz weiter verringern, ob es jedoch die wesentlich längere Ausführungszeit rechtfertigt, ist abzuwägen.

Das Skript letztendlich mit geringster Priorität laufen zu lassen,
ionice -c2 -n7 nice -n19 /path/to/script
dürfte ein Backup jederzeit, ohne Beeinträchtigung der Performance des Servers, möglich machen.
Site optimised for Google Chrome / Chromium