Introdução
Ao utilizar o rsync em partições NTFS ou FAT32, é necessário considerar particularidades desses sistemas de arquivos em relação aos utilizados em sistemas baseados em Unix. Em ambientes Unix, é comum utilizar a opção -a como parâmetro do comando rsync, o que equivale ao conjunto de opções -rlptgoD:
Os parâmetros mencionados possuem as seguintes funções:
- -r Copia subdiretórios recursivamente.
- -l Copia links simbólicos como links.
- -p Preserva permissões.
- -t Preserva datas de modificação (timestamps).
- -g Preserva o grupo.
- -o Preserva o proprietário.
- -D Transfere arquivos de dispositivos especiais e de blocos (ex.: sda, tty).
Para informações detalhadas sobre o uso do comando rsync no Linux, consulte:
Dos parâmetros listados, os sistemas de arquivos utilizados no Windows suportam plenamente apenas a cópia recursiva -r. NTFS e FAT32 não oferecem suporte às opções -p, -g, -o e -D. Embora as versões mais recentes do NTFS permitam o uso de links simbólicos, eles não são compatíveis com o estilo Unix, o que pode fazer com que a opção -l falhe.
Já a preservação das datas de modificação -t (timestamp) é suportada, porém, em alguns casos, podem ocorrer diferenças na precisão utilizada. O NTFS emprega uma precisão de 100 nanossegundos, enquanto, em sistemas baseados em Unix, essa precisão pode variar de 1 segundo a microssegundos.
Entre sistemas de arquivos Unix mais modernos, como ext4 e XFS, e o NTFS, não devem ocorrer problemas na checagem de timestamps. No entanto, quando se trata do FAT32, a discrepância se torna mais significativa. Isso pode levar o rsync a interpretar arquivos idênticos como diferentes devido à variação na data de modificação.
Existem opções para contornar essas limitações, conforme será demonstrado a seguir.
Ambiente
Os comandos utilizados neste artigo foram testados no Slackware Linux 15, com o kernel 5.15.161, e devem funcionar em qualquer sistema Linux ou baseado em Unix. O sistema de arquivos da raiz foi formatado com ext4, enquanto partições NTFS e FAT32 foram utilizadas em outros discos presentes no mesmo sistema.
Nos testes, as partições NTFS foram montadas tanto com o ntfs-3g, um driver em espaço de usuário amplamente utilizado há anos, quanto com o driver NTFS nativo do kernel, introduzido na versão 5.15. O comportamento do rsync foi o mesmo em ambos os casos.
Usando rsync com NTFS
Em versões mais recentes dos sistemas de arquivos utilizados no Linux e do NTFS, o rsync deve funcionar normalmente tanto entre partições Linux e NTFS quanto entre partições NTFS, mesmo ao utilizar o parâmetro -a, que inclui opções incompatíveis com NTFS, conforme discutido anteriormente.
Isso ocorre porque, ao montar uma partição NTFS, o Linux simula permissões de arquivo. Assim, os parâmetros não suportados são ignorados, e os arquivos recebem proprietário, grupo e permissões conforme definidos durante a montagem.
É essencial que as partições sejam montadas com permissões adequadas ao usuário que executará o comando rsync. Se a unidade for montada com propriedade do usuário root, mesmo que outros usuários tenham permissão de leitura e escrita, o rsync apresentará um erro ao tentar definir a data de modificação:
failed to set times on "/pasta/de/destino/": Operation not permitted (1)
Esse erro impedirá o rsync de verificar corretamente se os arquivos no destino são idênticos aos da origem, resultando na cópia redundante dos arquivos a cada execução do comando.
Para contornar esse erro, a partição deve ser montada com as permissões apropriadas. Um exemplo de configuração no arquivo /etc/fstab é:
/etc/fstab
/dev/sdXn /mnt/particao ntfs3 fmask=022,dmask=022,uid=1000,gid=100
Onde:
- uid=1000 Substitua 1000 pelo ID do usuário.
- gid=100 Substitua 100 pelo ID do grupo do usuário.
- fmask=022 Concede permissão total para o proprietário do arquivo e permissões de leitura e execução para grupo e outros usuários.
- dmask=022 Concede permissão total para o proprietário do diretório e permissões de leitura e execução para grupo e outros usuários.
Com as permissões adequadas, o rsync pode ser utilizado com as opções convencionais:
$ bash
rsync -av /origem/ /destino/
Após a primeira execução e a cópia dos arquivos para o destino, execute o comando novamente para verificar se os arquivos são copiados na segunda tentativa. Caso sejam, o rsync falhou ao comparar os timestamps. Se tudo estiver correto, na segunda execução, nenhum arquivo deve ser transferido.
Se o comando falhar devido a permissões ou ao uso de drivers mais antigos, pode-se executá-lo utilizando apenas os parâmetros compatíveis com NTFS:
$ bash
rsync -rtv /origem/ /destino/
Neste exemplo, o rsync é executado com as seguintes opções:
- -r Habilita o modo recursivo.
- -t Preserva a data de modificação (timestamp).
- -v Exibe detalhes da transferência (verbose).
Use o parâmetro --modify-window
O NTFS pode apresentar pequenas diferenças na precisão dos timestamps em comparação com sistemas baseados em Unix. Para contornar essa limitação, utilize o parâmetro --modify-window, que permite uma margem de erro ao comparar timestamps. Por exemplo:
$ bash
rsync -rtv --modify-window=1 /origem/ /destino/
Isso informa ao rsync para considerar timestamps iguais se a diferença entre eles for de até 1 segundo.
Usando rsync com FAT32
O FAT32 é limitado em termos de timestamps, com baixa precisão, não armazena a hora de acesso e apresenta problemas de fuso horário. Essas características tornam-no inadequado para cenários onde a precisão temporal é crucial, como em backups ou sincronização de arquivos.
Para executar o rsync com FAT32 preservando timestamps, use o comando:
$ bash
rsync -rtv --modify-window=1 /origem/ /destino/
A opção --modify-window=1 instrui o rsync a considerar timestamps iguais se a diferença entre eles for de até 1 segundo. Se o comando não funcionar com esse valor, tente usar 2 segundos. Sempre execute o comando novamente para verificar se os arquivos serão transferidos na segunda execução; eles serão copiados apenas se o rsync falhar ao verificar o timestamp.
Use o parâmetro --size-only
Se você não precisa preservar os timestamps e deseja evitar problemas relacionados à precisão, utilize a opção --size-only. Isso faz com que o rsync considere apenas o tamanho dos arquivos ao decidir se um arquivo deve ser copiado.
$ bash
rsync -rv --size-only /origem/ /destino/
Note que os parâmetros -t e --modify-window foram removidos do comando, pois são usados para lidar com timestamps e são incompatíveis com a opção --size-only, que desativa a verificação de timestamps.
Conclusão
Ao usar rsync com sistemas de arquivos NTFS ou FAT32, é crucial atentar-se às opções de montagem das partições, já que permissões e propriedades de arquivos são limitações desses sistemas. Parâmetros como --modify-window e --size-only ajudam a contornar problemas de precisão de timestamps e garantem uma sincronização mais eficiente.
Referências
O manual (man page) do rsync foi consultado na elaboração deste artigo.
- https://www.quora.com/What-are-some-rsync-hacks/answer/Raman-Kathpalia?share=68335132&srid=hfE13
- https://stackoverflow.com/questions/31229207/rsync-on-fat32-and-ntfs