Diferentes sistemas Linux

Tengo un sistema Linux base instalado. Quiero ejecutar un script de terceros muy grande y complejo que hará muchos cambios en varias partes de todo el sistema. Estos cambios includeán agregar nuevos files, modificar los files existentes y eliminar los files existentes. Una vez que el guión esté completo, tendré un sistema modificado. Las modificaciones serán amplias y sustanciales.

Quiero algún tipo de informe sobre todos los files que se han agregado, eliminado o modificado y un análisis línea por línea de las modificaciones. Algo así como el resultado de una herramienta de file diff sería genial.

Supongo que necesito hacer algún tipo de instantánea antes de ejecutar el script y una segunda instantánea después. Supongo que luego alimentaría esas instantáneas con algún tipo de herramienta diff o diff-like.

¿Alguien sabe qué herramientas usar y cómo diferir un sistema completo?

Estoy usando Virtualbox que tiene una característica de diferenciación de imágenes , aunque no sé si puedo adaptarlo para este propósito. Además, preferiría una solución más genérica si es posible.

Creo que tu idea no está lejos de ser una solución. Para delinear una posible manera: estoy usando rsnapshot para copys de security. Crea una estructura de directory (copy de security) de todos o de un subset de sus files con puntos de input de (por ejemplo) /backup/hourly.1/... y /backup/hourly.0/... , donde cada twig lleva todos los datos, pero usa enlaces (hard) para files en los que no se han realizado cambios. Hacer un ls recursivo o find en ambas estructuras y comparar el resultado (orderado, en caso de encontrar) mostrará los files que faltan e inspeccionar el número de enlaces (en ls -l sería la segunda columna) mostrará nuevos files ( que tienen un conteo de enlaces 1). Para get detalles sobre los cambios en los files, puede (para los files identificados) usar las herramientas ordinarias de diff . Como dije, esto es un bosquejo, necesitará algo de trabajo para implementar y puede tener caprichos no aparentes, así que tome esa propuesta con un grano de sal

Probablemente haga esto usando rsync como se sugiere en uno de los comentarios. Rsync tiene un modo de ejecución en seco y una function de sum de comprobación que puede usar para crear un informe preciso de lo que ha cambiado.

Si lo llevamos más lejos, podrías escribir un script que realice una modificación en los files modificados, aunque tendrías que evitar los files binarys (no estoy seguro de cómo).

O bien, podrías tomar un enfoque totalmente diferente … usa git. Entonces, en su sistema 'base', ejecute un git init en /, luego de que haya ejecutado lo de terceros que podría hacer:

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

usar git te daría un poco de flexibilidad. Una vez dicho esto, puede tener problemas con un sistema completo y puede confundirse con / proc, etc.

Hay algo llamado libguestfs que puede usar para realizar el diff. Eso es lo que he usado en el pasado y ahora creo que la operación podría estar integrada para que no tenga que usar el shell de guestfish.

Otra opción es ejecutar sus operaciones en un contenedor acoplable y luego exportar y modificar los treees de files resultantes como files tar.

Tenga en count que si la secuencia de commands cambia la configuration del sistema escribiendo en files virtuales, esos cambios no aparecerán en el tree de files y necesitará algo más para capturar esos cambios. Un ejemplo de algo así son las reglas de iptable. Necesitará una lógica personalizada para capturar esos cambios.

La página de The Linux Cookbook muestra un find-grep antes y después de la modificación, seguido de un diff. Es muy simple, podría ser un punto de partida, pero su problema podría abordarse mejor con las soluciones más sofisticadas.

Esto parece que solo captará adiciones y eliminaciones, no modificaciones … aplausos, drl

Todas estas respuestas se dirigen en la dirección correcta y de la misma manera. También puedo arrojar mis 8 bits en …

Instala el sistema base en virtualbox. Después de la configuration inicial y su base está list, inicie vm con otros medios en vivo. A continuación, puede actualizar o exportar el sistema de files sin los directorys volátiles como /proc .

Ejecute su secuencia de commands masiva y repita el process de export.

Ahora que tiene los 2 filesystems disponibles, puede usar varias herramientas de comparación.

diff --brief -Nr /tree1 /tree2

Le dará una buena list de files que difieren en stdout , y una list de files que no se encuentran en un tree u otro en stderr .

Para saber qué cambios se produjeron, podría analizar el resultado stdout de los files que difieren y ejecutar una diff regular en ellos individualmente, networkingirigiendo la salida a un file. O simplemente podría examinar la list y ejecutar diff en los files que le interesan particularmente.

Puedes combinar todo esto en un solo command, usando git . Se puede usar sin tener un repo inicializado, simplemente apunte a cualquiera de los 2 directorys. Da una buena salida de color, paginado a través de less.

git diff --no-index /tree1 /tree2