Backup incremental no estilo Git com rsync

3

Estou tentando configurar um script de backup no Ubuntu. Todos os dias, desejo copiar meu diretório de origem local para um diretório de backup em um servidor remoto com o nome exclusivo da data. (por exemplo, backup-jan1 /, backup-jan2 /, etc) Ele deve armazenar um espelho do estado mais antigo e usar arquivos de diferença para recriar os novos pontos de backup.

Isso é bem simples com o rsync. Eu já configurei um script que fará o backup, nomeie o diretório de backup com o dia atual e faça um symlink para o backup mais recente (o IP foi editado):

date='date "+%m%d"'
rsync -ave ssh /srv [email protected]:/backup/backup-$date/
ssh [email protected] rm -rf /backup/current
ssh [email protected] ln -s backup-$date/ /backup/current

No entanto, aqui está a parte complicada: não quero copiar arquivos que não foram alterados. Portanto, se algum arquivo tiver sido alterado desde o último backup diário, ele será copiado, como normal . Caso contrário, irá fazer uma ligação simbólica dos arquivos previamente salvos do seu primeiro diretório de backup para o novo backup. (Tipo de como git)

Assim, por exemplo, digamos que eu inicie o backup 01 de janeiro. O diretório backup-jan1 / conterá todos os arquivos de backup originais. No dia seguinte, o backup de 2 de janeiro deve copiar apenas os arquivos alterados nessas 24 horas. Para todos os outros arquivos, ele criará links simbólicos dos arquivos de backup do dia 1 de janeiro. Em 3 de janeiro, adicionei um arquivo e deletei outro. Se um arquivo for removido, ele não deve continuar com o link simbólico.

Exemplo de estrutura de diretório / arquivo:

backup-jan1/ (initial backup)
    file_a
    file_b

backup-jan2/ (no changes)
    file_a (symlink to ../backup-jan1/file_a)
    file_b (symlink to ../backup-jan1/file_b)

backup-jan3/ (removed file_a symlink and added file_c)
    file_b (symlink to ../backup-jan1/file_b)
    file_c

...

Eu tentei procurar por essa funcionalidade de tipo de controle de versão no rsync e rsnapshot , mas ainda não a encontrei . Alguém pode sugerir uma estratégia de backup como essa?

    
por mr_schlomo 15.01.2012 / 00:23

2 respostas

3

O que parece estar procurando é a funcionalidade --link-dest que faz parte do rsync. O que você parece descrever é exatamente como dirvish opera.

A opção link-dest cria links físicos do caminho de destino para outra cópia da estrutura.

Com o dirvish, você executa um backup inicial, que apenas usa o rsync.

Depois disso, cada volta adicional é vinculada ao backup anterior bem-sucedido. Significado não há duplicação de arquivos. Você pode acessar diretamente qualquer backup único de dentro do cofre, e cada backup é um backup completo e completo. Você pode remover backups anteriores a qualquer momento.

Aqui está um script que você pode usar para demonstrar.

# create test area
mkdir -p /tmp/backuptest/{source,dest1,dest2,dest3}
for a in 'seq 10' ; do dd if=/dev/urandom of=/tmp/backuptest/source/file$a bs=1M count=1; done

# look
find /tmp/backuptest/ -ls ; du find /tmp/backuptest/

# initial backup
rsync -va /tmp/backuptest/source/ /tmp/backuptest/dest1/

# look
find /tmp/backuptest/ -ls ; du find /tmp/backuptest/

# make chagnes
rm /tmp/backuptest/source/file[2-4]
cat /tmp/backuptest/source/file[6-7] >/tmp/backuptest/source/file11

# new backup linked to previous
rsync -va /tmp/backuptest/source/ /tmp/backuptest/dest2/ --link-dest=/tmp/backuptest/dest1/

# look
find /tmp/backuptest/ -ls ; du find /tmp/backuptest/

# make changes
rm /tmp/backuptest/source/file5
cat /tmp/backuptest/source/file[5-7] >/tmp/backuptest/source/file12

# new backup linked to previous
rsync -va /tmp/backuptest/source/ /tmp/backuptest/dest3/ --link-dest=/tmp/backuptest/dest2/

# look
find /tmp/backuptest/ -ls ; du find /tmp/backuptest/

# remove dest1
rm -r /tmp/backuptest/dest1/

# see your dest2, and dest3 are still complete backups for the state at those times.
find /tmp/backuptest/ -ls ; du find /tmp/backuptest/
    
por 15.01.2012 / 00:56
1

Você pode usar "cp" com a opção "-l" para copiar como links físicos. Se toda a sua origem e destino estiverem no mesmo sistema de arquivos, isso será muito rápido.

Assim, o seu diretório original é "backup-jan1" e o seu próximo é "backup-jan2". Neste caso, faça:

cp -al backup-jan1 backup-jan2

Em seguida, execute seu rsync no backup-jan2. Quando o rsync encontrar um arquivo alterado, ele será desvinculado do arquivo original no backup-jan1 e criará um novo arquivo (com o mesmo nome) no backup-jan2.

No dia seguinte, você fará:

cp -al backup-jan2 backup-jan3

com o seu rsync para backup-jan3. Mais uma vez, os novos arquivos no backup causarão o desligamento no backup-jan3, etc.

Nesse caso, se você tiver 3 arquivos em backup-jan1, com o arquivo1 permanecendo o mesmo nos três dias, o arquivo2 mudando apenas no jan2 e o arquivo3 alterado em cada dia, você terá o arquivo1 como o mesmo disco vinculado em todos os três diretórios, file2 como dois arquivos (um em backup-jan1 e um em backup-jan2 e backup-jan3 que são vinculados) e file3 como três arquivos em cada diretório.

    
por 15.01.2012 / 00:47