Sincronização de Arquivos Eficiente com Rsync: Um Guia Completo
O rsync é um utilitário de linha de comando, disponível gratuitamente, que possibilita a sincronização de arquivos tanto em âmbito local quanto remoto. Com ele, é possível realizar a transferência de arquivos e diretórios de forma ágil e eficaz.
Essa capacidade torna o rsync uma ferramenta indispensável para diversas finalidades, como migração de dados, criação de backups e espelhamento de informações. Webmasters e administradores de sistemas se beneficiam grandemente do rsync para automatizar tarefas rotineiras de transferência de dados.
Neste artigo, exploraremos o funcionamento do rsync, detalhando seu mecanismo de operação e apresentando exemplos práticos de seu uso.
Como o Rsync Opera?
O rsync é uma ferramenta de sincronização remota utilizada em sistemas operacionais baseados em Unix. Ele concede aos usuários a capacidade de transferir e sincronizar arquivos entre máquinas distintas, ou entre dois hosts, de maneira simples e eficaz.
Internamente, o rsync emprega o algoritmo de “transferência delta”. Este algoritmo se encarrega de copiar apenas as diferenças entre os arquivos existentes em dois hosts (origem e destino). Tanto a origem quanto o destino podem ser locais ou remotos. O comando rsync pode executar tarefas de cópia e sincronização de dados de duas formas:
- Utilizando ssh ou rsh para a cópia e sincronização entre dois hosts.
- Utilizando o daemon TCP rsync para realizar a cópia e sincronização.
Por ter sido concebido para operar em sistemas Unix-like, o rsync é totalmente compatível com o sistema operacional Linux.
O processo de funcionamento do rsync é executado da seguinte maneira:
- O rsync se conecta ao host remoto por meio de SSH, solicitando a senha de acesso.
- Uma vez conectado, o rsync do host remoto estabelece comunicação com a origem dos dados.
- Os programas envolvidos identificam os arquivos e diretórios que precisam ser sincronizados, utilizando um algoritmo de transferência delta para detectar as diferenças.
Se o rsync identificar um arquivo no remoto que não esteja presente no host local, ele copiará esse arquivo para o sistema host. De forma similar, para arquivos que já existem em ambos os sistemas, ele copiará apenas as partes modificadas, ignorando arquivos idênticos em ambos os locais. O rsync armazena as diferenças em um arquivo temporário antes de enviá-lo ao destino, permitindo atualizações incrementais.
Antes de começar, você precisa:
- Possuir privilégios de root ou sudo.
- Ter acesso ao terminal ou linha de comando.
- Ter acesso SSH para a execução segura dos comandos rsync.
- Dispor de duas máquinas para realizar a sincronização.
Para fins de demonstração, utilizaremos o Linux Mint 21.1 Vera. No entanto, este guia pode ser seguido sem problemas em qualquer outra distribuição Linux.
Rsync vs. Scp: Por Que Escolher Rsync?
O scp (cópia segura) é um protocolo popular de linha de comando que possibilita a cópia de arquivos de um local para outro. Ele utiliza uma abordagem linear, ou seja, copia os arquivos da origem para o destino, utilizando o SSH para garantir a segurança da transferência.
A sintaxe básica do comando scp é a seguinte:
scp opção ORIGEM DESTINO
Surge, então, a pergunta: por que optar pelo rsync em vez do scp?
O rsync apresenta diversas vantagens em relação ao scp. Entre elas, destacam-se:
- Maior Velocidade: O rsync se destaca pela sua velocidade superior ao scp, devido à utilização de um protocolo de atualização remota. Este protocolo transfere apenas as diferenças entre os arquivos, em vez de todo o arquivo, como o scp. Assim, após uma primeira cópia completa, as sincronizações subsequentes se tornam muito mais rápidas.
- 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 emprega algoritmos de compressão/descompressão para reduzir ainda mais o tamanho dos arquivos durante a transferência.
- Mais Opções de Linha de Comando: O rsync oferece um conjunto maior de opções de linha de comando do que o scp, proporcionando maior flexibilidade e personalização da ferramenta.
Em suma, o rsync é uma ferramenta excepcional para sincronizações incrementais. O scp também é útil para transferir e sincronizar arquivos de forma segura, sendo adequado para tarefas mais simples do dia a dia. No entanto, para tarefas recorrentes, o rsync se mostra a opção mais eficiente.
Sintaxe do Comando Rsync
A sintaxe básica do comando rsync é a seguinte:
rsync [OPÇÃO] ORIGEM DESTINO
Onde:
OPÇÃO
– Parâmetros que modificam o comportamento do rsync.ORIGEM
– Diretório ou arquivo de origem.DESTINO
– Diretório ou arquivo de destino.USUÁRIO
– Nome de usuário remoto (para transferência remota).HOST
– Nome de host remoto ou endereço IP (para transferência remota).
As opções são parâmetros que expandem a funcionalidade do comando. Por exemplo, a opção -r permite sincronizar recursivamente os dados. No entanto, essa opção não sincroniza propriedades como grupos de usuários, timestamps, permissões ou links simbólicos. Para isso, usa-se a opção -a, que opera no modo de arquivo, preservando todas as propriedades e permissões durante a cópia.
Outras opções comuns do rsync incluem:
-z
: Comprime os dados para economizar espaço.-h
: Exibe a saída em formato legível para humanos.-b
: Realiza backups durante o processo de sincronização de dados.-e
: Utiliza o protocolo SSH para transferências remotas de dados.--progress
: Exibe o progresso da sincronização de dados.-v
: Solicita que o rsync exiba uma saída detalhada.--n
: Executa um teste para avaliar as configurações da sincronização.-q
: Suprime a saída e as opções do comando rsync.
Instalação do Rsync
A maioria dos sistemas Unix e Linux já vem com o rsync instalado. Caso ele não esteja presente em seu sistema, você pode instalá-lo utilizando os 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
No Linux Mint, o rsync já vem pré-instalado. Para verificar se ele está instalado, execute o comando rsync
no terminal. Ele exibirá informações sobre suas funcionalidades, opções e outras informações relevantes.
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.
A seguir, veremos exemplos práticos de uso do rsync em diferentes cenários.
Para fins didáticos, criaremos dois diretórios:
diretório-fonte
diretório de destino
Para isso, execute os seguintes comandos:
mkdir source-directory mkdir dest-directory
Também precisaremos de alguns arquivos para testar o rsync. Vamos criar alguns arquivos de teste utilizando o comando abaixo:
touch source-directory/file{1..100}
Isso cria 100 arquivos vazios no diretório de origem. Para confirmar, execute o comando abaixo:
ls source-directory
Output: 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
Embora o rsync seja frequentemente utilizado para a cópia de arquivos entre servidores locais e remotos, ele também é muito útil para a cópia de arquivos localmente.
Nesse caso, utilizaremos a seguinte sintaxe do rsync:
rsync opção ORIGEM DESTINO
Para copiar os arquivos de nosso diretório de origem para o diretório de destino, execute o seguinte comando:
rsync -r source-directory/ dest-directory
O comando acima copia 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
Como se pode observar, todos os arquivos do diretório de origem foram copiados para o diretório de destino.
Cópia de um Único Arquivo Localmente
Agora que aprendemos a sincronizar diretórios, aprenderemos a copiar um único arquivo.
Para isso, editaremos o arquivo vazio file1
no diretório source-directory
e o sincronizaremos com o mesmo arquivo existente no diretório dest-directory
.
Para editar um arquivo, execute o seguinte comando:
nano source-directory/file1
Copie e cole o texto a seguir 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.
Após adicionar o conteúdo, feche e salve o arquivo.
Vamos agora copiar o arquivo usando o rsync:
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 $
Note que utilizamos a opção --existing
. Essa opção garante a atualização dos arquivos existentes. Se você executar o comando sem essa opção, o arquivo não será atualizado, mesmo que o comando seja executado com sucesso.
Caso o arquivo que você está copiando não exista no diretório de destino, execute 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 Vários Arquivos
Para copiar vários arquivos, é necessário especificar os caminhos de origem de todos os arquivos, seguidos do diretório de destino.
Para isso, criaremos dois novos arquivos, newfile2
e newfile3
, no diretório source
. Execute o seguinte comando para criá-los:
touch source-directory/newfile{2..3}
Agora, utilize o seguinte comando para sincronizar 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 ou Diretórios do Local para o Remoto
A sintaxe do rsync para transferências do local para o remoto é a seguinte:
rsync option ORIGEM [email protected]:DEST
Para que a transferência funcione, é necessário conhecer o endereço IP da máquina remota e adicioná-lo após o arquivo de origem.
rsync -av /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory
Antes de iniciar a transferência, você deverá fornecer a senha de acesso. Além disso, caso o usuário seja diferente na máquina remota, é necessário especificá-lo antes do endereço IP, seguido por @.
rsync -av /Projects/rsync-tutorial/source-directory [email protected]: /Projects/rsync-tutorial/dest-directory
Para copiar vários arquivos ou diretórios, é necessário listar os arquivos ou os caminhos dos diretórios. A sintaxe para essa operação é:
rsync -av /Projects/rsync-tutorial/source-directory/newfile1 /Projects/rsync-tutorial/source-directory/newfile2 192.168.192.200: /Projects/rsync-tutorial/dest-directory
Protocolos Específicos para Transferências Remotas
O rsync permite que você especifique protocolos de transferência de arquivos específicos. Para isso, use a opção -e
, seguida do protocolo desejado.
Por exemplo, para utilizar 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 ou Diretórios do Remoto para o Local
A sintaxe do rsync para transferências do remoto para o local é a seguinte:
rsync option [email protected]:SRC DEST
Esse comando funciona como uma solicitação “pull”. Para obter os arquivos ou diretórios desejados de um servidor remoto para a sua máquina local, execute o seguinte comando:
rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
O comando acima extrai os arquivos do diretório de destino na máquina remota para o diretório de origem na máquina local.
De forma similar, você pode obter um arquivo específico mencionando o 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, você precisa especificar 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
De forma similar, você também pode especificar arquivos.
Exibir o Progresso em Tempo Real Durante a Transferência
É altamente recomendável acompanhar o progresso em tempo real durante backups de dados extensos. Para isso, utilize a opção --progress
. Ao adicioná-la ao comando rsync, você poderá monitorar a velocidade da transferência, o tempo restante e a quantidade de dados já transferidos.
rsync -av --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
Excluir Arquivos de Origem Após a Conclusão da Transferência
Você pode utilizar a opção --remove-source-files
para remover os arquivos de origem após a transferência ser finalizada. Essa função é útil em diversas situações, principalmente quando se trata de proteger seus arquivos sem deixar rastros ou simplesmente para liberar espaço.
rsync -av --remove-source-files 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
Teste do Rsync (Dry Run)
O rsync também permite que você realize uma avaliação prévia antes de efetuar a execução real do comando. Essa simulação possibilita verificar se você está fazendo a operação correta. Afinal, o objetivo é evitar a atualização de arquivos por engano ou, até mesmo, a exclusão deles.
Para realizar essa simulação, utilize a opção --dry-run
. Adicione-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 é semelhante à forma como executamos anteriormente. No entanto, observe que a menção (DRY RUN)
aparece no final da saída.
Definição do Tamanho Mínimo e Máximo de Arquivo
O rsync também permite que você especifique o tamanho mínimo ou máximo dos arquivos que serão transferidos.
Se você deseja transferir apenas arquivos com tamanho mínimo de 15KB, utilize a opção --min-size=15k
.
rsync -av --min-size=15k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
O comando acima copiará apenas arquivos com tamanho mínimo de 15 KB. Arquivos menores serão ignorados.
De forma similar, você pode usar a opção --max-size
para definir o tamanho máximo dos arquivos:
rsync -av --max-size=450k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
Neste caso, o rsync irá ignorar arquivos com tamanho superior a 450 KB.
Definição do Limite de Largura de Banda
Se você estiver executando outras tarefas que exigem muita largura de banda, pode configurar o rsync para limitar a largura de banda utilizada pela transferência. Para isso, utilize 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
Neste exemplo, definimos a largura de banda para 100 KB/s durante a transferência.
Considerações Finais
Chegamos ao final deste guia sobre o comando rsync. Aprendemos a utilizar essa ferramenta e exploramos diversos comandos de forma prática e eficiente.
O rsync oferece um vasto leque de recursos além dos que abordamos neste artigo. Para se aprofundar ainda mais, consulte a página de manual do rsync, onde todos os aspectos da ferramenta são explorados em detalhes.
Recomendamos também que você consulte outros guias de referência de linha de comando para Windows, Linux e macOS.