No Linux, o que é uma maneira mais rápida que 'find' ou 'diff -r' para ver se algo dentro de um diretório mudou?

7

Eu uso tar para criar um instantâneo de partes diferentes do sistema de arquivos em meus servidores e, em seguida, fazer o ftp desse instantâneo para um local externo para arquivamento.

Gostaria de iniciar apenas essa operação quando algo mudou. Alguns dos backups são executados em todas as pastas do sistema que são alteradas com pouca frequência (ou seja, quando um novo software é instalado ou as configurações são modificadas).

Sempre que uma alteração acontecer, quero um instantâneo completo. Eu poderia produzir uma lista de arquivos modificados com find , mas eu realmente só preciso saber se a duração dessa lista é 0 ou maior. Usar o find é muito lento para isso.

Estou ciente de que há backups incrementais e já estou usando o rsync em conjunto com o ZFS para isso em outras situações. No entanto, aqui o host de backup é um servidor FTP (não rsync), eu preciso de backups completos (porque o arquivo de backup é usado como uma imagem para restaurar ou clonar servidores) e eu quero saída compactada (assim o tar é útil). p>

Editar : Note que eu não estou procurando por backup incremental (eu tenho isso), mas sim por um jejum (que meio que descarta e assim por diante) e uma maneira fácil de decidir se um instantâneo completo seria idêntico ao último. Talvez meu fraseado não fosse tão bom. Eu editei o título agora.

    
por Hanno Fietz 02.07.2009 / 14:58

11 respostas

2

Versões recentes do GNU find têm a ação "-quit", que faz com que o find pare imediatamente de pesquisar:

— Action: -quit

Exit immediately (with return value zero if no errors have occurred). This is different to ‘-prune’ because ‘-prune’ only applies to the contents of pruned directories, whilt ‘-quit’ simply makes find stop immediately. No child processes will be left running, but no more files specified on the command line will be processed. For example, find /tmp/foo /tmp/bar -print -quit will print only ‘/tmp/foo’. Any command lines which have been built by ‘-exec ... +’ or ‘-execdir ... +’ are invoked before the program is exited.

Você pode usar uma expressão de localização para localizar arquivos que foram alterados e usar -quit para interromper assim que encontrar um. Isso deve ser mais rápido do que encontrar a continuação da verificação.

-quit foi adicionado no Utilitários de Arquivo V4.2.3

    
por 06.07.2009 / 19:40
4

O GNU tar tem uma opção --newer-mtime, que requer um argumento de data, que presumivelmente seria a última vez que você fez um backup. Dependendo de quanto trabalho você queria restaurar o sistema de arquivos, este poderia ser o último backup completo, caso em que você precisaria restaurar o despejo completo e o último dia, ou você poderia fazê-lo desde o último incremental, no qual caso, você precisa restaurar o despejo completo e cada despejo depois disso.

Essa opção depende do registro de data e hora da modificação no arquivo, portanto, se isso tiver sido explicitamente alterado, há uma chance de o backup não ocorrer.

    
por 02.07.2009 / 15:34
2

Você sempre pode enviar a saída encontrar para wc e obter uma contagem de números inteiros de arquivos alterados:

find . -ctime 1 | wc -l

Embora A resposta de David requer menos alterações no código:)

    
por 02.07.2009 / 15:36
2

Esta é uma ideia um pouco maluca, mas você pode jogar um pouco com md5sum e ls.

Essa idéia é apenas olhar para um md5sum de um arquivo, e esse arquivo é uma listagem de arquivos do diretório que você está assistindo. E enquanto nada mudar, o md5sum é o mesmo. Mas se um timestamp for atualizado, o md5sum irá mudar, e você sabe que precisa fazer um novo tar e enviá-lo para o seu servidor ftp.

Poderíamos começar com algo parecido com isto

ls -lR /path/to/dir/ | md5sum > file_list.txt.md5

Então, você precisaria adicionar uma comparação entre os md5 antigo e o atual ... etc etc

