Was ist unter Linux schneller als "find" oder "diff -r", um festzustellen, ob sich etwas in einem Verzeichnis geändert hat?


8

Ich verwende tar, um einen Snapshot von verschiedenen Teilen des Dateisystems auf meinen Servern zu erstellen und diesen Snapshot dann zur Archivierung an einen externen Speicherort zu senden.

Ich möchte diesen Vorgang nur starten, wenn sich etwas geändert hat. Einige der Sicherungen werden in allen Ordnern des Systems ausgeführt, die sich sehr selten ändern (dh wenn neue Software installiert oder die Konfigurationen geändert werden).

Immer wenn eine Änderung eintritt, möchte ich einen vollständigen Schnappschuss. Ich könnte eine Liste mit geänderten Dateien erstellen find, aber ich muss wirklich nur wissen, ob die Länge dieser Liste 0 oder mehr beträgt. Die Verwendung von find ist dafür zu langsam.

Mir ist bekannt, dass es inkrementelle Sicherungen gibt, und ich verwende rsync bereits in anderen Situationen in Verbindung mit ZFS. Hier ist der Sicherungshost jedoch ein FTP-Server (also kein rsync). Ich benötige vollständige Sicherungen (da das Sicherungsarchiv als Image zum Wiederherstellen oder Klonen von Servern verwendet wird) und möchte eine komprimierte Ausgabe (daher ist tar praktisch).

Bearbeiten : Beachten Sie, dass ich nicht nach einer inkrementellen Sicherung suche (ich habe diese), sondern nach einer schnellen (die das Finden und dergleichen irgendwie ausschließt) und einfachen Möglichkeit, zu entscheiden, ob ein vollständiger Schnappschuss mit dem letzten identisch ist. Vielleicht war meine Formulierung nicht so gut. Ich habe den Titel jetzt bearbeitet.

Antworten:


2

Neuere Versionen von GNU find haben die Aktion "-quit", wodurch die Suche sofort beendet wird:

- Aktion: -beenden

Beenden Sie sofort (mit dem Rückgabewert Null, wenn keine Fehler aufgetreten sind). Dies unterscheidet sich von '-prune', da '-prune' nur für den Inhalt von beschnittenen Verzeichnissen gilt, während '-quit' die Suche einfach sofort beendet. Es werden keine untergeordneten Prozesse ausgeführt, aber es werden keine weiteren in der Befehlszeile angegebenen Dateien verarbeitet. Wenn Sie beispielsweise / tmp / foo / tmp / bar -print -quit suchen, wird nur '/ tmp / foo' ausgegeben. Alle Befehlszeilen, die mit '-exec ... +' oder '-execdir ... +' erstellt wurden, werden vor dem Beenden des Programms aufgerufen.

Sie können einen Suchausdruck verwenden, um geänderte Dateien zu finden, und -quit verwenden, um zu stoppen, sobald Sie eine finden. Das sollte schneller sein, als den Scan fortzusetzen.

-quit wurde in fileutils V4.2.3 hinzugefügt


4

GNU tar verfügt über die Option --newer-mtime, für die ein Datumsargument erforderlich ist. Dies ist vermutlich das letzte Mal, dass Sie eine Sicherung durchgeführt haben. Abhängig davon, wie viel Arbeit Sie für die Wiederherstellung des Dateisystems benötigen, kann dies entweder die letzte vollständige Sicherung sein. In diesem Fall müssen Sie den vollständigen Speicherauszug und die letzte tägliche Sicherung wiederherstellen, oder Sie können dies seit dem letzten inkrementellen Vorgang tun In diesem Fall müssten Sie den vollständigen Speicherauszug und jeden Speicherauszug danach wiederherstellen.

Diese Option hängt vom Änderungszeitstempel in der Datei ab. Wenn dieser explizit geändert wurde, besteht die Möglichkeit, dass Ihr Backup ihn verpasst.


+1 für die Nützlichkeit, nur ich möchte nicht wirklich inkrementelle Sicherung.
Hanno Fietz

3

Das Dienstprogramm incron verwendet inotify, um Befehle auszuführen, wenn Dateisystemereignisse auftreten. Die Konfigurationsdatei ähnelt einer Crontab, aber anstelle von Zeiten geben Sie Pfade und Ereignisse an.

