Faça backups incrementais do Linux

1

Eu quero fazer backups incrementais em uma máquina Linux, da seguinte maneira:

BACKUP1                BACKUP2
|                      |
|                      |
|--- file1             |--- file1 (symlink to file1 in backup1 because it hasn't changed)
|                      |
|                      |
|--- file2             |--- file2 (is copied again because it has changed)
|                      |
|                      |
|--- file3             |--- file 3 (same as file1, a symlink)

Existe alguma maneira simples de fazer isso? Eu estava usando este script:

#!/bin/sh

date='date "+%Y-%m-%dT%H:%M:%S"'
rsync -aP --link-dest=~/Backups/current ~/Documents ~/Backups/back-$date
rm -f ~/Backups/current
ln -s back-$date ~/Backups/current

Mas isso apenas copia tudo de novo. Obrigado: D

    
por pmerino 22.08.2011 / 19:27

3 respostas

3

Eu uso um script autodidático para ele usando o rsync e o cpio: link

Então, a primeira coisa que fiz foi criar uma estrutura de diretórios. Eu trabalho assim: criar um backup todos os dias, no sétimo dia (domingo), faço o último backup (domingo da semana anterior) e o coloco semanalmente. A cada 4 semanas eu mantenho um backup mensal.

Todos esses backups são incrementais e baseados em um backup completo.

minha estrutura de diretório é baseada em / mnt / backups e se parece com isso:

--- SERVER1
   |--- daily
        |  --- 0
        |  --- 1
        |  --- 2
        |  --- 3
        |  --- 4
        |  --- 5
        |  --- 6
    |--- weekly
        |--- 0
        |--- 1
        |--- 2
        |--- 3
    |--- monthly
        |  --- 0
        |  --- 1
        |  --- 10
        |  --- 2
        |  --- 3
        |  --- 4
        |  --- 5
        |  --- 6
        |  --- 7
        |  --- 8
        |  --- 9

Eu também uso um script para criar rapidamente essa estrutura: link

Todos os meus scripts estão localizados em / root / backup_tools. O script backup.sh é colocado no crontab para ser executado todos os dias. Eu tenho troca de chaves do meu servidor de backup para todos os meus servidores que eu preciso fazer backup. No meu diretório de ferramentas eu coloco meus arquivos de exclusão (pastas / arquivos que eu não quero fazer backup) neste formato:

rsync.exclude.server1

Esses arquivos contêm os diretórios não para backup:

/proc
/sys
/tmp

Eu também uso meu arquivo /.ssh/config para adicionar os hosts (por exemplo, server1.example.com é definido como server1 com ssh port xxxx e username foo). Isso torna muito mais fácil adicionar os servidores ao backup na primeira linha do script.

Host server1
        User root
        Port 31337
        Hostname server1.example.com

O script verificará a regra SERVERS="" e para cada servidor ali definido (espaço separado) iniciará um backup incremental (e excluirá todos os dirs nos arquivos de exclusão).

Ele usará o cpio para a rotação do dirs (o cpio permite uma cópia com link para o bloco real no disco, então o arquivo aparecerá duas vezes no seu disco rígido, e só usará espaço uma vez. Não é um link simbólico porque, quando você excluir o arquivo original, a duplicata ainda será legível)

Espero que isso tenha sido um pouco claro. O script bash não é perfeito, mas faz o seu trabalho. Eu uso para fazer backup de 4 servidores todas as noites. Eu tenho backups de um par de meses agora e eles não são grandes. É realmente economia de espaço.

    
por 22.08.2011 / 20:19
2

No seu exemplo, você menciona links simbólicos, no entanto o rsync lida em links físicos. Você menciona nos comentários que não tem certeza de quais links são, portanto, a versão do Reader's Digest é:

  • Um link simbólico é como um "atalho" no Windows - ele simplesmente diz "o arquivo que você quer está lá"
  • Um link físico não tem correlação direta com o Windows - pelo menos não no uso comum. Um link físico é literalmente outro "ponto de entrada" para o mesmo arquivo; parece que o sistema de arquivos é uma duplicata exata do arquivo vinculado, no entanto, no disco físico há apenas uma cópia do arquivo, não importa quantos links existam.

A opção '--link-dest' do rsync cria hard links para arquivos que não mudam. Isso torna um pouco confuso ao tentar determinar se o script está funcionando conforme o esperado, porque se você verificasse o tamanho de todos os arquivos no diretório de backup (por exemplo, usando du -sh [directory] ou verificando as propriedades na GUI), parece ser do mesmo tamanho que o diretório original, independentemente de quantos desses arquivos são realmente links físicos e, portanto, não ocupam espaço adicional.

Verifique o espaço no disco, usando df ou através das ferramentas da GUI que examinam o espaço em disco real. Em seguida, execute seu script de backup e verifique novamente - se nenhum arquivo for alterado, o uso do disco não deve ser alterado (bem, ok, um pouquinho - é preciso uma pequena quantidade de espaço para o próprio link físico); Se os arquivos foram alterados, o uso do disco aumentará apenas que arquivos foram alterados.

Em ambos os casos, a saída do rsync listará os arquivos que estão sendo verificados, quer estejam copiando-os ou não. Olhe para o final, para o valor "speed-up" - se for um número menor que 1, isso indica que você tem pelo menos alguns hard links, já que isso representa a diferença percentual das estimativas de rsync que seriam necessárias para copiar todos os arquivos.

    
por 22.08.2011 / 20:07
2

Você realmente quer fazer isso com hardlinks. A melhor ferramenta para fazer esses tipos de backups em máquinas Linux é rsnapshot . Ele faz exatamente o que você descreve e é bem simples de configurar.

    
por 26.08.2011 / 16:35