
Ich habe vor Kurzem eine Maschine mit Ubuntu Server eingerichtet, um Spieleserver zu hosten. Ich habe für jeden Spieleserver ein Backup-Plugin installiert, das regelmäßig Backups der Spielweltdateien in einem bestimmten Ordner auf der Maschine erstellt. Ich habe auch eine cron
Aufgabe eingerichtet, um diese Backups jede Nacht automatisch mit rsync und der -a
Option in meinen Dropbox-Ordner zu kopieren.
Nach ein paar Monaten erreichte mein Dropbox-Konto sein Speicherlimit und mir wurde klar, dass ich nicht so viele Backups behalten konnte. Also konfigurierte ich das Backup-Plugin des Spielservers so, dass es nicht so viele Backups behält. Dann wartete ich ein paar Tage, um zu sehen, ob es die älteren Backups löschen würde, wie es wöchentlich geplant ist. Das Backup-Plugin erledigte schließlich seine Aufgabe und löschte die älteren Backups. Ich erwartete also, dass die rsync
Cron-Aufgabe anschließend die älteren Backups aus meinem Dropbox-Ordner löscht, um sie mit dem Quellordner abzugleichen, aber das tat sie nicht. Daher habe ich ein paar Fragen:
Standardmäßig funktioniert
rsync
nurhinzufügenDateien in den Zielordner, die dem Quellordner hinzugefügt wurden undändernDateien, die im Quellordner geändert wurden, aberNICHT löschenDateien, die aus dem Quellordner gelöscht wurden?Wenn das der Fall ist, wie kann ich
rsync
das am besten erreichen? Ich möchte, dass der Zielordner den Quellordner genau widerspiegelt, und das bedeutet, dass alle Dateien gelöscht werden, die aus dem Quellordner gelöscht wurden.
Ich sehe auf der Manualpage einige Optionen, rsync
die möglicherweise funktionieren, bin damit aber nicht vertraut.
Antwort1
Um Dateien im Ziel zu löschen, fügen Sie --delete
Ihrem Befehl die Option hinzu. Beispiel:
rsync -avh source/ dest/ --delete
NB: -avh
ist für--archive --verbose --human-readable
Antwort2
DerrsyncDer Befehl löscht keine Dateien, während Sie einige seiner Optionen delete
in diesem Befehl verwenden. Wenn also eine Datei oder ein Ordner in der Quelle hinzugefügt wird, wird er ohne Löschung mit dem Ziel synchronisiert.
Ich empfehle Ihnen, rsync
zur Sicherung der Quelldateien und find ... rm
zum Löschen von Dateien für einen bestimmten Zeitraum oder eine bestimmte Dateigröße Folgendes zu verwenden:
rsync [options] SOURCE TARGET
find TARGET -maxdepth 1 -type f -mtime +60 -exec rm -f {} \;
Erstellen Sie mit dem obigen Codeblock eine Sicherungskopie der Quelle und löschen Sie anschließend alle Dateien, deren letzte Änderung länger als zwei Monate zurückliegt.
AKTUALISIEREN
Ich finde, dass die delete
Optionen nur für TARGET gelten, wenn einige Dateien aus der Quelle entfernt werden, rsync --delete
diese auch aus TARGET entfernt werden. Und die delete
Option von after
und before
, wie in der Manpage erwähnt:
--delete-before receiver deletes before transfer, not during
Bedeutet, dass:
- rsync löscht die Dateien aus dem ZIEL, die aus der QUELLE entfernt wurden.
- rsync beginnt mit der Synchronisierung der Dateien.
--delete-after receiver deletes after transfer, not during
Bedeutet, dass:
- rsync beginnt mit der Synchronisierung der Dateien.
- rsync löscht die Dateien aus dem ZIEL, die nach der Synchronisierung aus der QUELLE entfernt wurden.
NOTIZ: Das --delete-{before/after}
Gerät ist gerade im ZIEL.
Antwort3
Der Befehl
$ rsync -avhn --delete local/ remote/
sorgt dafür, dass Änderungen, die lokal vorgenommen wurden, immer auf die Remote-Seite zurücksynchronisiert werden. Das heißt, es sorgt dafür, dass Änderungen synchronisiert werdenlokalUndFernbedienungso dass
- DateienhinzugefügtInlokalwerden hinzugefügtFernbedienung
- DateienENTFERNTauslokalwerden entfernt vonFernbedienung
- DateienhinzugefügtInFernbedienungwerden entfernt
- DateienENTFERNTausFernbedienungwerden wiederhergestellt vonlokalwenn sie existieren, sonst ignoriert
Die Parameter erklärt:
-a
Archivmodus-v
Ausführlichkeit erhöhen-h
Zahlen in einem für Menschen lesbaren Format ausgeben-n
Trockenlauf: Führen Sie einen Probelauf durch, ohne Änderungen vorzunehmen.Verwenden Sie dieses Flag immer zuerst, um Datenverlust zu verhindern. Wenn Sie zufrieden sind, entfernen Sie es.
Lassen wir die Ergebnisse für sich sprechen:
Erstellen Sie 2 Verzeichnisse
$ mkdir local/ remote/
Erstellen Sie darin Dateien
$ touch local/local_only remote/remote_only local/exists_locally_and_remotely remote/exists_locally_and_remotely`
Sehen Sie, was erstellt wurde (vor rsync):
$ ls local/ remote/ local/: exists_locally_and_remotely local_only remote/: exists_locally_and_remotely remote_only
rsync aufrufen:
$ rsync -avh --delete local/ remote/ sending incremental file list deleting remote_only local_only sent 160 bytes received 50 bytes 420.00 bytes/sec total size is 0 speedup is 0.00
Sehen Sie sich das Ergebnis an (nach rsync):
$ ls local/ remote/ local/: exists_locally_and_remotely local_only remote/: exists_locally_and_remotely local_only
Wie Sie sehen können, die Dateiremote/nur remoteist gewesengelöscht, die Dateilokal/nur lokalist gewesensynchronisiert.
Antwort4
Wenn während einer Rsync-Synchronisierung Fehler auftreten, löscht Rsync die gewünschten Dateien nicht ordnungsgemäß, selbst wenn Sie --delete
, --delete-after
, oder verwendet haben --delete-before
.
Aus diesem Grund ist es wichtig, Rsync-Fehler zu beheben.
Die meisten meiner Fehler waren auf die Verwendung der --perms
Option beim Synchronisieren mit einem Nicht-Linux-Dateisystem zurückzuführen. Als ich --perms
durch ersetzte --no-perms
, verschwanden diese Fehler und das Löschen funktionierte anschließend.
--perms
ist in Ordnung, wenn Sie von einem Linux-Dateisystem zu einem anderen Linux-Dateisystem synchronisieren, aber wenn Sie von Linux zu einem Nicht-Linux-Dateisystem (wie NTFS, FAT) synchronisieren, --perms
verursacht dies Fehler, weilrsync kann keine Linux-Berechtigungen auf Nicht-Linux-Dateisystemen festlegen. Auch hier gilt: Fehler = kein Löschen.
-- Beim Synchronisieren mit einer Nicht-Linux-Partition verwende ich, --no-perms
um Fehler zu vermeiden, die --delete
, --delete-after
, oder sabotieren --delete-before
.
Wenn danach immer noch Fehler auftreten und Sie nicht herausfinden können, wie Sie diese Fehler beheben können, können Sie einen Befehl ausführen, der ausschließlich zum Löschen der nicht synchronisierten Dateien dient:
sudo rsync -r --delete --existing --ignore-existing --ignore-errors --progress /path/to/source/ /path/to/destination
Der obige Befehl löscht nicht synchronisierte Dateien, synchronisiert aber keine. Sie sollten also danach erneut synchronisieren. Dieser Befehl basiert auf diesemAntwort, außer dass ich auch das --ignore-errors
Argument hinzugefügt habe, sodass es auch gelöscht wird, wenn Fehler vorliegen.