Zum Inhalt springen

rsync

cp -a und scp -r kopieren alles, jedes Mal. rsync vergleicht Quelle und Ziel und überträgt nur, was sich geändert hat, bei grossen Dateien sogar nur die geänderten Blöcke. Das erste Spiegeln eines Verzeichnisses dauert gleich lang wie mit cp, jedes weitere nur Sekunden. Darum ist rsync das Werkzeug für Backups über das Netz und für Migrationen: Erst im laufenden Betrieb in Ruhe alles kopieren, dann den alten Server stoppen und in wenigen Minuten den Rest nachziehen.

Die Grundform:

Terminal-Fenster
rsync [optionen] quelle ziel

Quelle oder Ziel (nicht beide) dürfen auf einem anderen Rechner liegen, geschrieben als host:pfad. Die Verbindung läuft dann über SSH.

Option Bedeutung
-a archive: rekursiv, mit Rechten, Besitzer, Zeitstempeln und Symlinks. Praktisch immer
-v zeigt, welche Dateien übertragen werden
-n dry run: nur zeigen, nichts tun. Vor jedem --delete
--delete löscht im Ziel, was in der Quelle nicht mehr existiert (echter Spiegel)
--exclude=MUSTER auslassen, mehrfach möglich
-z komprimiert bei der Übertragung, lohnt sich über langsame Leitungen
-h, --progress lesbare Grössen, Fortschritt bei grossen Dateien
--link-dest=VERZ unveränderte Dateien als Hardlink auf VERZ anlegen statt kopieren

Die Stolperfalle Nummer eins. Ob die Quelle mit / endet, entscheidet, ob das Verzeichnis selbst oder nur sein Inhalt kopiert wird:

Terminal-Fenster
rsync -av quelle/ ziel/ # Inhalt von quelle landet direkt in ziel/
rsync -av quelle ziel/ # ergibt ziel/quelle/...

Merkhilfe: quelle/ heisst «was drin ist», quelle heisst «das Verzeichnis». Beim Ziel spielt der Schrägstrich keine Rolle.

Hands-on:

  1. Testdaten anlegen und beide Varianten vergleichen:
    lokale VM
    mkdir -p ~/rs/quelle
    echo eins > ~/rs/quelle/a.txt
    echo zwei > ~/rs/quelle/b.txt
    rsync -av ~/rs/quelle/ ~/rs/ziel1/
    rsync -av ~/rs/quelle ~/rs/ziel2/
    tree ~/rs
  2. Noch einmal ausführen. Was erwartest du? Die Ausgabe zeigt nur noch sending incremental file list und die Statistik, keine Datei wird übertragen:
    lokale VM
    rsync -av ~/rs/quelle/ ~/rs/ziel1/
  3. Datei in der Quelle löschen und spiegeln, erst als Trockenlauf, dann echt:
    lokale VM
    rm ~/rs/quelle/b.txt
    rsync -avn --delete ~/rs/quelle/ ~/rs/ziel1/
    rsync -av --delete ~/rs/quelle/ ~/rs/ziel1/
    ls ~/rs/ziel1/

Lokale Syntax, entfernte Seite als host:pfad. Mit dem Alias server aus Teil 1 und dem hinterlegten Schlüssel braucht es kein Passwort:

lokale VM
ssh server mkdir -p backup
rsync -av -e ssh ~/rs/quelle/ server:backup/quelle/
ssh server ls -l backup/quelle

-e ssh ist heute der Standard und kann weggelassen werden. Du brauchst die Option, wenn SSH Zusatzargumente bekommt, etwa -e 'ssh -p 2222'. Die Gegenrichtung (vom Server holen) ist dieselbe Zeile mit vertauschten Seiten:

lokale VM
rsync -av server:/etc/ssh/ ~/rs/server-ssh-config/

Für Dateien, die nur root lesen darf, kombinierst du rsync mit sudo auf dem Server: rsync -av --rsync-path='sudo rsync' server:/var/log/ ~/rs/logs/ (setzt voraus, dass sudo ohne Passwort erlaubt ist, was auf deiner Server-VM standardmässig nicht der Fall ist; eine Alternative ist ein eigener Backup-Benutzer mit gezielter sudo-Regel).

