Sincronização de dados com o rsync
O rsync é uma ferramenta versátil que simplifica a transferência de ficheiros através de ligações de rede e acelera a sincronização de diretórios locais. A sua grande flexibilidade torna esta ferramenta de sincronização numa excelente opção para uma grande variedade de operações com ficheiros.
O que é o rsync?
O rsync, abreviatura de «remote synchronisation» (sincronização remota), é uma ferramenta de sincronização flexível e compatível com redes no Linux. Este programa de código aberto pode ser utilizado para sincronizar ficheiros e pastas entre sistemas locais ou através de redes. A ferramenta utiliza uma técnica de transferência diferencial de dados, na qual apenas são transferidas as secções de dados que realmente foram alteradas. Isto minimiza a troca de dados e acelera consideravelmente o processo de sincronização. Graças a uma grande variedade de opções, o rsync permite controlar com precisão o comportamento da sincronização. A sintaxe flexível permite tanto cópias locais simples como sincronizações de rede complexas.
A sintaxe do rsync
A sintaxe dos comandos do rsync tem uma estrutura simples e é semelhante à do SSH, SCP e CP. A estrutura básica é a seguinte:
rsync [OPTION] source destinationbashO caminho de origem a partir do qual os dados serão sincronizados é introduzido no parâmetro source, enquanto o caminho de destino é introduzido no parâmetro destination. Para tal, o rsync oferece uma variedade de opções que permitem adaptar o processo de sincronização às necessidades específicas. As opções mais utilizadas são:
-a(Archive): mantém recursivamente as permissões dos ficheiros, os registos de data e hora, os grupos, os proprietários e as propriedades especiais dos ficheiros.-v(Verbose): mostra informações detalhadas sobre o processo de sincronização.-r(Recursivo): sincroniza os diretórios e o seu conteúdo de forma recursiva.-u(Update): transfere apenas os ficheiros mais recentes do que os que se encontram no diretório de destino.-z(Compress): reduz o tráfego de dados através da rede.-n–itemize-changes: apresenta uma lista das alterações a realizar.--delete: elimina ficheiros do diretório de destino que já não existem na origem.--exclude: exclui determinados ficheiros ou diretórios da sincronização.--dry-run: simula o processo de sincronização sem transferir os ficheiros.--progress: mostra o progresso da transferência de ficheiros.--partial: os ficheiros que foram parcialmente transferidos permanecem no diretório de destino se a transferência for interrompida. Quando a transferência é retomada, o ficheiro continua a partir do seu último estado.
Exemplo de sintaxe do rsync
A sintaxe do rsync pode ser facilmente compreendida com um exemplo. O comando seguinte cria o diretório dir1 com cem ficheiros de teste vazios e um segundo diretório vazio, dir2:
$ cd ~
$ mkdir dir1
$ mkdir dir2
$ touch dir1/file{1..100}bashO conteúdo de dir1 pode ser sincronizado no mesmo sistema com dir2 utilizando a opção -r:
$ rsync -r dir1/ dir2bashEm alternativa, pode utilizar-se a opção -a, que sincroniza recursivamente e inclui ligações simbólicas, ficheiros de dispositivos especiais, datas de modificação, grupos, proprietários e permissões:
$ rsync -a dir1/ dir2bashNota. A barra (/) no final do diretório de origem num comando rsync é importante porque indica que se deve sincronizar o conteúdo do diretório, e não o próprio diretório.
$ rsync -a dir1/ dir2
Output
sending incremental file list
./
file1
file10
file100
file11
file12
file13
file14
file15
file16
file17
file18
. . .bashSem a barra final no diretório de origem, o conteúdo do diretório de origem é copiado para o diretório de destino:
$ rsync -a dir1/ dir2
Output
sending incremental file list
dir1/
dir1/file1
dir1/file10
dir1/file100
dir1/file11
dir1/file12
dir1/file13
dir1/file14
dir1/file15
dir1/file16
dir1/file17
dir1/file18
. . .bashNa prática, portanto, faz sentido utilizar a barra no final do diretório de origem para garantir que o processo de sincronização decorra conforme o esperado e que o conteúdo do diretório de origem seja corretamente transferido para o diretório de destino.
rsync: sincronização com um sistema remoto
Sincronizar um sistema remoto com o rsync não costuma ser difícil, desde que se tenha acesso SSH ao computador remoto e se conheçam os dados de autenticação necessários. O rsync costuma utilizar o SSH (Secure Shell) para uma comunicação segura com sistemas remotos. A ferramenta também deve estar instalada em ambos os lados.
Se for verificado o acesso SSH entre os dois computadores, é possível sincronizar a pasta dir1 num computador remoto. Neste caso, será transferido o diretório real, pelo que se omite a barra final no comando seguinte:
$ rsync -a ~/dir1 username@remote_host:destination_directorybashQuando se transfere um diretório de um sistema local para um sistema remoto, fala-se de uma operação «push». Por outro lado, quando se sincroniza um diretório remoto com um sistema local, fala-se de uma operação «pull». A sintaxe é a seguinte:
$ rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machinebashUtilização de outras opções no rsync
O comportamento padrão do rsync pode ser ainda mais personalizado utilizando as opções apresentadas anteriormente.
Transferência de ficheiros não compactados com o rsync
A carga da rede ao transferir ficheiros não comprimidos pode ser reduzida da seguinte forma, utilizando a opção -z:
$ rsync -az source destinationbashVisualizar o progresso e retomar as transmissões interrompidas
Com -P, pode combinar as opções --progress e --partial. Isto dá-lhe uma visão geral do andamento das transferências e permite-lhe retomar as transferências interrompidas ao mesmo tempo:
$ rsync -azP source destination
Output
sending incremental file list
./
file1
0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=99/101)
file10
0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=98/101)
file100
0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=97/101)
file11
0 100% 0.00kB/s 0:00:00 (xfer#4, to-check=96/101)
. . .bashExecute o comando novamente para obter um resultado mais conciso. Isto permite ao rsync determinar se foram feitas alterações com base nos tempos de modificação.
$ rsync -azP source destination
Output
sending incremental file list
sent 818 bytes received 12 bytes 1660.00 bytes/sec
total size is 0 speedup is 0.00bashManter os diretórios sincronizados com o rsync
Para garantir que dois diretórios permaneçam realmente sincronizados, é necessário eliminar do diretório de destino os ficheiros que foram removidos do diretório de origem. Por predefinição, no entanto, o rsync não elimina nenhum ficheiro do diretório de destino. Este comportamento pode ser alterado com a opção --delete. No entanto, é aconselhável utilizar esta opção com precaução, uma vez que elimina do diretório de destino os ficheiros que já não existem no diretório de origem.
Antes de utilizar esta opção, deve utilizar a opção --dry-run. Isto permite-lhe simular o processo de sincronização sem apagar os ficheiros reais. Desta forma, garante que apenas são efetuadas as alterações pretendidas, sem perder acidentalmente dados importantes:
$ rsync -a --delete source destinationbashExcluir ficheiros e pastas da sincronização com o rsync
No rsync, pode utilizar a opção --exlude para excluir determinados ficheiros e diretórios da sincronização. Isto é útil se, por exemplo, ficheiros temporários, ficheiros de registo ou outros conteúdos não devessem ser sincronizados.
$ rsync -a --exclude=pattern_to_exclude source destinationbashSe tiver especificado um padrão para excluir ficheiros, pode substituir essa exclusão para os ficheiros que correspondam a um padrão diferente, utilizando a opção --include=.
$ rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destinationbashFazer cópias de segurança com o rsync
A opção --backup permite guardar cópias de segurança de ficheiros importantes. É utilizada em conjunto com a opção --backup-dir. Esta opção especifica o diretório onde os ficheiros de cópia de segurança serão guardados:
$ rsync -a --delete --backup --backup-dir=/path/to/backups /path/to/source destinationbashEncontrará uma descrição detalhada dos diferentes cenários de cópia de segurança no nosso artigo«Criar cópias de segurança do servidor com o rsync».