Introdução
Muitos administradores de rede frequentemente investem em ferramentas comerciais robustas e de alto custo para realizar backups, sincronizações e espelhamentos de dados. No entanto, o rsync oferece essas mesmas funcionalidades de forma gratuita, com a vantagem de ser altamente customizável.
O rsync pode ser facilmente integrado a scripts, permitindo a automação de tarefas complexas e a criação de soluções personalizadas para atender às necessidades específicas de cada ambiente. Por exemplo, ele pode ser combinado com o cron para agendar backups automáticos, enviar notificações por e-mail ou gerar logs detalhados que facilitam o monitoramento das operações.
Principais características
O rsync (remote sync) é uma ferramenta de linha de comando amplamente utilizada para sincronizar arquivos e diretórios entre dois locais, seja no mesmo sistema ou através de uma rede.
Ele é conhecido pelas seguintes características:
- Eficiência
- Compara os arquivos de origem e destino, transferindo apenas as diferenças.
- Oferece compressão de dados durante a transferência.
- Segurança
- Utiliza SSH para transferências remotas.
- Preserva permissões, proprietários, grupos, timestamps e outros atributos dos arquivos.
- Permite simular operações sem realizar alterações reais.
- Flexibilidade
- Permite excluir arquivos no destino que não existem mais na origem.
- Oferece controle granular sobre a largura de banda utilizada durante a transferência.
- Suporta sincronização recursiva de diretórios, incluindo subdiretórios e arquivos.
- Versatilidade
- Pode ser usado para fazer backups, copiar arquivos, espelhar servidores, websites, para sincronização bidirecional e mais.
- É facilmente integrado a scripts, permitindo automação de tarefas complexas.
- Está disponível em diversas plataformas, incluindo Linux, BSD (FreeBSD, OpenBSD, NetBSD), Windows (via Cygwin ou WSL), macOS e Solaris.
- Confiabilidade
- Possui mecanismos de verificação de integridade dos dados transferidos, garantindo que os arquivos sejam copiados corretamente.
- Exibe relatórios detalhados, incluindo o número de arquivos transferidos e o tamanho total dos dados.
Sintaxe e uso básico
A sintaxe geral do rsync é:
rsync [opções] origem destino
1 - Exemplo para copiar diretórios locais:
rsync -av /origem/ /destino/
- -a (archive): Preserva a estrutura de diretórios, permissões, atributos, timestamps e habilita o modo recursivo.
- -v (verbose): Exibe detalhes da transferência, facilitando o acompanhamento das operações.
O rsync trata de forma diferente os diretórios de origem que contenham uma barra (/) no final. Se a barra estiver presente, o comando copia apenas o conteúdo da pasta de origem para o destino. Caso contrário, a própria pasta de origem será copiada para o destino.
Exemplo:
- rsync -av /origem/ /destino/: Copia apenas o conteúdo de /origem/ para /destino/.
- rsync -av /origem /destino/: Copia a pasta /origem (e seu conteúdo) para /destino/.
Se o diretório de destino não existir, o rsync o criará automaticamente durante a operação.
2 - Copiar arquivos:
Para copiar um arquivo preservando seu nome original:
rsync -av /origem/nome-do-arquivo.txt /destino/
Para renomear o arquivo, especifique o novo nome no caminho de destino:
rsync -av /origem/nome-do-arquivo.zip /destino/novo-nome.zip
Sincronizar com um computador remoto via SSH
Para sincronizar arquivos de um diretório local com um computador remoto via SSH:
rsync -avz /origem/ usuario@servidor:/destino/
- -z (compress): Comprime os dados durante a transferência.
Para copiar arquivos de um computador remoto para o sistema local, inverta a origem e o destino:
rsync -avz usuario@servidor:/caminho/remoto/ /caminho/local/
Se o servidor SSH estiver configurado para usar uma porta diferente da padrão (22), especifique a porta no comando utilizando a opção -e:
rsync -e "ssh -p porta-ssh" -avz /origem/ usuario@servidor:/destino/
Substitua porta-ssh pelo número da porta configurada no servidor.
Ignorar arquivos ou diretórios durante a cópia
Para não copiar arquivos temporários, use o comando:
rsync -av --exclude='*.tmp' /origem/ /destino/
- --exclude: Permite especificar padrões para omitir arquivos ou diretórios. Neste exemplo, nenhum arquivo com a extensão .tmp será incluído na cópia.
Para omitir um diretório específico durante a sincronização:
rsync -av --exclude='dir/' /origem/ /destino/
Este comando ignora o diretório dir/ (e todo o seu conteúdo) da cópia, mas inclui todos os outros arquivos e diretórios de /origem/.
Remover arquivos no destino que não existem na origem
Para manter uma cópia exata da origem no destino:
rsync -av --delete /origem/ /destino/
- --delete: Apaga arquivos no destino que não estão presentes na origem. Essa opção é útil para manter o destino como uma cópia exata da origem, eliminando arquivos que foram removidos ou renomeados na origem.
Simular a operação sem executá-la
Para testar um comando, use:
rsync -av --dry-run /origem/ /destino/
- --dry-run: Mostra o que seria feito, mas não executa nenhuma alteração. Essa opção é útil para testar comandos e verificar o impacto antes de aplicá-los.
Lista de parâmetros
A seguir, uma lista das opções para serem usadas no comando rsync e suas funções:
- a (archive): Equivalente a -rlptgoD. Habilita o modo recursivo, transfere dispositivos especiais e de blocos (ex.: sda, tty), preserva a estrutura de diretórios, permissões, atributos, links simbólicos e datas de modificação.
- --append: Continua uma transferência de onde parou, caso haja um arquivo parcialmente copiado no destino.
- --checksum: Verifica a integridade dos arquivos copiados. Aumenta significativamente o tempo de execução, pois calcula o checksum de todos os arquivos na origem e no destino. Útil ao continuar transferências interrompidas abruptamente.
- --delete: Remove arquivos no destino que não estão presentes na origem. Essa opção é útil para manter o destino como uma cópia exata da origem.
- --dry-run: Simula a operação, mostrando o que seria feito, mas sem executar nenhuma alteração. Ideal para testar comandos antes de aplicá-los.
- --exclude='PADRÃO': Ignora arquivos e pastas que correspondam a um padrão específico. Permite o uso de curingas, como * e ?.
- -e: Especifica o shell remoto a ser usado e permite incluir parâmetros adicionais. Exemplo: -e "ssh -p 22" para especificar uma porta SSH personalizada.
- -h: Exibe a saída em um formato legível por humanos. Em vez de mostrar os dados transferidos em bytes, exibe valores em KB, MB, GB, etc.
- -P (--partial --progress): Mostra uma barra de progresso e preserva, no destino, arquivos parcialmente transferidos. Para continuar uma transferência interrompida, combine com a opção --append.
- -q (quiet): Suprime mensagens, exibindo apenas erros durante a execução.
- -u (update): Não sobrescreve arquivos no destino se eles forem mais recentes que os da origem.
- -v (verbose): Exibe detalhes da transferência.
- -z (compress): Comprime os dados durante a transferência.
Exemplo prático
A seguir, será criada uma estrutura de diretórios e arquivos para demonstrar o funcionamento do rsync na prática. Será criada uma pasta chamada rsync/ no diretório home do usuário, e dentro serão criadas as subpastas origem/, onde serão armazenados diversos arquivos e subdiretórios, e destino/, inicialmente vazia, para onde os arquivos e pastas serão copiados a partir da origem.
O script abaixo cria a estrutura usada neste exemplo, permitindo que você execute os mesmos testes. Entre na home do usuário, cd /home/usuario/, crie um arquivo para o script: vi criar-estrutura-rsync.sh, e adicione o conteúdo:
criar-estrutura-rsync.sh
#!/bin/bash # Cria a estrutura de diretórios mkdir -p rsync/{origem,destino} mkdir -p rsync/origem/fotos/cache mkdir -p rsync/origem/documentos/backup # Entra no diretório "origem" cd rsync/origem/ # Cria arquivos de exemplo touch arquivo1.txt arquivo2.log arquivo3.tmp fotos/cache/cache_fotos.txt documentos/notas.txt # Cria arquivos binários de exemplo com tamanhos específicos dd if=/dev/zero of=fotos/foto1.jpg bs=512K count=1 dd if=/dev/zero of=fotos/foto2.png bs=512K count=3 dd if=/dev/zero of=documentos/relatorio.pdf bs=512K count=2 dd if=/dev/zero of=documentos/backup/backup_antigo.zip bs=512k count=4
O comando dd no script cria arquivos que ocupam espaço em disco para enriquecer os testes. Adicione permissão de execução ao script e execute-o para criar a estrutura que será utilizada nos exemplos:
$ bash
chmod +x criar-estrutura-rsync.sh ./criar-estrutura-rsync.sh
Após a execução do script, serão criados arquivos em vários formatos e organizados em diferentes pastas.
Estrutura de diretórios e arquivos criada
rsync/ ├── destino └── origem ├── arquivo1.txt ├── arquivo2.log ├── arquivo3.tmp ├── documentos │ ├── backup │ │ └── backup_antigo.zip │ ├── notas.txt │ └── relatorio.pdf └── fotos ├── cache │ └── cache_fotos.txt ├── foto1.jpg └── foto2.png
Os comandos seguintes serão executados na pasta rsync/ dentro da home do usuário. Acesse o diretório base, dentro dele será possível visualizar as pastas origem/ e destino/.
$ bash
cd /home/usuario/rsync
ls
destino origem
Para fazer uma cópia completa da pasta origem/ para destino/, use o comando:
$ bash
rsync -avh origem/ destino/
Repare que na saída do comando rsync são listados os arquivos e pastas transferidos, além de informações como os bytes enviados e recebidos, velocidade de transferência e tamanho total.
sent 5.24M bytes received 222 bytes 10.49M bytes/sec total size is 5.24M speedup is 1.00
Para exibir a estrutura de arquivos e diretórios nas pastas origem/ e destino/ em formato de árvore, use o comando tree:
$ bash
tree origem/ tree destino/
Repita o comando rsync -avh origem/ destino/ e repare que somente alguns bytes serão transferidos. Isso ocorre porque o rsync verifica se os arquivos no destino são idênticos aos da origem. Na segunda execução, nenhum arquivo será transferido, já que nenhuma alteração foi feita na origem desde a primeira sincronização.
Remova todos os arquivos na pasta destino/ para iniciar um novo teste. Em seguida, repita o comando rsync , agora usando a opção -z para ativar a compactação.
$ bash
rm -rf destino/* rsync -avhz origem/ destino/
Repare que, na saída, os dados transferidos foram compactados e que somente 954 bytes foram enviados, em vez dos 5.24MB do primeiro comando.
sent 954 bytes received 214 bytes 2.34K bytes/sec total size is 5.24M speedup is 4,488.77
Adicione algum texto ao arquivo arquivo2.log. Em seguida, repita o comando rsync e verifique que somente o arquivo arquivo2.log será copiado.
$ bash
echo "Nova entrada" >> origem/arquivo2.log rsync -avhz origem/ destino/
Apague o arquivo arquivo2.log na origem e execute o rsync com a opção --delete. Isso fará com que o arquivo seja excluído no destino, mantendo uma cópia exata da origem.
$ bash
rm origem/arquivo2.log rsync -avhz --delete origem/ destino/
Criando um script com rsync
Nos exemplos anteriores, é possível verificar o comportamento básico do rsync e já ter alguma inspiração para usá-lo no seu dia a dia. Por exemplo, você pode manter uma cópia exata de seu site hospedado na internet em um computador local.
Porém, imagine que existam arquivos ou pastas inteiras que você não deseja copiar. O script a seguir copia o conteúdo de origem/ para destino/, com exceção de arquivos com as extensões .tmp e .log, além da pasta cache/ e seu conteúdo. O script também usa a opção --delete para remover arquivos no destino que não existam na origem.
sincroniza.sh
#! /bin/bash rsync -avzh --delete origem/ \ --exclude "*.tmp" \ --exclude "*.log" \ --exclude "cache/" \ destino/
Crie o arquivo sincroniza.sh e adicione o conteúdo do script. Em seguida, conceda permissão de execução e execute-o a partir da pasta rsync/ em nosso exemplo para testar seu funcionamento:
chmod +x sincroniza.sh ./sincroniza.sh
Nos exemplos anteriores, o rsync está sendo usado para copiar dados localmente. Lembre-se: para cópias remotas, basta adicionar usuario@servidor: antes do caminho da pasta remota.
Arquivos grandes e conexões lentas
Se uma transferência for interrompida, o comportamento padrão do rsync é descartar o arquivo parcialmente copiado. Para evitar isso, utilize a opção -P. Essa opção preserva o arquivo parcialmente transferido no destino e exibe uma barra de progresso durante a operação.
rsync -avP origem/arquivo-grande.zip destino/
Ao usar o comando acima, se a conexão for interrompida, o arquivo parcialmente transferido permanecerá no destino. Para continuar a transferência de onde parou, utilize a opção --append. Se repetir o comando anterior sem esse parâmetro, a cópia começará do zero novamente.
Outra opção útil em cenários onde ocorrem falhas durante a transferência é --checksum. Essa opção compara os arquivos na origem e no destino para confirmar sua integridade. O mecanismo de checagem padrão do rsync consulta o tamanho do arquivo e a data da última modificação para determinar se o arquivo foi alterado, mas não verifica a integridade dos dados.
Para continuar a transferência interrompida do comando anterior, use:
rsync -avP --append --checksum origem/arquivo-grande.zip destino/
A opção --checksum não é obrigatória e aumentará significativamente o tempo de execução do script, dependendo do tamanho do arquivo a ser verificado.
Sincronização bidirecional
Imagine um cenário em que você precise manter duas cópias dos mesmos arquivos em dois locais distintos, como em casa e no trabalho. Durante a semana, você edita os arquivos no computador da empresa, enquanto à noite ou nos finais de semana, trabalha nos arquivos em casa.
O rsync substituirá os arquivos no destino se eles forem diferentes da origem, a menos que você utilize a opção -u. Essa opção instrui o rsync a não substituir arquivos no destino que sejam mais recentes do que na origem.
Embora essa abordagem resolva parte do problema, evitar a substituição de arquivos mais recentes no destino, o rsync é uma ferramenta de sincronização unidirecional. Ao executar rsync origem/ destino/, os arquivos no destino são atualizados com as versões mais recentes da origem, mas o inverso não ocorre automaticamente.
Para manter ambos os lados atualizados (origem e destino), você precisa executar o comando duas vezes, invertendo a origem e o destino:
$ bash
# Atualiza o diretório em CASA com arquivos alterados no TRABALHO rsync -avu usuario@trabalho:meus-arquivos/ /home/usuario/meus-arquivos/ # Atualiza o diretório no TRABALHO com arquivos alterados em CASA rsync -avu /home/usuario/meus-arquivos/ usuario@trabalho:meus-arquivos/
Conclusão
O rsync é uma ferramenta indispensável para administradores de sistemas e usuários que precisam gerenciar grandes volumes de dados de forma eficiente. Sua capacidade de sincronização incremental, aliada ao suporte a conexões seguras via SSH, faz dele uma escolha popular para backups, replicação de dados e manutenção de sistemas distribuídos.
Referências
- https://rsync.samba.org/
- https://download.samba.org/pub/rsync/rsync.1
- https://linuxize.com/post/how-to-use-rsync-for-local-and-remote-data-transfer-and-synchronization/