Sincronização Eficiente com Rsync: Um Guia Completo
O Rsync é uma ferramenta de linha de comando robusta e gratuita, projetada para a sincronização de arquivos tanto em nível local quanto remoto. Através dela, é possível transferir arquivos e diretórios de forma eficaz, tornando-a uma solução valiosa para diversas tarefas.
Sua capacidade de migrar dados, realizar backups e espelhamento a torna indispensável para administradores de sistemas e webmasters que lidam com transferências de dados recorrentes.
Este artigo detalhará o funcionamento do Rsync, apresentando exemplos práticos e úteis para o seu dia a dia.
Como o Rsync Opera?
O Rsync é um utilitário de sincronização remota, ideal para sistemas tipo Unix. Ele permite a transferência e sincronização de arquivos entre máquinas ou hosts sem dificuldades. A ferramenta emprega o algoritmo de transferência delta, que otimiza o processo de cópia ao focar nas diferenças entre os arquivos em dois locais (origem e destino). A origem e o destino podem ser locais ou remotos. As tarefas de cópia e sincronização são realizadas de duas maneiras:
- Utilizando SSH ou RSH para sincronização entre dois hosts.
- Empregando o daemon TCP Rsync para sincronização.
Por ter sido desenvolvido para sistemas Unix, o Rsync também opera perfeitamente em ambientes Linux.
O funcionamento do Rsync segue os seguintes passos:
- O Rsync se conecta ao host remoto via SSH e requer a senha do usuário.
- Após a conexão, o Rsync do host remoto se comunica com a fonte.
- Ambos os programas identificam os arquivos e diretórios que necessitam ser sincronizados, usando um algoritmo delta para analisar as diferenças entre os arquivos.
Se o comando Rsync encontrar um arquivo no host remoto que não exista no host local, ele o copiará. Se o arquivo já existir em ambos, apenas as partes alteradas (diferenças) serão copiadas. Arquivos idênticos em ambos os sistemas serão ignorados. O Rsync realiza atualizações incrementais, armazenando as diferenças em um arquivo temporário antes de transferi-lo ao destino.
Antes de começar, certifique-se de:
- Possuir privilégios de root ou sudo.
- Ter acesso ao terminal ou linha de comando.
- Dispor de acesso SSH para execução segura dos comandos Rsync.
- Ter duas máquinas para realizar o Rsync.
Neste guia, utilizaremos o Linux Mint 21.1 Vera, mas você pode adaptar o tutorial para qualquer outra distribuição Linux.
Rsync vs. Scp: Qual a Melhor Opção?
O Scp (Secure Copy) é um protocolo de linha de comando amplamente utilizado para a cópia de arquivos, seguindo uma abordagem linear de cópia direta da origem para o destino através do SSH.
A sintaxe do comando scp é:
scp [opções] ORIGEM DESTINO
Mas, por que preferir o Rsync ao Scp?
Existem diversas vantagens em usar o Rsync, incluindo:
- Velocidade de Execução: O Rsync é mais rápido que o Scp por utilizar um protocolo de atualização remota, que transfere apenas as diferenças entre os arquivos. Isso significa que, após uma primeira cópia completa, as cópias seguintes serão muito mais rápidas, pois apenas as partes modificadas serão transferidas.
- Menor Consumo de Largura de Banda: Como o Rsync não precisa copiar o arquivo inteiro repetidamente, o consumo de largura de banda é significativamente menor. Além disso, ele utiliza algoritmos de compressão/descompressão para reduzir o tamanho dos arquivos durante a transferência.
- Mais Opções de Linha de Comando: O Rsync oferece um leque maior de opções de linha de comando, permitindo ajustes mais finos em seu comportamento.
Em resumo, o Rsync é uma excelente ferramenta de sincronização incremental, enquanto o Scp é uma opção válida para transferências e sincronizações mais diretas. Em cenários do dia a dia, o Scp pode ser suficiente, mas o Rsync se destaca em tarefas recorrentes e otimização de transferência de dados.
Sintaxe do Comando Rsync
O formato básico do comando Rsync é:
rsync [opções] ORIGEM DESTINO
Onde:
- OPÇÃO: Define as opções do Rsync.
- ORIGEM: Especifica o diretório de origem.
- DESTINO: Determina o diretório de destino.
- USUÁRIO: Indica o nome de usuário remoto.
- HOST: É o nome do host remoto ou endereço IP.
As opções são parâmetros que adicionam funcionalidades ao comando. Por exemplo, a opção -r possibilita a sincronização recursiva de diretórios. Contudo, -r não sincroniza propriedades de grupos, usuários, carimbos de data/hora ou links simbólicos. Para isso, a opção -a executa o comando no modo de arquivo, preservando todas as propriedades e permissões.
Outras opções do Rsync incluem:
- -z: Compacta os dados para economizar espaço.
- -h: Apresenta resultados em formato legível.
- -b: Realiza backups durante a sincronização.
- -e: Utiliza o protocolo SSH para transferências remotas.
- –progress: Exibe o progresso da sincronização.
- -v: Aumenta a verbosidade da saída.
- –n: Executa um teste simulado da sincronização.
- -q: Suprime a saída e as opções do comando.
Instalação do Rsync
O Rsync geralmente já vem instalado em sistemas Unix e Linux. Se não estiver presente, você pode instalá-lo através dos seguintes comandos:
Para Debian/Ubuntu e Mint:
sudo apt-get install rsync
Para Arch Linux:
pacman -S rsync
Para Gentoo:
emerge sys-apps/rsync
Para CentOS/Fedora/REHL:
sudo yum install rsync
Para openSUSE:
sudo zypper install rsync
Como estamos utilizando o Linux Mint, o Rsync já está instalado. Para verificar sua instalação, execute o comando “rsync” no terminal. Ele exibirá informações sobre seus recursos, opções e outras funcionalidades.
nitt ~ $ rsync rsync version 3.2.3 protocol version 31 Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others. Web site: https://rsync.samba.org/ Capabilities: 64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints, socketpairs, hardlinks, hardlink-specials, symlinks, IPv6, atimes, batchfiles, inplace, append, ACLs, xattrs, optional protect-args, iconv, symtimes, prealloc, stop-at, no crtimes Optimizations: SIMD, no asm, openssl-crypto Checksum list: xxh128 xxh3 xxh64 (xxhash) md5 md4 none Compress list: zstd lz4 zlibx zlib none rsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. See the GNU General Public Licence for details. rsync is a file transfer program capable of efficient remote update via a fast differencing algorithm.
Agora, vamos explorar o Rsync em ação com diversos exemplos práticos.
Para este tutorial, criaremos dois diretórios:
- diretório-fonte
- diretório-destino
Para criá-los, utilize os seguintes comandos:
mkdir source-directory mkdir dest-directory
Além disso, vamos gerar arquivos para demonstrar o Rsync. Criaremos alguns arquivos de teste com o comando abaixo:
touch source-directory/file{1..100}
Isso criará 100 arquivos vazios dentro do diretório “source-directory”. Para confirmar, utilize o comando abaixo:
ls source-directory
Saída:
nitt rsync-tutorial $ ls dest-directory source-directory nitt rsync-tutorial $ touch source-directory/file{1..100} nitt rsync-tutorial $ ls source-directory file1 file18 file27 file36 file45 file54 file63 file72 file81 file90 file10 file19 file28 file37 file46 file55 file64 file73 file82 file91 file100 file2 file29 file38 file47 file56 file65 file74 file83 file92 file11 file20 file3 file39 file48 file57 file66 file75 file84 file93 file12 file21 file30 file4 file49 file58 file67 file76 file85 file94 file13 file22 file31 file40 file5 file59 file68 file77 file86 file95 file14 file23 file32 file41 file50 file6 file69 file78 file87 file96 file15 file24 file33 file42 file51 file60 file7 file79 file88 file97 file16 file25 file34 file43 file52 file61 file70 file8 file89 file98 file17 file26 file35 file44 file53 file62 file71 file80 file9 file99
Note que mantivemos o diretório “dest-directory” vazio.
Cópia Recursiva de Diretórios Localmente
Apesar do Rsync ser frequentemente utilizado para transferir arquivos entre servidores locais e remotos, ele também pode ser usado localmente para copiar arquivos e diretórios.
Nesse cenário, utilizaremos a seguinte sintaxe do Rsync:
rsync [opções] ORIGEM DESTINO
Para copiar os arquivos do diretório de origem para o diretório de destino, utilize o comando a seguir:
rsync -r source-directory/ dest-directory
Aqui, a opção “-r” instrui o comando a copiar recursivamente todos os arquivos do diretório de origem para o diretório de destino.
nitt rsync-tutorial $ ls dest-directory source-directory nitt rsync-tutorial $ ls dest-directory nitt rsync-tutorial $ ls source-directory file1 file18 file27 file36 file45 file54 file63 file72 file81 file90 file10 file19 file28 file37 file46 file55 file64 file73 file82 file91 file100 file2 file29 file38 file47 file56 file65 file74 file83 file92 file11 file20 file3 file39 file48 file57 file66 file75 file84 file93 file12 file21 file30 file4 file49 file58 file67 file76 file85 file94 file13 file22 file31 file40 file5 file59 file68 file77 file86 file95 file14 file23 file32 file41 file50 file6 file69 file78 file87 file96 file15 file24 file33 file42 file51 file60 file7 file79 file88 file97 file16 file25 file34 file43 file52 file61 file70 file8 file89 file98 file17 file26 file35 file44 file53 file62 file71 file80 file9 file99 nitt rsync-tutorial $ rsync -r source-directory/ dest-directory nitt rsync-tutorial $ ls dest-directory file1 file18 file27 file36 file45 file54 file63 file72 file81 file90 file10 file19 file28 file37 file46 file55 file64 file73 file82 file91 file100 file2 file29 file38 file47 file56 file65 file74 file83 file92 file11 file20 file3 file39 file48 file57 file66 file75 file84 file93 file12 file21 file30 file4 file49 file58 file67 file76 file85 file94 file13 file22 file31 file40 file5 file59 file68 file77 file86 file95 file14 file23 file32 file41 file50 file6 file69 file78 file87 file96 file15 file24 file33 file42 file51 file60 file7 file79 file88 file97 file16 file25 file34 file43 file52 file61 file70 file8 file89 file98 file17 file26 file35 file44 file53 file62 file71 file80 file9 file99
Isso copia todos os arquivos do diretório de origem para o diretório de destino.
Cópia de um Único Arquivo Localmente
Além da sincronização de diretórios, o Rsync permite copiar arquivos individuais. Para demonstrar isso, editaremos o arquivo vazio “file1” no diretório “source-directory” e o sincronizaremos com o mesmo arquivo presente no diretório “dest-directory”.
Para editar o arquivo, execute:
nano source-directory/file1
Copie e cole o seguinte texto no editor nano:
We're updating file1 in the source-directory. Once we update, we'll push the new update to the dest-directory. rsync doesn't need to re-copy the file using the delta-transfer algorithm. This algorithm checks the differences and then updates destination files accordingly. So, once you save file1 in the source-directory, open file1 in the dest-directory. It'll be empty. However, if we check it after running rsync, you'll see that file1 in dest-directory is updated.
Agora, salve e feche o arquivo.
Para copiar o arquivo utilizando o Rsync, utilize:
sudo rsync -v --existing source-directory/file1 dest-directory
#Output nitt rsync-tutorial $ sudo rsync -v --existing source-directory/file1 dest-directory file1 sent 557 bytes received 35 bytes 1,184.00 bytes/sec total size is 474 speedup is 0.80 nitt rsync-tutorial $
Observe que utilizamos a opção “–existing”, que atualiza apenas os arquivos já existentes. Se executar o comando sem esta opção, o arquivo não será atualizado, mesmo que o comando seja executado com sucesso.
Se o arquivo que você deseja copiar não existir no diretório de destino, utilize o seguinte comando:
rsync -v source-directory/newfile dest-directory
#Output nitt rsync-tutorial $ rsync -v source-directory/newfile dest-directory newfile sent 82 bytes received 35 bytes 234.00 bytes/sec total size is 0 speedup is 0.00
Cópia de Múltiplos Arquivos
Para copiar vários arquivos, especifique os caminhos de origem de cada arquivo, seguidos pelo diretório de destino.
Vamos criar dois novos arquivos: “newfile2” e “newfile3” no diretório “source-directory”. Use o seguinte comando:
touch source-directory/newfile{2..3}
Agora, use o seguinte comando para sincronizar os múltiplos arquivos:
rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory
#Output nitt rsync-tutorial $ rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory newfile2 newfile3 sent 135 bytes received 54 bytes 378.00 bytes/sec total size is 0 speedup is 0.00 nitt rsync-tutorial $
Cópia de Arquivos/Diretórios do Local para Remoto
A sintaxe do Rsync para transferência do local para o remoto é:
rsync [opções] ORIGEM [email protected]:DESTINO
Para que isso funcione, você precisa conhecer o endereço IP da máquina remota. Além disso, você deve adicionar o endereço IP após o arquivo de origem.
rsync -av /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory
Antes de começar a transferência, o sistema pedirá a senha. Digite-a para prosseguir. Se o usuário na máquina remota for diferente, especifique-o antes do endereço IP seguido por “@”.
rsync -av /Projects/rsync-tutorial/source-directory [email protected]: /Projects/rsync-tutorial/dest-directory
Para copiar múltiplos arquivos ou diretórios, liste os arquivos ou caminhos. A sintaxe é:
rsync -av /Projects/rsync-tutorial/source-directory/newfile1 /Projects/rsync-tutorial/source-directory/newfile2 192.168.192.200: /Projects/rsync-tutorial/dest-directory
Protocolos de Transferência Remota
O Rsync permite especificar protocolos de transferência de arquivos. Utilize a opção “-e” seguida pelo protocolo.
Por exemplo, para usar o protocolo SSH, adicione “-e ssh” ao comando Rsync:
rsync -e ssh /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory
Cópia de Arquivos/Diretórios do Remoto para Local
A sintaxe do Rsync para transferências do remoto para o local é:
rsync [opções] [email protected]:ORIGEM DESTINO
Este comando funciona como uma solicitação “pull”. Para obter arquivos de um servidor remoto, utilize:
rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
O comando extrai arquivos do diretório “dest-directory” na máquina remota para o diretório “source-directory” na máquina local.
Para obter um arquivo específico, especifique seu caminho completo:
rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory/newfile4 /Projects/rsync-tutorial/source-directory
Para copiar múltiplos arquivos ou diretórios do local para o remoto, especifique o caminho entre chaves (separados por vírgulas) após o endereço IP do servidor:
rsync -av 192.168.192.200: {/Projects/rsync-tutorial/dest-directory/, /home/music/2023-music} /Projects/rsync-tutorial/source-directory
Da mesma forma, você também pode mencionar arquivos.
Exibição do Progresso da Transferência em Tempo Real
Para monitorar o progresso de backups de dados maiores, utilize o sinalizador “–progress”. Ao anexá-lo ao comando Rsync, você acompanhará a velocidade da transferência, o tempo restante e a quantidade de dados transferidos.
rsync -av --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
Exclusão de Arquivos de Origem Após a Transferência
Você pode usar o sinalizador “–remove-source-files” para excluir os arquivos de origem após a conclusão da transferência, o que pode ser útil em diversos cenários, como proteger arquivos ou liberar espaço.
rsync -av --remove-source-files 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
Execução de Teste do Rsync
O Rsync oferece a possibilidade de realizar um teste simulado antes da execução real, permitindo que você verifique se tudo está configurado corretamente. Isso evita atualizações ou exclusões acidentais de arquivos.
Para executar um teste simulado, use a opção “–dry-run”, adicionando-a ao comando, seguida pela origem e pelo destino.
sudo rsync -v --dry-run source-directory/file1 dest-directory
nitt rsync-tutorial $ sudo rsync -v --dry-run source-directory/file1 dest-directory file1 sent 43 bytes received 19 bytes 124.00 bytes/sec total size is 474 speedup is 7.65 (DRY RUN) nitt rsync-tutorial
A saída será semelhante à execução normal, mas com a menção “(DRY RUN)” ao final.
Definição do Tamanho Mínimo e Máximo do Arquivo
O Rsync possibilita definir um tamanho mínimo ou máximo de arquivo durante a transferência.
Para transferir arquivos com um tamanho mínimo de 15KB, use “–min-size=15k”:
rsync -av --min-size=15k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
Apenas arquivos com tamanho mínimo de 15KB serão copiados. Arquivos menores serão ignorados.
Para definir o tamanho máximo, utilize o sinalizador “–max-size”:
rsync -av --max-size=450k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
O Rsync irá ignorar arquivos com tamanho acima de 450KB.
Definição do Limite de Largura de Banda
Se estiver executando outras tarefas que consomem largura de banda, você pode definir um limite para a transferência do Rsync, utilizando a opção “–bwlimit=KB/s”:
rsync -av --bwlimit=100 --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
Aqui, a largura de banda foi limitada a 100Kb/s durante a transferência.
Considerações Finais
Este guia abrangente sobre o comando Rsync demonstrou seu funcionamento e explorou diversos casos de uso. O Rsync oferece muito mais funcionalidades do que as apresentadas aqui. Consulte a página de manual do Rsync para obter informações detalhadas.
Além disso, confira também as folhas de dicas da linha de comando para Windows, Linux e macOS, caso precise.