O rsync é uma ferramenta de cópia e sincronização de arquivos e diretórios muito versátil e simples de utilizar. Com o rsync é possível copiar arquivos localmente (no mesmo sistema de arquivos), ou para um outro host na rede utilizando qualquer shell remoto, ou ainda por meio de um daemon remoto do rsync.
O rsync utiliza um algoritmo de transferência de dados que permite enviar apenas as diferenças entre os arquivos enviados e os existentes no destino, desta forma diminuindo a quantidade de dados enviados, e aumentando a performance da transferência. Por isso, é largamente utilizado como ferramenta de backup de dados, assim como comando de cópia normal do dia-a-dia.
O rsync também possui suporte à cópia de links, dispositivos, proprietários, grupos e permissões, além de não necessitar de privilégios de superusuário (root) para realizar seu trabalho.
Para que os dados sejam transferidos com segurança, o rsync assume que um servidor SSH esteja em execução ao menos em um dos hosts onde ocorrerá a transferência de arquivos.
Instalação do rsync
Caso o rsync não esteja instalado nos hosts, instale-o com os comandos a seguir:
Sistemas baseados em Red Hat:
# yum install rsync
Sistemas baseados em Debian:
# apt-get install rsync
Instalando a partir de código-fonte
Caso queria utilizar a versão mais recente do rsync (quando este tutorial foi criado, versão 3.1.2), baixe-a com o comando a seguir:
wget https://download.samba.org/pub/rsync/src/rsync-3.1.2.tar.gz
Após baixar o pacote, descompacte-o com:
tar -xvzf rsync-3.1.2.tar.gz
Entre no diretório criado:
cd rsync-1.2
Execute o script configure:
./configure
(caso o script configure retorne o erro “no acceptable cc found in $path“, instale o pacote build-essential com apt-get install build-essential, pois um compilador C adequado não foi encontrado no sistema).
Após executar o script configure, execute o comando make:
make
E então, execute make-install:
make-install
Sintaxe básica do rsync
O utilitário rsync pode ser utilizado de várias formas diferentes, como podemos ver nas sintaxes listada a seguir:
rsync [opções] origem destino (local) rsync [opções] origem usuário@host:destino (modo PUSH, via shell remoto) rsync [opções] usuário@host:origem destino (modo PULL, via shell remoto)
Opções do rsyn
-a
Modo archive (arquivamento). Copia os arquivos e diretórios recursivamente (como -r) e preserva links simbólicos, permissões de arquivos, propriedades de usuário e grupo (ownership) e timestamps.
-h
Números são representados em formato legível por humanos
-r
Copia dados recursivamente, sem preservar timestamps e permissões ao transferir os dados
-z
Comprimir os dados dos arquivos antes de enviá-los
–progress
Mostrar o progresso da cópia de arquivos ao transferir os dados
-e
Especificar o shell remoto a ser usado (rsh, ssh)
-c, –checksum
Calcula os checksums dos arquivos para verificar se eles são iguais ao transferi-los. Utilizada para verificar a integridade dos dados copiados.
–exclude
Permite especificar arquivos ou diretórios que não devem ser copiados para o destino
–include
Permite especificar arquivos ou diretórios que devem ser copiados para o destino
–delete
Exclui um arquivo ou diretório no destino caso ele não exista na origem
–max-size=TAMk|M|G
Permite especificar o tamanho TAM máximo dos arquivos transferidos. Por exemplo, –max-size=50k significa que somente serão copiados arquivos com no máximo 50kB.
–bwlimit=LIMITE
Permite especificar um LIMITE de largura de banda em kbps ao transferir dados de uma máquina para outra, de modo a não impactar a performance da rede.
-b, –backup
Não sobrescreve arquivos que já existam no destino da transferência, mas os renomeia adicionando um sufixo ~ aos seus nomes, antes de executar a transferência de novos arquivos.
-u, –update
Não sobrescreve nenhum arquivo no destino da transferência que possua uma data posterior (mais recente) à data do arquivo correspondente, na origem.
–remove-source-files
Exclui (apaga) os arquivos no diretório de origem após o término da transferência de dados.
-n
Modo “dry run” – executa uma tentativa de copiar dados sem realmente copiar qualquer arquivo.
-v
Modo verboso, que mostra detalhes sobre a transferência de arquivos.
Exemplos de uso do comando
1 – Copiar ou sincronizar arquivos em uma máquina localmente. Vamos copiar o arquivo de nome /etc/passwd para o diretório /Backup, comprimindo dados:
$ sudo rsync -zvh /etc/passwd /Backup/
Se o diretório de destino não existir, será criado pelo próprio rsync. A compressão de dados, na verdade, não é necessária quando copiamos arquivos dentro de um mesmo sistema de arquivos, por conta da performance da transferência dos dados.
2 – Copiar ou sincronizar um diretório na máquina local. Vamos copiar o diretório /home/fabio completo para o diretório /Backup/, preservando os atributos e permissões dos arquivos:
$ sudo rsync -avh /home/fabio /Backup/
Se for acrescentada uma barra ao diretório de origem (/home/fabio/), seu conteúdo será copiado para o destino sem no entanto criar o diretório de nome fabio.
Veja o resultado da cópia executando o comando tree:
$ tree /Backup
3 – Copiar ou sincronizar arquivos e diretórios para ou de um servidor na rede. Vamos copiar/sincronizar um diretório da máquina local, como o meu home (/home/fabio) para um servidor na rede, que possui um diretório /home/fabio/Backup e cujo IP é 192.168.1.104. O usuário no host remoto é fabio:
$ rsync -avz /home/fabio [email protected]:/home/fabio/Backup/
Note que será pedida a senha do usuário no servidor remoto, no caso o fabio.
Se você precisar efetuar o login remoto como usuário root, deve habilitar essa opção no arquivo de configuração do ssh no servidor, que é o /etc/ssh/sshd_config. Abra esse arquivo com seu editor de textos favorito, com privilégios de administrador, e altere a seguinte linha:
De: PermitRootLogin without-password Para: PermitRootLogin yes Salve e saia do arquivo, e então reinicie o serviço do ssh: # service ssh restart
Agora você poderá efetuar a cópia via rsync sobre ssh usando a conta de root. |
4 – Vamos fazer o contrário agora. Iremos copiar/sincronizar o diretório remoto /home/fabio/Backup no servidor 192.168.1.104 para a máquina local, no diretório /home/fabio/Documentos:
rsync -avzh [email protected]:/home/fabio/Backup /home/fabio/Documentos/
Também será pedida a senha do usuário remoto (fabio no exemplo).
5 – Vamos efetuar a cópia de todos os arquivos e diretórios cujos nomes comecem com a letra ‘h’ do diretório local /etc para o diretório remoto /home/fabio/Backup no servidor 192.168.1.108, excluindo (não copiando) todo os demais arquivos e diretórios de /etc/:
rsync -avz --include 'h*' --exclude '*' /etc/ [email protected]:~/Backup
–exclude ‘*’ indica que vamos excluir da cópia todos os arquivos e diretórios, exceto os indicados pelo parâmetro –include.
6 -Vamos fazer o backup do diretório /home/fabio/ para o diretório /home/fabio/Backup no servidor de rede, cujo IP é 192.168.1.104. Como esse backup já foi realizado anteriormente, se algum arquivo no diretório local tiver sido excluído, ao realizar a transferência dos arquivos tal arquivo também será excluído na pasta do servidor, automaticamente (sincronismo).
rsync -av --delete /home/fabio/ [email protected]:/home/fabio/Backup
7 -Idem anterior, porém copiando apenas os arquivos que tenham 10kB ou menos de tamanho. Não serão copiados diretórios, e vamos assumir que o diretório corrente é o diretório de origem dos arquivos.
rsync -hv --max-size='10K' ./* /home/fabio/meubackup
8 – Efetuar backup do diretório /etc local no diretório /home/fabio/Backup do srvidor remoto, mostrando o progresso da cópia dos arquivos:
rsync -avh --progress /etc/ [email protected]:/home/fabio/Backup
9 – Vamos copiar o conteúdo do diretório da rede /home/fabio/Backup para o diretório local /home/fabio/Documentos, apagando os arquivos na origem (remota) após a transferência dos dados:
rsync -avh --remove-source-files [email protected]:/home/fabio/Backup/ /home/fabio/Documentos/
10 – Vamos copiar de volta para o servidor o conteúdo do diretório local /home/fabio/Documentos, porém sem no entanto executar a transferência dos arquivos e diretórios pra valer. Usaremos a opção de dry run (-n) para que o rsync teste essa transferência e retorne o resultado que ocorreria se ela fosse realmente executada:
rsync -avhn /home/fabio/Documentos [email protected]:/home/fabio/Backup/
Omitindo a opção -n, a cópia dos arquivos será efetivada:
rsync -avh /home/fabio/Documentos [email protected]:/home/fabio/Backup/
Bônus: 11 – Verificando as diferenças entre origem e destino
Vamos executar novamente o sincronismo de arquivos e diretórios do diretório local para o remoto, como no exemplo #9, porém visualizando as diferenças existentes entre os arquivos na origem e no destino dos dados (opção -i):
rsync -avhi /home/fabio/Documentos [email protected]:/home/fabio/Backup/
Na saída serão mostrados diversos caracteres em uma coluna à esquerda dos nomes de arquivos e diretórios. O significado desses caracteres é o seguinte:
< indica que um arquivo está sendo transferido para o host remoto (enviado).
> indica que um arquivo está sendo transferido para o host local (recebido).
f indica que se trata de um arquivo.
d indica que se trata de um diretório
c indica que está ocorrendo a criação ou alteração de um item, como a criação de um diretório
s ocorreu alteração no tamanho.
h indica que se trata de um hard link para outro item
. indica que o item não será atualizado
L indica um symlink
D indica um dispositivo
S indica arquivo especial, como um socket nomeado ou um fifo.
t existe alteração no timestamp.
o proprietário alterado
g grupo alterado.
Existem muitas outras opções do comando rsync. Para conferi-las, acesse as páginas de manual ou ajuda do utilitário com man rsync ou rsync –help