Diff Ganze Linux-Systeme

8

Ich habe ein Linux-Basissystem installiert. Ich möchte ein sehr großes und komplexes Skript von Drittanbietern ausführen, das viele Änderungen an verschiedenen Teilen des gesamten Systems vornimmt. Diese Änderungen umfassen das Hinzufügen neuer Dateien, das Ändern vorhandener Dateien und das Entfernen vorhandener Dateien. Sobald das Skript fertig ist, werde ich ein modifiziertes System haben. Die Änderungen werden umfassend und erheblich sein.

Ich möchte eine Art Bericht über alle Dateien, die hinzugefügt, entfernt oder geändert wurden, und eine zeilenweise Analyse der Änderungen. So etwas wie die Ausgabe eines Datei-Diff-Tools wäre großartig.

Ich gehe davon aus, dass ich vor dem Ausführen des Skripts eine Art Schnappschuss erstellen muss und danach einen zweiten Schnappschuss. Ich gehe dann davon aus, dass ich diese Schnappschüsse in eine Art Diff oder Diff-ähnliches Tool einspeisen würde.

Weiß jemand, welche Tools zu verwenden sind und wie ein gesamtes System unterschieden werden kann?

Ich verwende Virtualbox mit einer Funktion zum Differenzieren von Bildern , obwohl ich nicht weiß, ob ich sie an diesen Zweck anpassen kann. Außerdem würde ich nach Möglichkeit eine allgemeinere Lösung bevorzugen.


quelle
Unterschiedliche Bilder (auch als Schnappschüsse bezeichnet) sind nicht das, wonach Sie suchen. Ihr Ziel ist es, ein möglichst kleines binäres Diff zu erzeugen, kein ausführliches Textdiff.
Dmitry Grigoryev
@DmitryGrigoryev Das ist der Eindruck, den ich von dem Link bekommen habe. Vielen Dank, dass Sie dies für mich bestätigt haben.
In der Tat ist das, was Sie wollen, recht einfach, aber kompliziert zu erreichen. Angesichts der Ressourcen würde ich zwei Systeme genau gleich installieren. Aktivieren Sie die Dateisystemprüfung auf dem System, auf dem die Dateien geändert werden. Holen Sie sich den Bericht vom Audit, um festzustellen, was hinzugefügt / modfiry / delete wurde. Vergleichen Sie diese Dateien dann mit dem anderen installierten System.
BitsOfNix
1
Sie können rsynceinen Snapshot erstellen und nach den Änderungen einen weiteren Lauf ausführen, um einen Bericht über geänderte Dateien zu erstellen. Der unterschiedliche Teil wäre wahrscheinlich schwieriger.
FloHimself

Antworten:

1

Ich denke, Ihre Idee ist nicht weit von einer Lösung entfernt. Um einen möglichen Weg zu skizzieren: Ich verwende rsnapshotfür Backups. Es erstellt eine Verzeichnisstruktur (Backup-) aller oder einer Teilmenge Ihrer Dateien mit Einstiegspunkten von (z. B.) /backup/hourly.1/...und /backup/hourly.0/..., wobei jeder Zweig die gesamten Daten enthält, verwendet jedoch (Hard-) Links für Dateien, bei denen keine Änderungen vorgenommen wurden . Wenn Sie eine rekursive lsoder findbeide Strukturen ausführen und die (sortierte, im Falle einer Suche) Ausgabe vergleichen, werden die fehlenden Dateien angezeigt, und ls -lwenn Sie die Anzahl der Links überprüfen (in der zweiten Spalte wäre dies), werden neue Dateien angezeigt (die eine Anzahl der Links haben) 1). Für Details zu Änderungen in den Dateien können Sie (für die identifizierten Dateien) normal verwendendiffWerkzeuge. Wie gesagt, dies ist eine Übersicht, die einige Arbeit erfordert, um sie umzusetzen, und möglicherweise nicht offensichtliche Macken aufweist. Nehmen Sie diesen Vorschlag also mit einem Körnchen Salz

Janis
quelle
0