Der Befehl kann entweder Ihr Sicherungsskript sein (in diesem Fall wird die Sicherung fast unmittelbar nach dem Ändern der Dateien gestartet), oder Sie können eine Datei erstellen lassen und das Sicherungsskript auf das Vorhandensein dieser Datei prüfen lassen und sie dann löschen. Wenn die Datei vorhanden ist, ist eines der Ereignisse seit dem letzten Lauf aufgetreten.


Ordentlich. Ich werde das versuchen.
Hanno Fietz

1
Die neuesten Linux-Versionen von @HannoFietz unterstützen fanotify, das für ganze Dateisysteme benachrichtigt. Dies ist weitaus effizienter als die separate Überwachung jedes Ordners und jedes Unterordners.
user2987828


2

Sie können die Ausgabe von find immer an wc weiterleiten und eine ganzzahlige Anzahl geänderter Dateien abrufen:

find . -ctime 1 | wc -l

Obwohl Davids Antwort weniger Codeänderungen erfordert :)


Nun ja, daran habe ich auch gedacht, aber gibt es etwas schnelleres? Für meine Zwecke konnte der Fund abgebrochen werden, sobald eine neuere Datei gefunden wurde.
Hanno Fietz

Nein, ich fürchte, du bist ziemlich festgefahren, einen Fund zu machen. Es gibt inotify, aber ich glaube, dass es nur wirklich geeignet ist, über ein paar Verzeichnisse oder Dateien benachrichtigt zu werden, nicht über ein ganzes Dateisystem.
David Pashley

2

Dies ist eine etwas wilde Idee, aber Sie könnten ein wenig mit md5sum und ls spielen.

Diese Idee besteht darin, nur eine MD5-Summe einer Datei zu betrachten, und diese Datei ist eine Dateiliste des Verzeichnisses, das Sie gerade ansehen. Und solange sich nichts ändert, ist die md5sum dieselbe. Wenn jedoch ein Zeitstempel aktualisiert wird, ändert sich die md5sum, und Sie wissen, dass Sie einen neuen Tar erstellen und an Ihren FTP-Server senden müssen.

Wir könnten mit so etwas beginnen

ls -lR /path/to/dir/ | md5sum > file_list.txt.md5

Dann müssten Sie einen Vergleich zwischen dem alten md5 und dem aktuellen hinzufügen ... etc etc.

/ Johan


Oder nur diff -qdie aktuellen und vorherigen Einträge.
Seiten

Das würde auch funktionieren.
Johan

1

tar hat eine --diffOption, die "Unterschiede zwischen Archiv und Dateisystem findet". Wenn Sie eine lokale Kopie der hochgeladenen Datei behalten, können Sie diese damit vergleichen.


Wie unterscheidet sich das vom Betrachten des Dateisystems mit Suchen und Scrap-Scraping der Ausgabe?
Hanno Fietz

Ich glaube, der Unterschied besteht darin, dass es sich um einen tatsächlichen Vergleich handelt. Wenn also die Uhrzeit explizit geändert wurde, wird sie nicht außerhalb des Sicherungszeitplans angezeigt
Fire Crow,

1

Sie haben auch die Kleinbuchstaben -g-Option -g, --listed-incremental F Erstellen / Auflisten / Extrahieren einer neuen inkrementellen Sicherung im GNU-Format

Ich habe noch nie damit gespielt, aber Sie könnten etwas schreiben, also testen Sie dies zuerst auf unkritisch. ;) mache eine vollständige Sicherung

tar -zcvf /home/backup.tar.gz /backup_dir

dann

  NOW=$(date +"%d-%m-%Y")
  i=$(date +"%Hh%Mm%Ss")
  FILE="i.$NOW-$i.tar.gz"

tar -g /home/backup.incremental.txt -zcvf /backup/$FILE /backup_dir

1

Ich habe mein Backup komplett auf rsnapshot umgestellt (perlscript, es verwendet rsync und Hardlinks, es kann Remote-Hosts sichern)

