Tool oder Skript zum Erkennen verschobener oder umbenannter Dateien unter Linux vor einem Backup [geschlossen]

15

Grundsätzlich bin ich auf der Suche nach einem Tool oder Skript, das verschobene oder umbenannte Dateien erkennt, damit ich eine Liste der umbenannten / verschobenen Dateien abrufen und denselben Vorgang am anderen Ende des Netzwerks ausführen kann, um Bandbreite zu sparen.

Grundsätzlich ist Festplattenspeicher billig, Bandbreite jedoch nicht, und das Problem ist, dass die Dateien häufig reorganisiert oder in eine bessere Verzeichnisstruktur verschoben werden. Wenn Sie also rsync für die Sicherung verwenden, merkt rsync nicht, dass es sich um ein umbenanntes oder handelt Datei verschoben und erneut über das Netzwerk übertragen, obwohl am anderen Ende dieselbe Datei vorhanden ist.

Ich frage mich also, ob es ein Skript oder Tool gibt, das aufzeichnet, wo sich alle Dateien und ihre Namen befinden. Kurz vor einer Sicherung würde es verschobene oder umbenannte Dateien erneut scannen und erkennen. Dann kann ich diese Liste übernehmen und erneut anwenden Verschieben / Umbenennen auf der anderen Seite.

Hier ist eine Liste der "allgemeinen" Funktionen der Dateien:

  1. Große unveränderliche Dateien
  2. Sie können umbenannt oder verschoben werden

[Bearbeiten:] Das sind alles gute Antworten, und am Ende habe ich mir alle Antworten angesehen und werde einen Code schreiben, um damit umzugehen. Grundsätzlich denke ich / arbeite ich gerade an:

  1. Verwenden Sie für den "anfänglichen" Scan so etwas wie AIDE, und ermöglichen Sie mir, die Prüfsummen für die Dateien beizubehalten, da sie sich eigentlich nie ändern sollten. Dies würde helfen, Beschädigungen zu erkennen.
  2. Erstellen eines inotify-Daemons, der diese Dateien / Verzeichnisse überwacht und alle Änderungen in Bezug auf das Umbenennen und Verschieben der Dateien in eine Protokolldatei aufzeichnet.
  3. Es gibt einige Randfälle, in denen inotify möglicherweise nicht aufzeichnet, dass etwas mit dem Dateisystem passiert ist. Daher besteht ein letzter Schritt darin, das Dateisystem mit find nach Dateien zu durchsuchen, deren Änderungszeitpunkt nach der letzten Sicherung liegt .

Dies hat mehrere Vorteile:

  1. Prüfsummen / etc von AIDE, um zu überprüfen / sicherzustellen, dass einige Medien nicht beschädigt wurden
  2. Inotify hält den Ressourcenverbrauch niedrig und es ist nicht erforderlich, das Dateisystem immer wieder neu zu scannen
  3. Rsync muss nicht gepatcht werden. Wenn ich Dinge patchen muss, die ich kann, aber ich würde es vorziehen, zu vermeiden, Dinge zu patchen, um die Belastung zu verringern (IE muss nicht jedes Mal neu patchen, wenn es ein Update gibt).
  4. Ich habe Unison schon einmal benutzt und es ist wirklich nett, aber ich hätte schwören können, dass Unison Kopien im Dateisystem aufbewahrt und dass seine "Archiv" -Dateien ziemlich groß werden können.
Pharaun
quelle

Antworten:

7

Unison http://www.cis.upenn.edu/~bcpierce/unison/ behauptet, Bewegungen erkennen und umbenennen zu können.

Es gibt ein paar Patches für rsync, um die Erkennung von Verschiebungen / Umbenennungen hinzuzufügen:

http://gitweb.samba.org/?p=rsync-patches.git;a=blob;f=detect-renamed-lax.diff;h=1ff593c8f97a97e8970d43ff5a62dfad5abddd75;hb=master

http://gitweb.samba.org/?p=rsync-patches.git;a=blob;f=detect-renamed.diff;h=c3e6e846eab437e56e25e2c334e292996ee84345;hb=master

Bugzilla-Eintrag, der dieses Problem verfolgt: https://bugzilla.samba.org/show_bug.cgi?id=2294

Mark Wagner
quelle
6
Warum sind diese Patches nicht integriert? Sie fügen nur Flaggen hinzu und sind nicht aufdringlich. Ein weiterer interessanter Patch ist rsyncsums , mit dem Prüfsummen zwischen rsync-Läufen beibehalten werden können.
Tobu
5

Dies ist eine seltsame Lösung, aber ... git erkennt Verschiebungen und benennt sie basierend auf dem Dateiinhalt um. Wenn Sie also die fraglichen Verzeichnisse unter Versionskontrolle halten, kann git Verschiebungen und dergleichen erkennen und die Übertragung vermeiden Inhalt (da es sich bereits auf beiden Seiten des Drahtes befindet), während noch Dinge im Baum bewegt werden.

