Diferenciar sistemas enteros de Linux


8

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 incluirán agregar nuevos archivos, modificar archivos existentes y eliminar archivos existentes. Una vez que el script esté completo, tendré un sistema modificado. Las modificaciones serán amplias y sustanciales.

Quiero algún tipo de informe sobre todos los archivos que se han agregado, eliminado o modificado y un análisis línea por línea de las modificaciones. Algo así como la salida de una herramienta de diferencia de archivos 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 alimentaría esas instantáneas en algún tipo de herramienta diff o diff-like.

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

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


Las imágenes de diferencia (también conocidas como instantáneas) no son lo que estás buscando. Su objetivo es producir una diferencia binaria lo más pequeña posible, no una diferencia de texto detallado.
Dmitry Grigoryev

@DmitryGrigoryev Esa es la impresión que obtuve del enlace. Gracias por confirmar esto por mí.

De hecho, lo que quieres es bastante fácil pero complicado de lograr. Dados los recursos, instalaría dos sistemas exactamente iguales. Habilite la auditoría del sistema de archivos en el sistema que tendrá los archivos modificados. Obtenga el informe de la auditoría para identificar lo que se agregó / modfiry / delete. Luego compare estos archivos con el otro sistema instalado.
BitsOfNix

1
Puede usar rsyncpara hacer una instantánea y otra ejecución después de las modificaciones para generar un informe de archivos modificados. La parte diferente probablemente sería más difícil.
FloHelf

Respuestas:


1

Creo que tu idea no está lejos de ser una solución. Para resumir una posible forma: estoy usando rsnapshotpara copias de seguridad. Crea una estructura de directorio (copia de seguridad) de todos o de un subconjunto de sus archivos con puntos de entrada de (p. Ej.) /backup/hourly.1/...Y /backup/hourly.0/..., donde cada rama transporta todos los datos, pero usando enlaces (duros) para archivos donde no se han realizado cambios . Hacer un recursivo lso finden ambas estructuras y comparar la salida (ordenada, en caso de encontrar) mostrará los archivos que faltan, e inspeccionar el recuento de enlaces (en ls -lella sería la segunda columna) mostrará nuevos archivos (que tienen un recuento de enlaces 1) Para obtener detalles de los cambios en los archivos, puede (para los archivos identificados) usardiffherramientas. Como se dijo, este es un resumen, necesitará un poco de trabajo para implementarlo y puede tener peculiaridades no aparentes, así que tome esa propuesta con un grano de sal.


0

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

Yendo más lejos, tal vez podría escribir un script que realice una diferencia en los archivos modificados, aunque tendría que evitar los archivos binarios (no estoy seguro de cómo hacerlo).

O bien, podría adoptar un enfoque totalmente diferente ... use git. Entonces, en su sistema 'base', realice un git init en /, luego, después de ejecutar lo de terceros, simplemente puede hacer:

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

usar git te daría bastante flexibilidad. Habiendo dicho eso, puede tener dificultades en todo un sistema y podría confundirse acerca de / proc, etc.


0

Hay algo llamado libguestfs que puede usar para realizar la diferencia. Eso es lo que he usado en el pasado y creo que ahora esa operación podría incluso 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 diferenciar los árboles de archivos resultantes como archivos tar.

Sin embargo, tenga en cuenta que si el script cambia la configuración del sistema al escribir en archivos virtuales, esos cambios no se mostrarán en el árbol de archivos y necesita 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.


Excepto si la regla es persistente, entonces debe ser almacenado en algún lugar para que pueda ser re-run / vuelve a habilitar después de la red aparece, etc.
ivanivan

0

La página en The Linux Cookbook muestra un find-grep previo y posterior a 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 que se señalan.

Parece que solo capturaría adiciones y eliminaciones, no modificaciones ... saludos, drl


0

Todas estas respuestas van en la dirección correcta y de la misma manera. También podría tirar mis 8 bits en ...

Instalar el sistema base en virtualbox. Después de la configuración inicial y su base está lista, inicie el vm con otros medios en vivo. Luego puede bloquear o exportar el sistema de archivos sin los directorios volátiles como /procestar involucrado.

Ejecute su secuencia de comandos masiva y repita el proceso de exportación.

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

diff --brief -Nr /tree1 /tree2

Le dará una buena lista de archivos que difieren stdouty una lista de archivos que no se encuentran en un árbol u otro stderr.

Para averiguar qué cambios reales tuvieron lugar, puede analizar la stdoutsalida de archivos que difieren y ejecutarlos regularmente diffde forma individual, redirigiendo la salida a un archivo. O simplemente puede examinar la lista y ejecutar diff en los archivos que le interesan particularmente.

Puede combinar todo esto en un solo comando, utilizando git. Se puede usar sin tener un repositorio inicializado, solo apunte a cualquier 2 directorios. Da una salida de color agradable, paginado a través de menos.

git diff --no-index /tree1 /tree2

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.