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.
rsync
para 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.Respostas:
Eu acho que sua ideia não está longe de ser uma solução. Para descrever uma maneira possível: Estou usando
rsnapshot
para 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 recursivals
oufind
em 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 -l
seria 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) usardiff
Ferramentas. 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 salfonte
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á:
Usar o git lhe daria bastante flexibilidade. Dito isto, ele pode ter problemas com todo um sistema e pode ficar confuso sobre / proc etc.
fonte
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.
fonte
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
fonte
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
/proc
estar 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
stdout
e uma lista de arquivos que não foram encontrados em uma árvore ou na outrastderr
.Para descobrir quais mudanças reais ocorreram, você pode analisar a
stdout
saí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
fonte