Nur ein Gedanke.

pjz
quelle
2
Ja, ich dachte, wenn die Dateien klein und textbasiert wären, würde dies wahrscheinlich gut funktionieren, aber sie sind binär und die Gesamtgröße nähert sich einem Terabyte.
Pharaun
@Pharaun Sie benötigen den Git-Index ohne den Blob-Speicher. Vielleicht diesen Code aus git rippen und zu libgit2 hinzufügen.
Tobu
Der entsprechende Code beginnt mit refresh_index in read-cache.c.
Tobu
5

interessante Vorschläge hier. Dachte auch an die Verwendung von Dateisystemfähigkeiten, zB ZFS. Fand es seltsam, dass es kein Tool gibt, das so einfach ist. Die Unison-Option funktioniert in den meisten Fällen nicht, da die Leute darüber berichten, auch nicht für mich.

Ich möchte, dass die Funktion die Sicherung meiner Filmsammlung auf der zweiten Festplatte synchronisiert, wenn Ordner neu angeordnet werden.

Jetzt fand ich dieses einfache C-Skript http://sourceforge.net/projects/movesync/

Scheint gut zu funktionieren. Führe es aus und synchronisiere es dann normal mit zB unisono.

Groovehunter
quelle
4

Möglicherweise können Sie ein hostbasiertes IDS wie AIDE verwenden und anhand seiner Ausgabe ein Wrapper-Skript schreiben. Unter Berücksichtigung der Prüfsummen müssten Sie wahrscheinlich komplexere Logik schreiben.

Andernfalls kann ein netzwerkbasiertes Dateisystem sinnvoll sein, da die Änderungen an allen Standorten wirksam werden. Trotzdem vermute ich, dass Sie über das Internet übertragen, was die Möglichkeiten hier einschränken wird.

Warner
quelle
Das war es, worüber ich nachdachte, eines davon zu nehmen und es zu erweitern. Auch ja, ich übertrage es über das Internet und die Bandbreite ist ziemlich begrenzt.
Pharaun
3

Sie könnten versuchen, unisono ; insbesondere das

-xferbycopying optimiert Übertragungen mithilfe lokaler Kopien (Standardwert true)

Option erwähnt in den Dokumenten als

Wenn diese Voreinstellung festgelegt ist, versucht Unison, das Übertragen von Dateiinhalten über das Netzwerk zu vermeiden, indem erkannt wird, wenn in der Zielreproduktion bereits eine Datei mit dem erforderlichen Inhalt vorhanden ist. Dies ermöglicht normalerweise eine sehr schnelle Weitergabe von Dateiverschiebungen. Der Standardwert ist true.

Sieht aus, als würde es tun, was Sie wollen.

pjz
quelle
Eigentlich wäre ich im Nachhinein vielleicht zu voreilig bei dem Kommentar gewesen. Unterstützt unison das Ersetzen eines Hardlinks durch den tatsächlichen Dateiinhalt, wenn sich dieser ändert? Wenn ja, dann könnte ich vielleicht etwas Magie mit rsnapshot + unison machen, was meinen Anforderungen entsprechen würde, ohne eine Tonne neuen Codes / Logs / etc schreiben zu müssen, um damit fertig zu werden.
Pharaun
3

Syrep macht was Sie brauchen. Es hält die Nachrichtenauszüge in einem Dateibaum auf dem neuesten Stand. Wenn Sie die Digests in der Nähe lassen, ist dies effizienter als rsync. Es wurde für Sneakernet entwickelt, sodass Sie möglicherweise einen Wrapper hinzufügen möchten, der Updates / Makepatches / Merges auf einmal ausführt.

Tobu
quelle
2

Ich bin mir nicht sicher, ob es ein vorhandenes Tool gibt, das dies für Sie erledigt, aber Sie könnten ein einfaches Skript schreiben, das nur ein Skript findim Basisverzeichnis ausführt, das mtimeneuer ist als die letzte Sicherung. Dadurch erhalten Sie eine Liste aller Dateien, die geändert wurden . Wenn eine Datei einfach verschoben wurde, wird sie nicht in der Liste angezeigt. Leider enthält diese Liste die Verzeichnisse, in die die Dateien verschoben wurden, da das Verzeichnis aktualisiert wird, wenn eine Datei hinzugefügt / entfernt wird.

Mit dieser Dateiliste können Sie mit rsync nur diese Dateien synchronisieren. rsync bietet die Möglichkeit, eine Dateiliste einzulesen. Hier ist ein Test, der dieses Beispiel zeigt:

