RSYNC para o Windows O CIFS copia todos os diretórios na atualização (mas não no conteúdo antigo)

3

Eu montei um compartilhamento remoto do Windows (que será onde meus backups em fita serão arquivados).

Tenho 70 GB de dados que não mudam muito, por isso quero usar o RSYNC para espelhar os dados.

/usr/bin/rsync -rlptDv -e ssh --delete \
      --exclude "*Locks" --exclude "tmp" --bwlimit=0 \
      --modify-window=1 /cvs1/* localhost:/mnt/DUBBU01/Linux/Buzz/cvs1/

Agora isso funciona bem, pois nenhum arquivo está sendo atualizado. Para ser honesto, as permissões de pasta feitas significam uma droga, já que elas podem ser redefinidas se eu precisar restaurar do backup.

NO ENTANTO, cada pasta é copiada. Não o seu conteúdo, apenas as pastas. Existe uma maneira de excluir pastas contendo dados, mas não os dados em si?

O vasto número de opções no rsync está se mostrando uma dor para testar isso. E com cerca de um milhão de arquivos e algumas centenas de milhares de diretórios, a compilação ile pode levar algum tempo ...

    
por bomahony 02.11.2011 / 17:32

4 respostas

1

O que você deseja fazer deve ser possível com a opção --relative (ou -R ) e uma execução anterior de find para gerar uma lista de arquivos:

find /cvs1 -type f -not \( -name *Locks -o -name tmp \) -print0 > filelist
rsync -pR --modify-window=1 -0 \
      --files-from=filelist /mnt/DUBBU01/Linux/Buzz/

Aqui você cria uma lista de arquivos com terminação nula (somente arquivos, não diretórios) e alimenta isto para rsync como a fonte para sua operação, informando sobre a terminação nula com -0 . Isso é útil para evitar problemas com espaços, etc. em nomes de arquivos.

da página de manual do rsync:

   -R, --relative

Use caminhos relativos. Isso significa que os nomes de caminho completos especificados na linha de comando são enviados para o servidor, em vez de apenas as últimas partes dos nomes de arquivos. Isso é particularmente útil quando você deseja enviar vários diretórios diferentes ao mesmo tempo. Por exemplo, se você usou este comando:

rsync -av /foo/bar/baz.c remote:/tmp/

... isso criaria um arquivo chamado baz.c in /tmp/ na máquina remota. Se ao invés disso você usou

rsync -avR /foo/bar/baz.c remote:/tmp/

então um arquivo chamado /tmp/foo/bar/baz.c seria criado na máquina remota - o nome do caminho completo é preservado.

    
por 02.11.2011 / 18:07
1

Será que realmente importa considerar fazer algo com os diretórios todas as vezes? Eu notei esse comportamento com alguns dos nossos backups rsync de compartilhamentos CIFS, mas ignorei como o pior efeito que tem é que existem linhas extras nos arquivos de log que precisamos examinar se houver um problema para investigar. Ele não (no nosso caso) resulta em qualquer transferência de dados extra notável como nenhum dos arquivos são tocados a menos que eles próprios tenham sido modificados, e se as pastas remotas estão sendo postas em prática em tudo o mais que está acontecendo é uma configuração de propriedade / perms / datas que não causam carga IO significativa, portanto, demore muito tempo.

Editar: Como alternativa a apenas ignorá-los, você pode filtrá-los para fora da saída, passando-os por grep -v /$ , pois os diretórios no log têm separadores de caminho à direita e os arquivos não . Não é o ideal, mas removerá a saída excedente até encontrar uma solução melhor.

Além disso, olhando para os nossos logs mais recentes para verificar o comando grep, noto que não está incluído todos diretórios, apenas aqueles que tiveram conteúdo dentro deles mudam (e alguns que não, mas não muitos), no nosso caso. As duas diferenças entre as nossas opções de rsync e as que você está especificando é que não estamos preservando permissões (sem -p / --perms ) e estamos usando um --modify-window maior (10 segundos em vez de 1). Pode valer a pena tentar a opção --itemize-changes para ver se isso oferece uma pista de por que está querendo tocar em todos os diretórios.

    
por 02.11.2011 / 18:35
0

Eu tive o mesmo problema (as pastas eram listadas na saída quando eu estava executando rsync ). As alterações no itemize indicaram que as permissões estavam sendo atualizadas a cada vez, e eu eliminei o problema usando a opção --no-p (eu estava usando rsync -avz ). No seu caso, as permissões não são importantes, então espero que você possa simplesmente usar -rltDv em vez de -rlptDv .

    
por 07.03.2012 / 20:53
0

Eu acho que você quer a opção rsync '--prune-empty-dirs'

    
por 16.03.2017 / 14:15

Tags