Diff Systèmes Linux entiers

8

J'ai un système Linux de base installé. Je veux exécuter un script tiers très grand et complexe qui apportera de nombreuses modifications à diverses parties de l'ensemble du système. Ces changements comprendront l'ajout de nouveaux fichiers, la modification de fichiers existants et la suppression de fichiers existants. Une fois le script terminé, j'aurai un système modifié. Les modifications seront larges et substantielles.

Je veux une sorte de rapport sur tous les fichiers qui ont été ajoutés, supprimés ou modifiés et une analyse ligne par ligne des modifications. Quelque chose comme la sortie d'un outil de comparaison de fichiers serait génial.

Je suppose que je dois faire une sorte d'instantané avant d'exécuter le script et un deuxième instantané après. Je suppose que je nourrirais ces instantanés dans une sorte d'outil diff ou similaire.

Quelqu'un sait-il quels outils utiliser et comment différencier un système entier?

J'utilise Virtualbox qui a une fonctionnalité d'images de différenciation , mais je ne sais pas si je peux l'adapter à cette fin. De plus, je préférerais une solution plus générique si possible.


la source
Les images de différenciation (alias instantanés) ne sont pas ce que vous recherchez. Leur but est de produire un diff binaire aussi petit que possible, pas un diff textuel verbeux.
Dmitry Grigoryev
@DmitryGrigoryev C'est l'impression que j'ai eue du lien. Merci d'avoir confirmé cela pour moi.
En fait, ce que vous voulez est assez facile mais compliqué à réaliser. Étant donné les ressources, j'installerais deux systèmes exactement les mêmes. Activez l'audit du système de fichiers sur le système sur lequel les fichiers seront modifiés. Obtenez le rapport d'audit pour identifier ce qui a été ajouté / modfiry / supprimer. Comparez ensuite ces fichiers avec l'autre système installé.
BitsOfNix
1
Vous pouvez utiliser rsyncpour créer un instantané et une autre exécution après les modifications pour générer un rapport des fichiers modifiés. La partie différente serait probablement plus difficile.
FloHimself

Réponses:

1

Je pense que votre idée n'est pas loin d'une solution. Pour décrire un moyen possible: j'utilise rsnapshotpour les sauvegardes. Il crée une structure de répertoires (de sauvegarde) de tout ou partie d'un sous-ensemble de vos fichiers avec des points d'entrée (par exemple) /backup/hourly.1/...et /backup/hourly.0/..., où chaque branche transporte la totalité des données, mais en utilisant des liens (durs) pour les fichiers où aucune modification n'a été effectuée . Faire un récursif lsou findsur les deux structures et comparer la sortie (triée, en cas de recherche) affichera les fichiers manquants, et inspecter le nombre de liens ( ls -lce serait la deuxième colonne) affichera les nouveaux fichiers (qui ont un nombre de liens 1). Pour plus de détails sur les modifications des fichiers, vous pouvez (pour les fichiers identifiés) utiliserdiffoutils. Comme indiqué, il s'agit d'un aperçu, il faudra du travail pour le mettre en œuvre et peut avoir des bizarreries non apparentes, alors prenez cette proposition avec un grain de sel

Janis
la source
0

Je le ferais probablement en utilisant rsync comme suggéré dans l'un des commentaires. Rsync dispose d'un mode de fonctionnement à sec et d'une fonction de somme de contrôle que vous pouvez utiliser pour créer un rapport précis de ce qui a changé.

En allant plus loin, vous pourriez peut-être écrire un script qui effectue une différence sur les fichiers modifiés, bien que vous deviez éviter les fichiers binaires (vous ne savez pas comment).

Ou, vous pouvez adopter une approche totalement différente .. utilisez git. Donc, sur votre système «de base», effectuez un init git dans /, puis après avoir exécuté la chose tierce que vous pourriez simplement faire:

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

utiliser git vous donnerait un peu de flexibilité. Cela dit, il peut être difficile de gérer un système entier et de se tromper sur / proc, etc.

John Hunt
la source
0

Il y a quelque chose appelé libguestfs que vous pouvez utiliser pour effectuer la différence. C'est ce que j'ai utilisé dans le passé et je pense maintenant que cette opération pourrait même être intégrée afin que vous n'ayez pas à utiliser la coquille de poisson invité.

Une autre option consiste à exécuter vos opérations dans un conteneur Docker, puis à exporter et à différencier les arborescences de fichiers résultantes sous forme de fichiers tar.

Sachez cependant que si le script modifie les paramètres système en écrivant dans des fichiers virtuels, ces modifications n'apparaîtront pas dans l'arborescence de fichiers et vous aurez besoin d'autre chose pour capturer ces modifications. Un exemple de quelque chose comme ça est les règles iptables. Vous aurez besoin d'une logique personnalisée pour capturer ces modifications.

davidk01
la source
Sauf si la règle est persistante, elle doit être stockée quelque part afin de pouvoir être réexécutée /
réactivée
0

La page du Linux Cookbook montre une recherche et une grep avant et après modification, suivies d'un diff. C'est très simple, cela pourrait être un point de départ, mais votre problème pourrait être mieux traité avec les solutions plus sophistiquées indiquées.

On dirait qu'il ne capturerait que les ajouts et les suppressions, pas les modifications ... cheers, drl

drl
la source
0

Toutes ces réponses vont dans la bonne direction et de la même manière. Autant jeter mes 8 bits ...

Installez le système de base sur virtualbox. Après la configuration initiale et votre base est prête, démarrez le VM avec un autre média en direct. Vous pouvez ensuite tar ou autrement exporter le système de fichiers sans que les répertoires volatils /procsoient impliqués.

Exécutez votre script massif et répétez le processus d'exportation.

Maintenant que vous avez les 2 systèmes de fichiers disponibles, vous pouvez utiliser différents outils de comparaison.

diff --brief -Nr /tree1 /tree2

Vous donnera une belle liste de fichiers qui diffèrent sur stdout, et une liste de fichiers qui ne se trouvent pas dans une arborescence ou l'autre stderr.

Pour savoir quels changements réels ont eu lieu, vous pouvez analyser la stdoutsortie des fichiers qui diffèrent et les exécuter diffindividuellement, en redirigeant la sortie vers un fichier. Ou vous pouvez simplement examiner la liste et lancer un diff sur les fichiers qui vous intéressent particulièrement.

Vous pouvez combiner tout cela en une seule commande, en utilisant git. Peut être utilisé sans initialisation d'un référentiel, il suffit de pointer vers 2 répertoires. Donne une belle sortie colorée, paginée à travers moins.

git diff --no-index /tree1 /tree2

ivanivan
la source