`cp -al` Schnappschuss, dessen Hardlinks beim Bearbeiten auf eine neue Datei geleitet werden


11

Ich versuche regelmäßig Schnappschüsse eines riesigen Ordners zu machen.

Ich habe hier gelesen: http://www.mikerubel.org/computers/rsync_snapshots/#Incremental
, cp -aldas durch einfaches Kopieren der Hardlinks einen Schnappschuss eines Ordners erstellt.

Das ist alles großartig, aber das Problem ist, dass sich in diesem Snapshot, wenn ich eine Datei ändere, diese in allen Snapshots ändert. Stattdessen möchte ich, dass das System beim Ändern eine neue Datei erstellt und stattdessen darauf verlinkt. Auf diese Weise wird jeder Schnappschuss bei einer Bearbeitung der ersten Datei nicht ungültig.

Wie kann ich das erreichen?

ps Ich habe es versucht rsync -a --delete --link-dest=../backup.1 source_directory/ backup.0/, aber es hat das gleiche Problem.

Antworten:


7

So funktionieren Hardlinks. Aber es gibt Möglichkeiten, dies zu umgehen:

Einige Optionen kommen in den Sinn:

  • Verwenden Sie ein Dateisystem mit Unterstützung für Copy-on-Write-Dateien, z btrfs. Wenn Sie btrfs verwenden, verwenden Sie natürlich nur die nativen Snapshots ... Wenn Ihr Dateisystem dies unterstützt, können Sie diese verwenden cp --reflink=always. Leider unterstützt ext4 dies nicht.
  • Teilen Sie Hardlinks nur für Ihre Schnappschüsse, nicht für das Original. Das heißt, wenn Sie eine bestimmte Version einer Datei zum ersten Mal sehen, kopieren Sie sie in den Snapshot. Verknüpfen Sie es jedoch beim nächsten Mal mit dem im vorherigen Schnappschuss. (Ich bin mir nicht sicher, welches Programm ich vor einem Jahrzehnt verwendet habe, aber bei der Suche werden Dirvish, Obnam, Storebackup und Rsnapshot angezeigt.)
  • Abhängig davon, wie Ihre Dateien geändert werden, können Sie möglicherweise garantieren, dass eine Schreibtemperatur / Umbenennung verwendet wird, um sie zu ändern. Dadurch wird der Hardlink unterbrochen, sodass die Version im Snapshot makellos bleibt. Dies ist jedoch weniger sicher, da Fehler Ihren Schnappschuss beschädigen können.
  • Machen Sie LVM-Snapshots des gesamten Dateisystems.

Natürlich gibt es noch die andere Option: Verwenden Sie ein geeignetes Backup-System. Die meisten von ihnen können nur geänderte Dateien sichern.


Was empfehlen Sie, um einen massiven Ordner zu sichern?
Hermann Ingjaldsson

Ich dachte daran, rsync auf einem Server zu verwenden, der einen Cronjob hat, um cp-al regelmäßig für Schnappschüsse zu machen. Neben rsync-on für noch mehr Kopien. Wie klingt das?
Hermann Ingjaldsson

@HermannIngjaldsson Nun, es hängt davon ab, wie Sie Ihre Backups machen. Persönlich würde ich es einfach zu meinem Bacula-Setup hinzufügen - aber ich würde es nicht empfehlen, es sei denn, Sie haben eine Reihe von Maschinen zum Sichern oder kennen Bacula bereits. Also, ich denke, ich würde vorschlagen, dass Sie zuerst rsnapshot versuchen.
Derobert

rsnapshotist gut
Developerbmw

4

Was Sie suchen, ist eine Form des Copy-on-Write , bei der mehrere Dateien mit demselben Inhalt denselben Speicherplatz auf der Festplatte belegen, bis eine davon geändert wird. Hardlinks implementieren Copy-on-Write nur, wenn die Anwendung, die das Schreiben ausführt, die Datei löscht und eine neue Datei mit demselben Namen erstellt (normalerweise wird eine neue Datei mit einem anderen Namen erstellt und dann an ihren Platz verschoben). Die Anwendung, die Sie verwenden, tut dies offensichtlich nicht: Sie überschreibt die vorhandene Datei.

