rsync und exclude oder exclude-from plus .htaccess können einen zur Weißglut treiben
Im Zuge der Umstellung meiner Website auf einen root-Server, tüftle ich gerade an einer Backup-Strategie (Details dazu im nächsten Beitrag). Ich habe eine Online-Festplatte mit 20 GByte, auf die ich Daten via rsync übertragen kann. 20 GByte reichen mir locker, da die Daten meiner Website derzeit nur 2-3 GByte verschlingen. Das klingt nach relativ viel, aber da sind auch meine 360°-Panoramas gehostet und so weiter.
Das Tool rsync gehört schon lange zu meinen Favoriten. Damit lassen sich Backups sehr schnell durchführen, da lediglich geänderte oder neue Daten übertragen werden. Das Kommandozeilen-Tool ist eigentlich per Standard bei jeder Linux-Installation dabei. Das gilt übrigens auch für Raspbian, das Standard-Betriebssystem für den Raspberry Pi. Auch Pi-Besitzer können mit rsync hantieren.
Da die Daten meiner Website relativ langsam anwachsen, läuft ein Backup mithilfe von rsync nach der ersten Synchronisation in weniger als 30 Sekunden durch. So weit bin ich schon mit meinen Tests 🙂
Beim Herumspielen mit rsync und dem root-Server ist mir wieder eingefallen, wie sehr ich schon mit dem Tool geflucht habe. Von daher möchte ich anderen das Aus der Haut fahren ersparen.
rsync und --exclude
oder --exclude-from
Nun ist es aber so, dass ich gewisse Daten nicht sichern möchte. Ich verwende ein Caching-Plugin für WordPress und diese Daten muss ich nicht sichern. Im Falle eines Crashes hat das sogar Nachteile, da ich mehr Daten zurückspielen muss und so weiter. OK, man könnte sie dann manuell löschen. Warum sollte ich das aber tun, wenn ich es automatisieren kann.
Die Software rsync stellt sehr viele Optionen zur Verfügung, dazu gehören auch --exclude
und --exclude-from
.
Bei --exclude=
gibst Du ein Verzeichnis oder eine Datei direkt hinter dem Gleichheitszeichen an. Verwendest Du --exclude-from=
, dann hinterlegst Du dort eine Datei, in der sich eine Liste mit den auszuschließenden Dateien oder Verzeichnissen befindet. Pro Zeile kommt ein Verzeichnis oder eine Datei. Ich persönlich bevorzuge die Variante mit der Liste. Ich kann dort auch nur ein Element hinterlegen und notfalls aber sehr einfach aufstocken. Ich finde den Weg über --exclude-from
einfach übersichtlicher. Gut, wenn es wirklich nur ein Verzeichnis oder eine Datei ist … egal, ich verwende in der Regel rsync mit --exclude-from=""
.
Der Teufel steckt im Detail
Die Syntax von rsync ist so:
rsync <Optionen> ... <Quelle> ... <Ziel>
Sehen wir uns ein Beispiel an (alles eine Zeile):
rsync -avuz --exclude-from="/home/bitblokes/scripts/exclude-from-backup.txt" -e "ssh" /var/www/ <name>@<Remote Server>:/Pfad/zum/Ziel --delete
Bei diesem Befehl sichere ich also alle Dateien von /var/www/ via SSH auf meine Online-Festplatte. Ausschließen möchte ich den Pfad /var/www/bitblokes.de/wp-content/cache, da dort die vom Cache Plugin erzeugten Daten liegen und die brauche ich nicht auf dem Backup.
Die Datei mit den auszuschließenden Dateien und Ordnern befindet sich unter /home/bitblokes/scripts/exclude-from-backup.txt. Nun könnte man denken, das sich in dieser Datei die Zeile /var/www/bitblokes.de/wp-content/cache befindet. Das ist gut gedacht, aber rsync tickt nicht so.
Das Backup-Tool geht nämlich vom Quellpfad aus, der in meinem Fall /var/www/ ist. Würde ich die Zeile wie oben in der exclude-Datei hinterlegen, macht rsync das daraus:
/var/www/var/www/bitblokes.de/wp-content/cache
und diesen Pfad gibt es nicht. Es kommt also zu einer Fehlermeldung. Stattdessen ist der richtige exclude-Pfad in meinem Fall /bitblokes.de/wp-content/cache und damit klappt es dann auch.
Behalte einfach im Hinterkopf, dass das Backup-Tool immer vom Quell-Pfad ausgeht. Das gilt nicht nur für --exclude
und --exclude-from
, sondern auch für die Optionen --include
und --include-from
. Die beiden letzteren sind dafür zuständig, bestimmte Dateien und Ordner explizit einzuschließen. Äquivalent ließt die Variante --include-from
wieder aus einer Datei.
Du kannst r --exclude
, --exclude-from
, --include
und --include-from
übrigens auf mischen und in einem Befehl verwenden. In diesem Fall ist zu beachten, dass der erste Treffer oder das erste übereinstimmende Muster zählt. An dieser Stelle kann es auch Verwirrung geben.
Wie so häufig bei Tools für die Kommandozeile gibt es unter Linux eine sogenannte man page, die Du so aufrufst:
man rsync
Die Dokumentation gibt es aber auch Online. Ich gebe zu, dass diese man pages oft sehr verwirrend sein können.
rsync sichert .htaccess nicht
Was mir bei meinen Spielereien und bei der Synchronisation von Strato auf meinen root-Server auch wieder aufgefallen ist, meine .htaccess wurde nicht gesichert. Anders gesagt wurden unsichtbare Dateien im Quell-Ordner ignoriert. Das lag an einem ganz banalen Fehler, der aber sicherlich auch gerne gemacht wird. Ein * ist schuld.
Dieser Befehl sichert die Datei .htaccess oder andere versteckte Dateien nicht mit.
rsync -avuz /var/www/html/* /Pfad/zum/Ziel
Der Grund ist der *. Darin sind Dateien nicht enthalten, die mit einem . anfangen oder eben versteckte Dateien. Ich könnte nun mit einem include erwirken, speziell die Datei .htaccess einzuschließen.
--include=".htaccess"
Oder ich lasse einfach den * weg und dann klappt die Sache auch.
rsync -avuz /var/www/html/ /Pfad/zum/Ziel
Ich empfehle Dir, einfach zwei Ordner anzulegen und dann mit rsync zu experimentieren. Das Tool kann einen tatsächlich zur Weißglut bringen. Ein blöder / oder * ist möglicherweise Schuld, dass nichts funktioniert. Irgendwann platzt der Knoten aber und dann wirst Du nie wieder auf rsync verzichten wollen. Damit lassen sich sogar automatisch Backups machen, wenn Du eine USB-Festplatte einsteckst.
Ja, rsync ist da etwas "eigenwillig", aber diese Möglichkeiten braucht es eben auch. Wenn man unbedingt absolute Pfade angeben möchte kann man Filter verwenden: "-/ /var/www/bitblokes.de/wp-content/cache". "-" bedeutet exclude und "/" gibt an, dass absolute Pfade verwendet werden sollen.