Jede Nacht kopiert rsync nur neuere Dateien und dank Hardlinks repräsentiert jeder Backup-Ordner die vollständigen Daten.

rsnapshot ist super schnell und die Wiederherstellung ist so einfach - probieren Sie es aus!


Ich habe rsnapshot schon einmal benutzt, es ist großartig, ich weiß. Mein Problem hier ist jedoch wirklich das FTP-Ziel.
Hanno Fietz

Oh, das tut mir leid. Dann kann ich Ihnen bei diesem Problem keine nützliche Hilfe geben: - /
ThorstenS

1

Radikale Idee: Sie können das System die betreffenden Dateien für jeden Zugriff prüfen lassen.

Dies ist in Bezug auf die Protokollierung sehr ausführlich, würde Ihnen jedoch bei jedem Lesen / Schreiben Datenstempel liefern. Ja, das Konzept ähnelt der Windows NT-Überwachungsprotokollierung. Es ist wahrscheinlich übertrieben für Ihr Setup, aber der Vollständigkeit halber lehne ich dieses Konzept ab ...

Mit diesem kurzen Tutorial können Sie hier die Überwachung einrichten .

Vorteile:

  • fängt fast alles ab, einschließlich eines Verlaufs mehrerer Bearbeitungen und Änderungen.
  • sehr feine Kornkontrolle
  • kann selektiv nach Datei prüfen

Nachteile:

  • Erhöht den Protokollspeicher um den Faktor 1 Bazillion Prozent, wenn er nicht ordnungsgemäß auf die Verzeichnisse beschränkt wird, um die Sie sich Sorgen machen. Verwenden Sie es mit Bedacht.
  • Überprüft keine Datenänderungen, nur wer was wann getan hat

Mit dem ausearchTool können Sie Änderungen an Dateien pro Dateiname suchen. Mit einem einfachen Skript, das die Verzeichnisse (und Unterverzeichnisse?) Pro Datei durchlaufen kann, können Sie Änderungen an einer einfachen Datei vornehmen und erhalten eine Liste der Dateien, die in den von Ihnen angegebenen Kriterien "berührt" wurden. Sie können dies problemlos mit anderen Filteroptionen ausearchfür Benutzer pro Benutzer (nützlich, wenn Sie ein Benutzerkonto für einen Dienst haben), pro Befehl usw. erweitern.


+1 für interessant, obwohl ich es in meinem Szenario nicht sehen kann.
Hanno Fietz

1

Sie könnten git installieren und die Ausgabe von "git status" (oder vielleicht die Exit-Codes?) Für die betreffenden Verzeichnisse analysieren. Git ist ziemlich schnell in dem, was es tut.

Stellen Sie einfach sicher, dass Sie die Änderungen festschreiben, damit bei aufeinanderfolgenden Aufrufen des "Git-Status" Änderungen angezeigt werden.

Eine andere Idee wäre, Tripwire oder ein ähnliches Werkzeug zu verwenden.

Ein Brute-Force-Ansatz wäre, die Verzeichnisse ohnehin regelmäßig zu tarieren und einen MD5 des vorherigen Teers zu vergleichen. Wenn die Verzeichnisse jedoch groß sind, würde dies nicht allzu gut skalieren.


1

Es hört sich so an, als ob Sie wirklich einen Sicherungsprozess auslösen möchten, wenn sich etwas in einer Verzeichnishierarchie ändert. Inotify kann hier möglicherweise helfen.


Ja, das würde es, aber ich müsste immer noch meine eigene kleine Software programmieren, die diese Ereignisse abhört und dann etwas unternimmt. Ich suche etwas, das ich einfach benutzen kann.
Hanno Fietz

0

Protokollieren Sie die Ausgabe von ls -UlR --full-time /list/of /folders/to/monitor und leiten Sie sie weiter diff -q, um den Vergleich zu stoppen, wenn eine Änderung zwischen der Eingabe und der zwischengespeicherten Version festgestellt wird (erstes Argument).

Wenn diffSie einen Unterschied feststellen, erstellen Sie die zwischengespeicherte Version neu, um die letzten Dateien zu berücksichtigen, und erstellen Sie dann erneut einen Snapshot der Pfade, wie Sie es normalerweise tun.

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.