Ein Spiegel ist kein Backup: Löscht du heute eine Datei, ist sie nach dem nächsten rsync --delete auch im Spiegel weg. Du willst Stände: einen pro Tag, jeder vollständig, aber ohne jeden Tag alles neu zu kopieren.

Genau das leistet --link-dest. Du gibst den vorherigen Stand an. Für jede Datei, die sich seit dann nicht geändert hat, legt rsync im neuen Stand einen Hardlink auf die alte Datei an statt einer Kopie. Hardlinks kennst du aus Modul 4: zwei Verzeichniseinträge, ein Inode, einmal Speicherplatz. Nur geänderte Dateien werden wirklich kopiert.

Hands-on:

  1. Erster Stand (eine normale Kopie):
    lokale VM
    mkdir -p ~/rs/snap
    rsync -av ~/rs/quelle/ ~/rs/snap/1/
  2. Etwas ändern, zweiter Stand mit Bezug auf den ersten. --link-dest braucht einen absoluten Pfad oder einen relativ zum Ziel:
    lokale VM
    echo drei > ~/rs/quelle/c.txt
    rsync -av --link-dest="$HOME/rs/snap/1" ~/rs/quelle/ ~/rs/snap/2/
  3. Kontrolle. ls -li zeigt Inode-Nummer und Link-Zähler. a.txt hat in beiden Ständen denselben Inode und den Zähler 2, c.txt gibt es nur in Stand 2:
    lokale VM
    ls -li ~/rs/snap/1/ ~/rs/snap/2/
    du -sh ~/rs/snap/*
  4. Jetzt a.txt ändern und einen dritten Stand anlegen. Was erwartest du bei ls -li für a.txt?
    lokale VM
    echo "eins, geändert" > ~/rs/quelle/a.txt
    rsync -av --link-dest="$HOME/rs/snap/2" ~/rs/quelle/ ~/rs/snap/3/
    ls -li ~/rs/snap/*/a.txt

a.txt in Stand 3 ist eine neue Datei mit eigenem Inode, die Stände 1 und 2 behalten die alte Version. Jeder Stand sieht aus wie eine Vollsicherung und kann unabhängig gelöscht werden, der Platzbedarf wächst nur um die Änderungen. In einem Skript nennst du die Stände nach Datum (2026-11-05) und zeigst mit --link-dest auf den jüngsten vorhandenen.

scp rsync
Überträgt immer alles nur Unterschiede
Abbruch von vorn beginnen weitermachen (--partial, -P)
Spiegeln mit Löschen nein --delete
Trockenlauf, Ausschlüsse nein -n, --exclude
Installiert immer (gehört zu SSH) meist, sonst apt install rsync auf beiden Seiten

Faustregel: eine Datei schnell rüber, scp. Ein Verzeichnis, wiederholt oder gross, rsync.

Lösung anzeigen
Terminal-Fenster
script labs/linux/10-remote-backup/rsync.txt
ssh server mkdir -p backup/spiegel backup/staende
rsync -av ~/rs/quelle/ server:backup/spiegel/
rm ~/rs/quelle/c.txt
rsync -avn --delete ~/rs/quelle/ server:backup/spiegel/
rsync -av --delete ~/rs/quelle/ server:backup/spiegel/
rsync -av ~/rs/quelle/ server:backup/staende/1/
echo geaendert >> ~/rs/quelle/a.txt
rsync -av --link-dest=../1 ~/rs/quelle/ server:backup/staende/2/
ssh server ls -li backup/staende/1 backup/staende/2
# 4: rsync legt ~/backup/daten/ an und löscht alle anderen Einträge in ~/backup/,
# weil sie in der Quelle nicht vorkommen. Darum zuerst mit -n prüfen.
exit

Selbstcheck · 4 Fragen

1. Was bewirkt der Schrägstrich am Ende der Quelle?
2. Welche Option zeigt nur, was passieren würde?
3. Was macht --link-dest?
4. Welche Aussagen stimmen? (mehrere Antworten möglich)