/ Johan

    
por 02.07.2009 / 15:37
2

O utilitário incron usa o inotify para executar comandos quando ocorrem eventos do sistema de arquivos. O arquivo de configuração é como um crontab, mas em vez de horários, você especifica caminhos e eventos.

O comando pode ser seu script de backup (caso em que o backup será iniciado quase imediatamente depois que os arquivos foram modificados), ou você poderá criar algum arquivo e fazer com que o script de backup verifique a existência desse arquivo e depois delete isso. Se o arquivo existir, um dos eventos ocorreu desde a última execução.

    
por 09.04.2012 / 15:18
1

O tar tem uma opção --diff que "encontrará diferenças entre o arquivo e o sistema de arquivos". Se você mantiver uma cópia local do arquivo que enviou, poderá compará-los com isso.

    
por 02.07.2009 / 15:08
1

Você também tem a opção minúscula -g -g, --listed-incremental F               criar / listar / extrair novo backup incremental no formato GNU

Eu nunca joguei com ele, mas você pode escrever algo, então teste primeiro sem ser crítico. ;) faça um backup completo

tar -zcvf /home/backup.tar.gz /backup_dir

então

  NOW=$(date +"%d-%m-%Y")
  i=$(date +"%Hh%Mm%Ss")
  FILE="i.$NOW-$i.tar.gz"

tar -g /home/backup.incremental.txt -zcvf /backup/$FILE /backup_dir
    
por 02.07.2009 / 15:47
1

Idéia radical: você pode fazer o sistema auditar os arquivos em questão para cada acesso.

Isso é muito detalhado em termos de registro, mas fornece datas com os dados em cada leitura / gravação. Sim, é semelhante em conceito ao log de auditoria do Windows NT. É provavelmente um exagero para a sua configuração, mas no interesse da perfeição, eu estou saindo desse conceito ...

Você pode configurar a auditoria usando este breve tutorial aqui .

Prós:

  • detecta praticamente tudo, incluindo um histórico de várias edições e alterações.
  • controle muito fino de grãos
  • pode auditar seletivamente por arquivo

Contras:

  • aumenta o spew log por um fator de 1 bazillion por cento se não for compactado corretamente nos diretórios que você está preocupado. Use-o judiciosamente.
  • Não audita alterações de dados, apenas quem fez o quê e quando

Você pode usar a ferramenta ausearch para localizar alterações em arquivos por nome de arquivo. Um script simples para iterar os diretórios (e subdiretórios?) Em uma base por arquivo permitiria que você emitisse alterações em um arquivo simples, fornecendo uma lista de arquivos que foram "tocados" nos critérios que você especificou. Você pode facilmente estender isso com outras opções de filtragem em ausearch por usuário (útil se você tiver uma conta de usuário para um serviço), por comando, etc.

    
por 02.07.2009 / 18:52
1

Você poderia instalar o git e analisar a saída de "git status" (ou talvez os códigos de saída?) dos diretórios em questão. O Git é muito rápido no que faz.

Apenas certifique-se de confirmar as alterações, para que chamadas sucessivas para "status do git" mostrem alterações.

Outra ideia seria usar o tripwire ou alguma ferramenta semelhante.

Uma abordagem de força bruta seria periodicamente tar os diretórios de qualquer maneira e comparar um MD5 do tar anterior. Se os diretórios são grandes, no entanto, isso não seria muito bem dimensionado.

    
por 02.07.2009 / 19:24
1

Parece que o que você realmente quer é acionar um processo de backup sempre que algo mudar em uma hierarquia de diretórios. inotify pode ajudar aqui.

    
por 06.07.2009 / 19:14
0

Troquei meu backup completamente para rsnapshot (perlscript, ele usa rsync e hardlinks, pode fazer backup de hosts remotos)

Toda noite o rsync copia apenas arquivos mais novos e - graças aos hardlinks - cada cópia de backup representa os dados completos.

O rsnapshot é super rápido e a restauração é fácil - experimente!

    
por 02.07.2009 / 18:08

Tags