rsync --delete não removendo todos os arquivos excluídos

2

Estou usando o rsync para fazer backup de vários sistemas, seja em discos rígidos externos ou pela rede para outra máquina. A idéia é manter uma réplica do sistema de arquivos original, com algumas coisas como / dev, / proc, / mnt e o que não é excluído, que é então capturado no destino (ou seja, com btrfs ou zfs). Para esse fim, eu uso um comando ao longo das linhas de

rsync -avP --delete --exclude /dev/* --exclude /proc/* --exclude /mnt/* etc. etc. / backup@fileserver:/mnt/array/backup/machine/

Qual funciona razoavelmente bem. No entanto, observei que o rsync não está excluindo de forma confiável as coisas no destino. Como resultado, existem muitos mais arquivos no destino que existem a qualquer momento na origem, em um caso o backup foi de 100 GB maior que a origem. Os arquivos restantes parecem ser versões antigas de vários softwares e bibliotecas. Por exemplo, na máquina original, / usr / include / qt / QtWidgets / contains

5.9.2
QAbstractButton
qabstractbutton.h
....

Mas no destino de backup, a mesma pasta contém:

5.6.0
5.6.1
5.7.0
5.7.1
5.8.0
5.9.0
5.9.1
5.9.2
QAbstractButton
qabstractbutton.h

O rsync parece estar copiando os novos arquivos muito bem, mas esquecendo de remover todos os antigos. A parte estranha é que alguns arquivos são de fato removidos (o rsync sempre informa a exclusão de muitos arquivos durante a sincronização), mas parece que muitos arquivos não são realmente excluídos. Como resultado, meus backups ocupam muito mais espaço do que deveriam, e não podem ser restaurados diretamente porque podem ocupar mais espaço do que a partição original devido a todos os arquivos extras, e coisas como flat- Os bancos de dados de pacotes de arquivos estão todos confusos, contendo muitas entradas duplicadas para pacotes de versões antigas.

Alguma idéia do que pode estar acontecendo aqui? Existe algum outro sinalizador que eu precise passar para o rsync para que ele realmente exclua tudo o que é suposto?

    
por alex.forencich 28.10.2017 / 03:25

1 resposta

4

Algumas sugestões de coisas para tentar vêm do conteúdo da página man (a seção sobre --delete ). Há muitas advertências e advertências. Você já considerou tudo isso?

  • Funciona apenas "para os diretórios que estão sendo sincronizados". Eu acho que isso significa que eles devem ter um diretório pai / ancestral sendo copiado.

  • Da mesma forma, não se aplica a nada que esteja sendo explicitamente excluído:

Files that are excluded from the transfer are also excluded from being deleted unless you use the --delete-excluded option or mark the rules as only matching on the sending side.

  • Se o lado de envio detectar algum erro de E / S, a exclusão de todos os arquivos no destino será desativada automaticamente. Substituir por --ignore-errors .

  • Experimente com --dry-run primeiro? Combine com --verbose e examine atentamente tudo o que está acontecendo com os diretórios de problemas.

    This option can be dangerous if used incorrectly! It is a very good idea to first try a run using the --dry-run option (-n) to see what files are going to be deleted.

Considere, portanto, --delete-excluded , --ignore-errors e / ou --dry-run / --verbose ... não necessariamente como uma "correção", mas pelo menos pode haver dados úteis a serem compilados.

Além disso, dê uma olhada no --delete-before flag. Isso deve fazer as exclusões do lado do recebimento antes da transferência real. Novamente, isso pode não consertar tudo, mas pode ser revelador. Seria interessante ver se isso ajuda a reduzir o uso do espaço em disco também.

    
por 28.10.2017 / 05:02

Tags