Wie geht das mit dem Exclude bei Rsync?

  Ralf Hersel   Lesezeit: 8 Minuten  🗪 5 Kommentare Auf Mastodon ansehen

Wer Rsync für die Datensicherung verwendet, möchte bestimmte Verzeichnisse ausschliessen. Doch wie macht man das?

wie geht das mit dem exclude bei rsync?

Falls jemand Rsync nicht kennt:

Rsync ist sowohl ein Netzwerkprotokoll als auch ein unter der GPL stehendes Programm zur Synchronisation von Daten, meistens über ein Rechnernetz. Die Synchronisation läuft bei rsync nur unidirektional ab, also von einem Quell- zu einem Zielverzeichnis.

Ein wichtiges Merkmal von rsync ist, dass es nicht nur ganze Dateien kopieren kann, sondern auch Teile von Dateien. Wurde auf dem Quell-Datenträger eine Datei verändert, werden nur die geänderten Teile dieser Datei auf das Zielsystem übertragen, womit Zeit gespart wird.

Mit diesen Fähigkeiten eignet sich rsync sehr gut für das Erstellen von Datensicherungen (backup). Zu den Vorteilen gehören unter anderem, dass man beim Wiederherstellen der Daten (restore) nicht auf ein Programm angewiesen ist, da sich die gesicherten Dateien lesbar auf dem Sicherungsmedium befinden. Ausserdem ist rsync sehr schnell, weil Delta-Kodierung zum Einsatz kommt (siehe oben).

Ich verwende rsync seit Ewigkeiten für die Datensicherung. Um genau zu sein, kommt bei mir die GNOME-GUI-Anwendung Grsync zum Einsatz, weil ich keine Lust auf meterlange Parameterlisten im Terminal oder Shell-Skript habe. Das sieht so aus:

Zwar bietet Grsync nicht alle Optionen, die rsync kann; dafür ist es gerade für Einsteiger leichter zu bedienen. Bei den Optionen im GUI ist es klarer, was damit gemeint ist. Selbstverständlich kann man sich durch die man-Page wühlen, um fortgeschrittene Möglichkeiten zu entdecken. Diese lassen sich auch in Grsync über den Reiter Advanced options aufrufen. In diesem Artikel möchte ich nicht rsync in seiner Gänze erklären; dafür finden sich im Internet unzählige Beiträge. Auch Joël hat vor drei Jahren eine Anleitung für Einsteiger bei uns geschrieben.

Der Slash

Auf zwei Dinge möchte ich hinweisen: Die wichtigste Einstellung sind das Quell- und das Zielverzeichnis. Also WAS soll WOHIN gesichert werden. Dazu gibt man den Source- und Destination-Pfad an. Ein häufiger Fehler ist hier, dass der Slash am Ende des Pfades vergessen wird. Hier ist ein Beispiel:

Möchte man sein Home-Verzeichnis sichern, lautet die korrekte Angabe für die Quelle: /home/ralf/ oder wie immer ihr heisst. Durch den Slash am Ende wird nur der Inhalt des Verzeichnisses gesichert, jedoch nicht das Verzeichnis selbst. Wer den Slash weglässt, erhält eine zusätzliche (und vermutlich unnötige) Verzeichnisebene auf dem Zielmedium.

Nichts kapiert? Kein Problem, hier kommt ein einfaches Beispiel. Ich habe in meinem Home für dieses Beispiel das Verzeichnis test erstellt, in dem sich die Datei text.txt befindet:

home
└── test
    └── text.txt

Ausserdem gibt es unter Home das Verzeichnis backup als Zielverzeichnis. Der rsync-Befehl lautet:

rsync -av test/ backup/

Die Option -av ist der standardmässige Archivierungsmodus. So wird einfach alles 1:1 kopiert. Nach dem Ausführen des Befehls hat sich im Verzeichnis test nichts verändert und das Verzeichnis backup sieht so aus:

home
└── backup
    └── text.txt

Falls ihr den Slash hinter test weglasst, bekommt ihr dieses Ergebnis:

home
└── backup
     └── test
         └── text.txt

Beim Zielverzeichnis (backup) spielt es keine Rolle, ob ihr backup oder backup/ schreibt. Ich habe mir angewöhnt, sowohl bei Quell- als auch beim Zielverzeichnis einen Slash anzuhängen. Dann muss man nicht überlegen.

Exclude

Die zweite Sache, die ich euch zeigen möchte, ist die Verwendung einer Exclude-Datei. Das ist das eigentliche Thema dieses Artikel. Falls euch alles egal ist, könnt ihr ohne Probleme das gesamte Home-Verzeichnis sichern. Doch ist das wirklich, was ihr wollt? Fast immer (nein, immer) enthält das Home-Verzeichnis Dateien, die ihr nicht sichern möchtet. Hier sind ein paar Beispiele für Verzeichnisse unter Home, die ihr evtl. nicht sichern möchtet:

  • Mülleimer
  • temporäre Verzeichnisse
  • synchronisierte Cloud-Verzeichnisse
  • Verzeichnisse mit virtuellen Maschinen
  • Download
  • viele hidden-Verzeichnisse (Dot-Directories)
  • euer experimentelles Rumprobier-Verzeichnis