Ich würde dies wahrscheinlich mit rsync tun, wie in einem der Kommentare vorgeschlagen. Rsync verfügt über einen Trockenlaufmodus und eine Prüfsummenfunktion, mit der Sie einen genauen Bericht über die Änderungen erstellen können.

Wenn Sie weiter gehen, könnten Sie vielleicht ein Skript schreiben, das einen Unterschied bei geänderten Dateien ausführt, obwohl Sie dafür sorgen müssten, dass Binärdateien vermieden werden (nicht sicher, wie).

Oder Sie könnten einen ganz anderen Ansatz wählen. Verwenden Sie git. Führen Sie also auf Ihrem 'Basissystem' einen Git-Init in / aus, und nachdem Sie das Drittanbieter-Ding ausgeführt haben, können Sie einfach Folgendes tun:

git status > /tmp/changed-files.txt
git diff > /tmp/changes.txt

Die Verwendung von Git würde Ihnen einiges an Flexibilität geben. Allerdings kann es um ein ganzes System kämpfen und über / proc etc verwirrt werden.

John Hunt
quelle
0

Es gibt etwas namens libguestfs, mit dem Sie den Diff ausführen können. Das habe ich in der Vergangenheit verwendet und ich denke jetzt, dass die Operation möglicherweise sogar eingebaut ist, sodass Sie die Guestfish-Shell nicht verwenden müssen.

Eine andere Möglichkeit besteht darin, Ihre Vorgänge in einem Docker-Container auszuführen und die resultierenden Dateibäume dann als TAR-Dateien zu exportieren und zu unterscheiden.

Beachten Sie jedoch, dass wenn das Skript die Systemeinstellungen durch Schreiben in virtuelle Dateien ändert, diese Änderungen nicht im Dateibaum angezeigt werden und Sie etwas anderes benötigen, um diese Änderungen zu erfassen. Ein Beispiel für so etwas sind iptable Regeln. Sie benötigen eine benutzerdefinierte Logik, um diese Änderungen zu erfassen.

davidk01
quelle
Außer wenn die Regel persistent ist, muss sie irgendwo gespeichert werden, damit sie nach dem
Hochfahren des
0

Die Seite im Linux-Kochbuch zeigt ein find-grep vor und nach der Änderung, gefolgt von einem Unterschied. Es ist sehr einfach, es könnte ein Ausgangspunkt sein, aber Ihr Problem könnte besser mit den ausgefeilteren Lösungen angegangen werden.

Dies sieht so aus, als würde es nur Ergänzungen und Löschungen erfassen, keine Änderungen ... Prost, drl

drl
quelle
0

Alle diese Antworten gehen in die richtige Richtung und auf die gleiche Weise. Kann auch meine 8 Bits in ...

Installieren Sie das Basissystem auf der Virtualbox. Starten Sie die VM nach der Ersteinrichtung und wenn Ihre Basis bereit ist, mit einem anderen Live-Medium. Sie können das Dateisystem dann tarieren oder auf andere Weise exportieren, ohne dass die flüchtigen Verzeichnisse /procbeteiligt sind.

Führen Sie Ihr umfangreiches Skript aus und wiederholen Sie den Exportvorgang.

Jetzt haben Sie die 2 Dateisysteme zur Verfügung, Sie können verschiedene Vergleichstools verwenden.

diff --brief -Nr /tree1 /tree2

Sie erhalten eine schöne Liste von Dateien, die sich unterscheiden stdout, und eine Liste von Dateien, die in dem einen oder anderen Baum nicht gefunden werden stderr.

Um herauszufinden, welche tatsächlichen Änderungen vorgenommen wurden, können Sie die stdoutAusgabe von Dateien, die sich unterscheiden , analysieren und regelmäßig diffeinzeln ausführen , um die Ausgabe in eine Datei umzuleiten. Oder Sie können einfach die Liste untersuchen und diff für die Dateien ausführen, die Sie besonders interessieren.

Sie können all dies mit einem Befehl kombinieren git. Kann verwendet werden, ohne dass ein Repo initialisiert wird. Zeigen Sie einfach auf 2 beliebige Verzeichnisse. Gibt eine schöne farbige Ausgabe, paginiert durch weniger.

git diff --no-index /tree1 /tree2

ivanivan
quelle