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.
rsync
pour 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.Réponses:
Je pense que votre idée n'est pas loin d'une solution. Pour décrire un moyen possible: j'utilise
rsnapshot
pour 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écursifls
oufind
sur les deux structures et comparer la sortie (triée, en cas de recherche) affichera les fichiers manquants, et inspecter le nombre de liens (ls -l
ce 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) utiliserdiff
outils. 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 sella source
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:
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.
la source
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.
la source
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
la source
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
/proc
soient 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'autrestderr
.Pour savoir quels changements réels ont eu lieu, vous pouvez analyser la
stdout
sortie des fichiers qui diffèrent et les exécuterdiff
individuellement, 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
la source