Backup com rsnapshot somente se houver alterações

1

Eu uso rsnapshot para fazer backups regulares dos sistemas de arquivos dos meus sistemas para um servidor remoto.

(Para quem está familiarizado com rsync , mas menos acostumado a rsnapshot , aqui está uma breve introdução ao seu funcionamento. Um backup é uma cópia arquivo por arquivo de uma árvore do sistema de arquivos de origem, semelhante a cp -a O backup "atual" é sempre hourly.0 e o anterior é hourly.1 . Esses nomes são alternados sempre que um backup é iniciado. Nos capas rsnapshot usa rsync --link-dest para vincular arquivos inalterados em hourly.0 para as entradas correspondentes na árvore de backup anterior, hourly.1 .)

Se um backup falhar, o backup anterior será copiado (vinculado) usando cp -al para o backup atual, para que um backup sempre pareça ter sido feito.

O que eu gostaria de evitar é fazer um backup se não houver alterações desde o backup anterior. Isso pode incluir uma falha de backup ou simplesmente que o sistema de arquivos de origem não foi modificado desde o último backup. ("Fazer um backup" pode ser reformulado para "excluir um backup desnecessário" se você preferir).

Eu considerei procurar na árvore hourly.0 por arquivos que não têm hard-link em outro lugar, e se não houver nenhum, simplesmente exclua a árvore de backup. Isso não manipula um arquivo que está vinculado validamente em outro local dentro de seu backup e também não considera mudanças nos diretórios. Eu também considerei usar rsync --dry-run para comparar as duas árvores de backup e observar sua saída, mas isso parece um pouco feio.

Existe uma solução melhor?

    
por roaima 12.04.2016 / 12:37

2 respostas

2

Após o instantâneo, você pode usar rsnapshot diff , que chama rsnapshot-diff para observar as diferenças entre dois instantâneos. Apenas compara números de inode, portanto, é bastante eficiente.

Como alternativa, antes de cada backup, crie um arquivo fora da árvore de backup para anotar a hora, touch timestamp . Em seguida, antes de um novo backup, crie um novo registro de data e hora, touch timestamp.new , e teste se algum arquivo ou diretório possui um horário mais recente que o antigo registro de data e hora

find tree -newer timestamp

Se não, não faça o backup. Em qualquer caso, mv timestamp.new timestamp da próxima vez. Isso pressupõe que você não tenha aplicativos que manipulem os registros de data e hora do arquivo e do diretório.

    
por 12.04.2016 / 16:06
0

Eu também considerei isso como uma possibilidade, que é mais genérica do que as excelentes propostas que aceitei de meuh .

listfiles()
{
    (
        # List attributes of file tree, discarding inode number
        cd "$1" 2>/dev/null && find . -type f -ls | sed -r 's/^ *[1-9][0-9]*//' | sort
    )
}

listfiles hourly.1 >/tmp/list1
listfiles hourly.0 >/tmp/list0
cmp -s /tmp/list1 /tmp/list0 && echo "the same" || echo "different"

Isso também ignora as ACLs e os Atributos Estendidos associados a um arquivo, mas não listados com find -ls . No entanto, para meus propósitos, isso seria aceitável.

    
por 13.04.2016 / 13:54