Nun bietet rsync die Optionen --exclude und --include, womit sich einzelne Dateien oder Verzeichnisse von der Synchronisation aus- oder einschliessen lassen. Diese empfehle ich nicht, weil es mit der Option --exclude-from=Datei viel einfacher und übersichtlicher geht. Doch diese Option ist schlecht dokumentiert und nicht sofort verständlich. Am einfachsten lässt sie sich mit einem Beispiel erklären. Die Datei, nennen wir sie z. B. backup_exclude.txt, sieht in meinem Beispiel so aus:

- delme
- Downloads
- studio-link
+ .ssh
- .*
+ Nextcloud/Keepass
- Nextcloud/*

Es ist eine normale Text-Datei, in der steht, welche Verzeichnisse und Dateien ein- oder ausgeschlossen werden sollen. Doch hier steckt der Teufel im Detail. Falls man Home als Quellverzeichnis angegeben hat, wird alles in Home in das Zielverzeichnis gesichert. Die Datei definiert die Ausnahmen, wobei es auf die Reihenfolge der Einträge ankommt.

In meinem Beispiel werden die Verzeichnisse, die mit einem Minuszeichen gekennzeichnet sind, von der Synchronisation ausgeschlosse: - delme, - Downloads, - studio-link. Jetzt wird es spannend: ausserdem werden alle versteckten Verzeichnisse (- .*) ausgeschlossen, aber nicht das Verzeichnis .ssh (+ .ssh). Auch die Unterverzeichnisse von Nextcloud werden ausgeschlossen (- Nextcloud/*), jedoch nicht das Unterverzeichnis Nextcloud/Keepass (+ Nextcloud/Keepass). Die Regel lautet: Zuerst einschliessen, danach ausschliessen; zuerst Plus, dann Minus. Damit werden Ausnahmen von der Ausschlussregel definiert. Ihr seht, es kommt auf die Reihenfolge der Regeln an und sie sind nicht intuitiv. Übrigens werden Dateien, die im Nextcloud-Verzeichnis liegen, synchronisiert, weil sich die Regel nur auf Unterverzeichnisse von Nextcloud bezieht.

Fazit

Ich hoffe, dieser Artikel hat ein wenig Klarheit in die Synchronisation zu Backup-Zwecken mit rsync geschaffen. Mir ist klar, dass es hierbei nur um einen kleinen Aspekt der Optionen geht. Da dieser Aspekt nicht gut dokumentiert ist (schaut mal in die man-Pages von rsync), habe ich es aufgeschrieben.

Ja, es gibt andere Backup-Lösungen, die andere Anwendungsfälle bedienen (Borg, DeJa-Dup, Back-in-Time, Bacula, Restic, usw.), doch darum geht es hier nicht.

Titelbild: Eigenkreation des Autors

Quellen:

https://de.wikipedia.org/wiki/Rsync

https://rsync.samba.org/

https://www.opbyte.it/grsync/

Tags

Rsync, Grsync, Backup, Exclude

Martin
Geschrieben von Martin am 11. Dezember 2024 um 09:27

Meinst du nicht slash? Backslash wird ja normal zum escapen genommen.

Eloi
Geschrieben von Eloi am 11. Dezember 2024 um 09:30

Erstmal: Sehr schöne kompakte Einführung in rsync (ein wirklich hilfreiches Tool, daß wir alle mehr nutzen sollten), danke dafür! Aber ein kleines Detail beunruhigt mein kleine Geekherz: Der Pfadtrenner "/" heißt Slash. Nur Windows verwendet den Backslash "\". Falls du das noch änderst darfst du diesen Kommentar löschen :)

Ralf Hersel Admin
Geschrieben von Ralf Hersel am 11. Dezember 2024 um 09:55

Ups, ich meine natürlich den Slash. Danke für eure Hinweise. Ist korrigiert.

Mutant77
Geschrieben von Mutant77 am 12. Dezember 2024 um 09:40

In den Beispielen fällt auch der Hinweis darauf, dass der Aufruf im Wurzelverzeichniss stattfinden muss oder besser aus der relativen Angaben eine absolute gemacht werden sollte.

Ralf Hersel Admin
Geschrieben von Ralf Hersel am 12. Dezember 2024 um 23:00

Danke für den Hinweis. Man sieht es auch im Screenshot. Wichtig: dieser Artikel ist keine Anleitung für rsync, sondern behandelt nur die Sache mit dem Slash und wie man --exclude-from verwendet.