Difere sistemas Linux inteiros

8

Eu tenho um sistema Linux básico instalado. Desejo executar um script de terceiros muito grande e complexo que fará muitas alterações em várias partes de todo o sistema. Essas alterações incluirão a adição de novos arquivos, modificação de arquivos existentes e remoção de arquivos existentes. Quando o script estiver completo, terei um sistema modificado. As modificações serão amplas e substanciais.

Desejo algum tipo de relatório sobre todos os arquivos que foram adicionados, removidos ou modificados e uma análise linha por linha das modificações. Algo como a saída de uma ferramenta de comparação de arquivos seria ótimo.

Suponho que preciso fazer algum tipo de instantâneo antes de executar o script e um segundo instantâneo depois. Suponho que eu iria alimentar esses instantâneos em algum tipo de ferramenta diff ou semelhante a diff.

Alguém sabe quais ferramentas usar e como diferenciar um sistema inteiro?

Estou usando o Virtualbox, que possui um recurso de imagens diferenciadas , embora não saiba se posso adaptá-lo a esse objetivo. Além disso, eu preferiria uma solução mais genérica, se possível.


fonte
Imagens diferenciais (também conhecidas como instantâneos) não são o que você está procurando. Seu objetivo é produzir um diff binário o menor possível, e não um diff de texto detalhado.
Dmitry Grigoryev
@DmitryGrigoryev Essa é a impressão que tive do link. Obrigado por confirmar isso para mim.
De fato, o que você quer é bastante fácil, mas complicado de alcançar. Dados os recursos, eu instalaria dois sistemas exatamente iguais. Habilite a auditoria do sistema de arquivos no sistema que terá os arquivos modificados. Obtenha o relatório da auditoria para identificar o que foi adicionado / modfiry / delete. Em seguida, compare esses arquivos com o outro sistema instalado.
BitsOfNix
1
Você pode usar rsyncpara fazer uma captura instantânea e outra executar após as modificações para gerar um relatório de arquivos modificados. A parte diferente provavelmente seria mais difícil.
precisa saber é o seguinte

Respostas:

1

Eu acho que sua ideia não está longe de ser uma solução. Para descrever uma maneira possível: Estou usando rsnapshotpara backups. Ele cria uma estrutura de diretório (backup) de todos ou de um subconjunto de seus arquivos com pontos de entrada de (por exemplo) /backup/hourly.1/...e /backup/hourly.0/...onde cada ramificação carrega todos os dados, mas usando links (hard) para arquivos nos quais nenhuma alteração foi feita. . Fazer uma recursiva lsou findem ambas as estruturas e comparar a saída (classificada, no caso de encontrar) mostrará os arquivos ausentes e a inspeção da contagem de links ( ls -lseria a segunda coluna) mostrará novos arquivos (que têm uma contagem de links 1) Para obter detalhes das alterações nos arquivos, você pode (para os arquivos identificados) usardiffFerramentas. Como dito, este é um esboço, precisará de algum trabalho para ser implementado e pode ter peculiaridades não aparentes, portanto, leve essa proposta com um pouco de sal

Janis
fonte
0

Eu provavelmente faria isso usando o rsync, conforme sugerido em um dos comentários. O Rsync possui um modo de execução a seco e um recurso de soma de verificação que você pode usar para criar um relatório preciso do que foi alterado.

Além disso, talvez você possa escrever um script que faça uma diferença nos arquivos alterados, embora seja necessário evitar arquivos binários (não sei como).

Ou você pode adotar uma abordagem totalmente diferente. Use git. Portanto, no seu sistema 'base', execute um git init em / e, depois de executar a tarefa de terceiros, você poderá:

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

Usar o git lhe daria bastante flexibilidade. Dito isto, ele pode ter problemas com todo um sistema e pode ficar confuso sobre / proc etc.

John Hunt
fonte
0

Existe algo chamado libguestfs que você pode usar para executar o diff. Isso é o que eu usei no passado e acho que agora essa operação pode até ser incorporada para que você não precise usar o shell guestfish.

Outra opção é executar suas operações em um contêiner de docker e exportar e diferenciar as árvores de arquivos resultantes como arquivos tar.

Esteja ciente de que, se o script alterar as configurações do sistema, gravando em arquivos virtuais, essas alterações não serão exibidas na árvore de arquivos e você precisará de mais alguma coisa para capturar essas alterações. Um exemplo de algo assim são as regras do iptable. Você precisará de lógica personalizada para capturar essas alterações.

davidk01
fonte
Exceto se a regra é persistente, então ele deve ser armazenado em algum lugar para que ele possa ser re-run / re-ativado após rede surge, etc.
ivanivan
0

A página do Linux Cookbook mostra um find-grep pré e pós-modificação, seguido por um diff. É muito simples, pode ser um ponto de partida, mas seu problema pode ser melhor resolvido com as soluções mais sofisticadas mencionadas.

Parece que ele só pegaria adições e exclusões, não modificações ... felicidades, drl

drl
fonte
0

Todas essas respostas estão indo na direção certa e da mesma maneira. Pode também jogar meus 8 bits em ...

Instale o sistema base no virtualbox. Após a configuração inicial e sua base estiver pronta, inicialize o vm com outras mídias ao vivo. Em seguida, você pode fazer tar ou exportar o sistema de arquivos sem os diretórios voláteis, como /procestar envolvido.

Execute seu script massivo e repita o processo de exportação.

Agora você tem os 2 sistemas de arquivos disponíveis, você pode usar várias ferramentas de comparação.

diff --brief -Nr /tree1 /tree2

Fornecerá uma boa lista de arquivos que diferem stdoute uma lista de arquivos que não foram encontrados em uma árvore ou na outra stderr.

Para descobrir quais mudanças reais ocorreram, você pode analisar a stdoutsaída dos arquivos que diferem e executá diff-los regularmente individualmente, redirecionando a saída para um arquivo. Ou você pode apenas examinar a lista e executar o diff nos arquivos que mais lhe interessam.

Você pode combinar tudo isso em um comando, usando git. Pode ser usado sem ter um repositório inicializado, basta apontar para qualquer 2 diretórios. Dá uma saída colorida agradável, paginada através de menos.

git diff --no-index /tree1 /tree2

ivanivan
fonte