Diff interi sistemi Linux


8

Ho un sistema Linux di base installato. Voglio eseguire uno script di terze parti molto grande e complesso che apporterà molte modifiche a varie parti dell'intero sistema. Queste modifiche includeranno l'aggiunta di nuovi file, la modifica di file esistenti e la rimozione di file esistenti. Una volta completato lo script, avrò un sistema modificato. Le modifiche saranno ampie e sostanziali.

Voglio una sorta di rapporto su tutti i file che sono stati aggiunti, rimossi o modificati e un'analisi riga per riga delle modifiche. Qualcosa come l'output di uno strumento diff file sarebbe fantastico.

Presumo di dover fare una sorta di istantanea prima di eseguire lo script e una seconda istantanea dopo. Suppongo quindi di inserire queste istantanee in una sorta di strumento diff o diff.

Qualcuno sa quali strumenti utilizzare e come diff un intero sistema?

Sto usando Virtualbox che ha una funzione di differenziazione delle immagini , anche se non so se posso adattarlo a questo scopo. Inoltre, preferirei una soluzione più generica, se possibile.


Le immagini differenziali (ovvero le istantanee) non sono ciò che stai cercando. Il loro obiettivo è quello di produrre una differenza binaria il più piccola possibile, non una differenza testuale dettagliata.
Dmitry Grigoryev il

@DmitryGrigoryev Questa è l'impressione che ho ricevuto dal link. Grazie per avermelo confermato.

In realtà ciò che vuoi è abbastanza facile ma complicato da realizzare. Date le risorse installerei due sistemi esattamente uguali. Abilita il controllo del filesystem sul sistema che avrà i file modificati. Ottieni il rapporto dall'audit per identificare ciò che è stato aggiunto / modfiry / elimina. Quindi confrontare questi file con l'altro sistema installato.
BitsOfNix il

1
È possibile utilizzare rsyncper creare un'istantanea e un'altra esecuzione dopo le modifiche per generare un rapporto di file modificati. La parte diversa sarebbe probabilmente più difficile.
FloHimself

Risposte:


1

Penso che la tua idea non sia lontana da una soluzione. Per delineare un modo possibile: sto usando rsnapshotper i backup. Crea una struttura di directory (backup-) di tutto o di un sottoinsieme dei tuoi file con punti di ingresso di (ad esempio) /backup/hourly.1/...e /backup/hourly.0/..., in cui ogni ramo trasporta tutti i dati, ma usando collegamenti (hard-) per file in cui non sono state apportate modifiche . Facendo un ricorsivo lso findsu entrambe le strutture e confrontando l'output (ordinato, in caso di ricerca) verranno mostrati i file mancanti e controllando il conteggio dei collegamenti (in ls -lquesto sarebbe la seconda colonna) verranno mostrati nuovi file (che hanno un conteggio dei collegamenti 1). Per i dettagli delle modifiche ai file è possibile (per i file identificati) utilizzare ordinariodiffutensili. Come detto, questo è uno schema, avrà bisogno di un po 'di lavoro da implementare e potrebbe avere stranezze non apparenti, quindi prendi quella proposta con un pizzico di sale


0

Probabilmente lo farei usando rsync come suggerito in uno dei commenti. Rsync ha una modalità di funzionamento a secco e una funzione di checksum che puoi utilizzare per creare un rapporto accurato di ciò che è cambiato.

Portandolo oltre potresti forse scrivere uno script che esegue una diff su file modificati, anche se dovresti farlo evitare file binari (non sai come).

Oppure, potresti adottare un approccio totalmente diverso .. usa git. Quindi sul tuo sistema 'base', esegui un git init in /, quindi dopo aver eseguito la cosa di terze parti potresti semplicemente fare:

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

usare git ti darebbe un po 'di flessibilità. Detto questo, potrebbe avere difficoltà su un intero sistema e confondersi con / proc ecc.


0

C'è qualcosa chiamato libguestfs che puoi usare per eseguire il diff. Questo è quello che ho usato in passato e penso che ora potrebbe persino essere integrata l'operazione in modo da non dover usare la shell guestfish.

Un'altra opzione è eseguire le operazioni in un contenitore finestra mobile, quindi esportare e diffre gli alberi di file risultanti come file tar.

Tenere presente che se lo script modifica le impostazioni di sistema scrivendo in file virtuali, tali modifiche non verranno visualizzate nella struttura dei file e sarà necessario qualcos'altro per acquisire tali modifiche. Un esempio di qualcosa del genere sono le regole iptable. Avrai bisogno di una logica personalizzata per acquisire tali modifiche.


Tranne se la regola è persistente, deve essere archiviata da qualche parte in modo che possa essere rieseguita / riattivata dopo l'arrivo della rete, ecc.
Ivanivan,

0

La pagina di The Linux Cookbook mostra un pre-e post-modifica find-grep, seguito da un diff. È molto semplice, potrebbe essere un punto di partenza, ma il tuo problema potrebbe essere affrontato meglio con le soluzioni più sofisticate indicate.

Sembra che catturerebbe solo aggiunte ed eliminazioni, non modifiche ... evviva, drl


0

Tutte queste risposte sono dirette nella giusta direzione e allo stesso modo. Può anche buttare i miei 8 bit in ...

Installa il sistema di base su virtualbox. Dopo l'installazione iniziale e la tua base è pronta, avvia la VM con alcuni altri media live. È quindi possibile eseguire il taring o esportare in altro modo il file system senza /processere coinvolti nelle directory volatili .

Esegui il tuo enorme script e ripeti il ​​processo di esportazione.

Ora hai a disposizione i 2 filesystem, puoi usare vari strumenti di confronto.

diff --brief -Nr /tree1 /tree2

Ti darà un bel elenco di file che differiscono su stdoute un elenco di file che non si trovano in un albero o nell'altro stderr.

Per scoprire quali modifiche effettive sono state apportate, è possibile analizzare l' stdoutoutput dei file che differiscono ed eseguirli diffsingolarmente su di essi, reindirizzando l'output su un file. Oppure potresti semplicemente esaminare l'elenco ed eseguire diff sui file che ti interessano particolarmente.

Puoi combinare tutto questo in un solo comando, usando git. Può essere utilizzato senza inizializzare un repository, basta puntare su 2 directory qualsiasi. Fornisce un risultato colorato piacevole, impaginato con meno.

git diff --no-index /tree1 /tree2

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.