Einige Anwendungen können für die Verwendung der Ersetzungsstrategie konfiguriert werden. Einige Anwendungen verwenden standardmäßig die Ersetzungsstrategie, verwenden jedoch die Überschreibstrategie, wenn sie eine Datei mit mehreren Hardlinks sehen, um die Hardlinks nicht zu beschädigen. Ihre aktuelle Snapshot-Technik funktioniert, wenn Sie Ihre Anwendung so konfigurieren können, dass sie ersetzt anstatt überschrieben wird.

Fl-cow ändert Programme so, dass die Ersetzungsstrategie systematisch für Dateien mit mehreren festen Links verwendet wird.

Alternativ können Sie Ihre Dateien in einem Dateisystem speichern, das Copy-on-Write oder Deduplizierung ausführt, oder über eine Snapshot-Funktion verfügen, ohne sich um feste Links kümmern zu müssen: Btrfs oder Zfs . Abhängig von Ihrem Partitionierungsschema kann die Verwendung von LVM-Snapshots eine Option sein.

Meine Empfehlung ist, ein geeignetes Snapshot-Tool zu verwenden. Es ist überraschend schwierig, zuverlässige Backups zu erstellen. Sie möchten wahrscheinlich rsnapshot .


2

Das folgende ist ein Ruby-Skript, das ich geschrieben habe und das "cp-al" und rsync in ein nettes Skript einschließt, das manuell oder über cron ausgeführt werden kann. Das Ziel kann lokal oder remote sein (über ssh):

Ghetto Timemachine

Die grundlegende Antwort auf Ihre Frage, wie in einem vorherigen Kommentar erwähnt, muss von den harten Links getrennt werden. Nehmen Sie beispielsweise eine tägliche Sicherung Ihres Home-Verzeichnisses an:

Quelle:

  • / home / flakrat

Ziel:

  • / data / backup / daily
    • /Montag
    • /Dienstag
    • /Mittwoch
    • /Donnerstag
    • ...

Die Hardlinks werden erstellt, indem "cp -al" für das gestrige Backup ausgeführt wird. Angenommen, es ist Dienstagmorgen, wenn Sie es ausführen:

cd /data/backup/daily

rm -rf tuesday

cp -al monday tuesday

rsync -a --delete /home/flakrat /data/backup/daily/tuesday/


0

rdiff-backup scheint zu tun, was Sie wollen, probieren Sie es aus.

Mit rsync müssen Sie zuerst eine vollständige Sicherung ohne feste Links erstellen. Die nächste Sicherung kann auf die vorherige Sicherung verweisen und eine feste Verknüpfung dazu herstellen. Auf diese Weise sind Ihre Backups nicht fest mit Ihren Arbeitsdateien verknüpft (die, die Sie ändern). Beispiel. Wenn meine vorherige Sicherung Ordner-Sicherung.01 wäre, würde mein Sicherungsskript zuerst die Ordner erhöhen, indem es sie um eins umbenennt, sodass Sicherung.01 zu Sicherung.02 wird. Anschließend erstellt das Skript einen neuen leeren Ordner mit dem Namen backup.01. Anschließend wird die neue Sicherung in den neuen Ordner und eine feste Verknüpfung zu backup.02 rscynciert, sodass nur neue Dateien Speicherplatz in der Sicherung belegen. Der Befehl rsync würde ungefähr so ​​aussehen: rsync -rlt Quellpfad backuppath / backup.01 --link-dest = backuppath / backup.02

Sie sehen also, dass alle harten Verknüpfungen auf dem Sicherungspfad stattfinden. Auf diese Weise müssen Sie sich beim Ändern von Dateien in Ihrem Quellpfad keine Gedanken über das Kopieren beim Schreiben machen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.