$ cd tmp
$ echo test > test
$ ls -la
total 16
drwxr-xr-x 2 root root 4096 Aug 18 11:34 .
drwxr-x--- 5 root root 4096 Aug 18 11:34 ..
-rw-r--r-- 1 root root    5 Aug 18 11:34 test
$ mkdir tmp2
$ find . -mmin 1
$ date
Wed Aug 18 11:35:10 EDT 2010
$ find . -mmin 1
$ find . -mmin 2
.
./test
./tmp2
$ mv test tmp2
$ find . -mmin 1
.
./tmp2

Bitte beachten Sie, dass ich zwischen den einzelnen Befehlen ca. 1 Minute gewartet habe find. Daraus geht hervor, dass die Datei beim erstmaligen Erstellen nach aufgelistet wird find. Wenn ich die Datei in ein anderes Verzeichnis verschiebe und den findBefehl erneut ausführe , wird nur das Verzeichnis angezeigt, in das ich die Datei verschoben habe, und nicht die Datei selbst. Sie können eine Kombination aus findund rsyncBefehlen verwenden, um nur die gewünschten Dateien aufzulisten. Dies kann wahrscheinlich Ihr Ziel erreichen.

Ich hoffe das hilft.

vmfarms
quelle
2

In Anbetracht Ihres Workflows frage ich mich, ob die Arbeit auf Dateiebene (wie bisher von anderen vorgeschlagen) die beste Lösung ist. Du könntest arbeiten ...

Auf Dateisystemebene

Die Idee ist, dass das Dateisystem die Vorgänge zwischen Sicherungen verfolgt. Anstatt eine Sicherung des Dateisystems zu machen, sichern das Dateisystem Journal (und Wiedergabe optional die Änderungen auf dem Backup - Maschine, wenn Sie eine ready-to-use sichern möchten). Ein Dateisystemjournal drückt natürlich Verschiebungen und Löschungen in wenigen Bytes aus.

Mit Fuse ist es relativ einfach, ein Dateisystem mit bestimmten Anforderungen zu entwerfen, das sich auf einem „echten Dateisystem“ befindet. Ich habe es noch nie benutzt, aber LoggedFS sieht vielversprechend aus.

Bei dieser Lösung lohnt sich eine Art Journalkomprimierung. Wenn eine Datei beispielsweise zehnmal überschrieben wurde, behalten Sie nur ihre letzte Aktualisierung im Journal bei. Eine weitere sinnvolle Optimierung besteht darin, Kopiervorgänge und noch besser Bearbeitungen zu erkennen (dh eine Datei zu erstellen, die zum größten Teil, aber nicht vollständig mit einer anderen Datei identisch ist). Ich weiß nicht, ob jemand dies umgesetzt hat. Für Ihren Workflow würde das ohnehin nicht viel ausmachen.

Bei der Lautstärke

Die Idee ist, dass der Volume-Manager die Vorgänge zwischen Sicherungen verfolgt. Anstatt eine Sicherungskopie des Dateisystems zu erstellen, erstellen Sie einen Snapshot mit dem Volume-Manager und sichern Sie den Snapshot , der als Unterschied zum vorherigen Snapshot ausgedrückt wird.

Dies sollte gut funktionieren, wenn Sie lediglich Dateien erstellen, umbenennen und entfernen. Es wäre viel schwieriger, Dinge wie Kopien und Bearbeitungen zu erkennen oder die Erstellung einer Datei und das anschließende Löschen zu optimieren.

Gilles 'SO - hör auf böse zu sein'
quelle
Ich habe tatsächlich ein bisschen an einem "Dateisystem" -Logger über inotify gearbeitet, um die Änderungen im Auge zu behalten. Wenn die Änderungen jedoch schneller eingehen als der Daemon sie aufzeichnen kann, gehen Informationen verloren und müssen daher einen erstellen Sichern / Scannen, um den Ausgangszustand zu erhalten und im Falle eines Informationsverlusts zu benachrichtigen. Es sieht so aus, als ob die Idee, dass sich etwas zwischen dem Dateisystem und dem Rest des Systems befindet, auch eine gute Idee wäre, wenn Änderungen auf dem Sicherungscomputer wiederholt werden könnten.
Pharaun
Aber dass loggedFS wie ein interessantes Projekt aussieht, ist nur bedenklich, dass sie dev 2008/09 gestoppt haben. Ich werde damit spielen müssen und sehen, ob es den Trick macht.
Pharaun
0

Unison ist dafür gut geeignet, muss aber immer noch Dateien lokal kopieren und kann ein Verschieben / Umbenennen nicht erkennen, wenn sich auch der Dateiinhalt nur geringfügig geändert hat.

Ich habe ein einfaches Python-Skript erstellt, um umbenannte / verschobene Dateien und Verzeichnisse mithilfe von Inode-Nummern (nur * nix) zu erkennen und diese Änderungen auf dem synchronisierten Computer wiederzugeben. Sie können es alleine oder als "Umbenennungs-Präprozessor" für Unison oder rsync verwenden. Es kann hier gefunden werden

Rolicot
quelle